From 364147b1af4c92f6a397812badae7eb059438ff8 Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Thu, 25 Apr 2013 12:39:16 -0700 Subject: [PATCH 001/155] Bug 865449 - Make AccessFu more desktop-browser friendly. r=yzen - Use Speech presenter on everything but mobile/android - Filter out accessibility events that are chrome related. - Don't capture key presses on desktop - Rework TouchAdapter to take mouse events on desktop. Generating touch events does not work on desktop since that interface is preffed out by default. We lost the ability to do multiple finger gestures with modifier keys, but that was not really used anyway. --- accessible/src/jsat/AccessFu.jsm | 10 ++- accessible/src/jsat/EventManager.jsm | 7 ++ accessible/src/jsat/Presentation.jsm | 6 +- accessible/src/jsat/TouchAdapter.jsm | 123 ++++++++------------------- 4 files changed, 54 insertions(+), 92 deletions(-) diff --git a/accessible/src/jsat/AccessFu.jsm b/accessible/src/jsat/AccessFu.jsm index 2eeb4faf950..fc1ec14f937 100644 --- a/accessible/src/jsat/AccessFu.jsm +++ b/accessible/src/jsat/AccessFu.jsm @@ -475,12 +475,18 @@ var Input = { editState: {}, start: function start() { - Utils.win.document.addEventListener('keypress', this, true); + // XXX: This is too disruptive on desktop for now. + // Might need to add special modifiers. + if (Utils.MozBuildApp != 'browser') { + Utils.win.document.addEventListener('keypress', this, true); + } Utils.win.addEventListener('mozAccessFuGesture', this, true); }, stop: function stop() { - Utils.win.document.removeEventListener('keypress', this, true); + if (Utils.MozBuildApp != 'browser') { + Utils.win.document.removeEventListener('keypress', this, true); + } Utils.win.removeEventListener('mozAccessFuGesture', this, true); }, diff --git a/accessible/src/jsat/EventManager.jsm b/accessible/src/jsat/EventManager.jsm index eea83bf6fb9..97501ecd899 100644 --- a/accessible/src/jsat/EventManager.jsm +++ b/accessible/src/jsat/EventManager.jsm @@ -105,6 +105,13 @@ this.EventManager = { Logger.debug('A11yEvent', Logger.eventToString(aEvent), Logger.accessibleToString(aEvent.accessible)); + // Don't bother with non-content events in firefox. + if (Utils.MozBuildApp == 'browser' && + aEvent.eventType != Ci.nsIAccessibleEvent.EVENT_VIRTUALCURSOR_CHANGED && + aEvent.accessibleDocument != Utils.CurrentContentDoc) { + return; + } + switch (aEvent.eventType) { case Ci.nsIAccessibleEvent.EVENT_VIRTUALCURSOR_CHANGED: { diff --git a/accessible/src/jsat/Presentation.jsm b/accessible/src/jsat/Presentation.jsm index 94702836c4d..f0875edebd3 100644 --- a/accessible/src/jsat/Presentation.jsm +++ b/accessible/src/jsat/Presentation.jsm @@ -361,11 +361,11 @@ this.Presentation = { delete this.presenters; this.presenters = [new VisualPresenter()]; - if (Utils.MozBuildApp == 'b2g') { + if (Utils.MozBuildApp == 'mobile/android') { + this.presenters.push(new AndroidPresenter()); + } else { this.presenters.push(new SpeechPresenter()); this.presenters.push(new HapticPresenter()); - } else if (Utils.MozBuildApp == 'mobile/android') { - this.presenters.push(new AndroidPresenter()); } return this.presenters; diff --git a/accessible/src/jsat/TouchAdapter.jsm b/accessible/src/jsat/TouchAdapter.jsm index 12996e8866c..72c1c3f87ba 100644 --- a/accessible/src/jsat/TouchAdapter.jsm +++ b/accessible/src/jsat/TouchAdapter.jsm @@ -39,8 +39,8 @@ this.TouchAdapter = { // maximum distance the mouse could move during a tap in inches TAP_MAX_RADIUS: 0.2, - // The virtual touch ID generated by an Android hover event. - HOVER_ID: 'hover', + // The virtual touch ID generated by a mouse event. + MOUSE_ID: 'mouse', start: function TouchAdapter_start() { Logger.info('TouchAdapter.start'); @@ -62,16 +62,10 @@ this.TouchAdapter = { target = this.glass; } - target.addEventListener('mousemove', this, true, true); - target.addEventListener('mouseenter', this, true, true); - target.addEventListener('mouseleave', this, true, true); + for each (let eventType in this.eventsOfInterest) { + target.addEventListener(eventType, this, true, true); + } - target.addEventListener('touchend', this, true, true); - target.addEventListener('touchmove', this, true, true); - target.addEventListener('touchstart', this, true, true); - - if (Utils.OS != 'Android') - Mouse2Touch.start(); }, stop: function TouchAdapter_stop() { @@ -84,19 +78,34 @@ this.TouchAdapter = { this.glass.parentNode.removeChild(this.glass); } - target.removeEventListener('mousemove', this, true, true); - target.removeEventListener('mouseenter', this, true, true); - target.removeEventListener('mouseleave', this, true, true); + for each (let eventType in this.eventsOfInterest) { + target.removeEventListener(eventType, this, true, true); + } + }, - target.removeEventListener('touchend', this, true, true); - target.removeEventListener('touchmove', this, true, true); - target.removeEventListener('touchstart', this, true, true); + get eventsOfInterest() { + delete this.eventsOfInterest; - if (Utils.OS != 'Android') - Mouse2Touch.stop(); + if ('ontouchstart' in Utils.win) { + this.eventsOfInterest = ['touchstart', 'touchmove', 'touchend']; + if (Utils.MozBuildApp == 'mobile/android') { + this.eventsOfInterest.push.apply( + this.eventsOfInterest, ['mouseenter', 'mousemove', 'mouseleave']); + } + } else { + this.eventsOfInterest = ['mousedown', 'mousemove', 'mouseup']; + } + + return this.eventsOfInterest; }, handleEvent: function TouchAdapter_handleEvent(aEvent) { + // Don't bother with chrome mouse events. + if (Utils.MozBuildApp == 'browser' && + aEvent.view.top instanceof Ci.nsIDOMChromeWindow) { + return; + } + if (this._delayedEvent) { Utils.win.clearTimeout(this._delayedEvent); delete this._delayedEvent; @@ -108,13 +117,14 @@ this.TouchAdapter = { // instead of milliseconds. let timeStamp = (Utils.OS == 'Android') ? aEvent.timeStamp : Date.now(); switch (aEvent.type) { + case 'mousedown': case 'mouseenter': case 'touchstart': for (var i = 0; i < changedTouches.length; i++) { let touch = changedTouches[i]; let touchPoint = new TouchPoint(touch, timeStamp, this._dpi); let identifier = (touch.identifier == undefined) ? - this.HOVER_ID : touch.identifier; + this.MOUSE_ID : touch.identifier; this._touchPoints[identifier] = touchPoint; this._lastExploreTime = timeStamp + this.SWIPE_MAX_DURATION; } @@ -128,7 +138,7 @@ this.TouchAdapter = { for (var i = 0; i < changedTouches.length; i++) { let touch = changedTouches[i]; let identifier = (touch.identifier == undefined) ? - this.HOVER_ID : touch.identifier; + this.MOUSE_ID : touch.identifier; let touchPoint = this._touchPoints[identifier]; if (touchPoint) touchPoint.update(touch, timeStamp); @@ -138,12 +148,13 @@ this.TouchAdapter = { this._lastExploreTime = timeStamp; } break; + case 'mouseup': case 'mouseleave': case 'touchend': for (var i = 0; i < changedTouches.length; i++) { let touch = changedTouches[i]; let identifier = (touch.identifier == undefined) ? - this.HOVER_ID : touch.identifier; + this.MOUSE_ID : touch.identifier; let touchPoint = this._touchPoints[identifier]; if (touchPoint) { touchPoint.update(touch, timeStamp); @@ -155,6 +166,7 @@ this.TouchAdapter = { } aEvent.preventDefault(); + aEvent.stopImmediatePropagation(); }, cleanupTouches: function cleanupTouches() { @@ -239,13 +251,13 @@ this.TouchAdapter = { // to single taps. if (Utils.MozBuildApp == 'mobile/android' && Utils.AndroidSdkVersion >= 14 && - aDetails.touches[0] != this.HOVER_ID) { + aDetails.touches[0] != this.MOUSE_ID) { if (aDetails.touches.length == 1) { if (aDetails.type == 'tap') { emitDelay = 50; aDetails.type = 'doubletap'; } else { - aDetails.touches.push(this.HOVER_ID); + aDetails.touches.push(this.MOUSE_ID); } } } @@ -370,66 +382,3 @@ TouchPoint.prototype = { return this.getDistanceToCoord(this.startX, this.startY); } }; - -var Mouse2Touch = { - _MouseToTouchMap: { - mousedown: 'touchstart', - mouseup: 'touchend', - mousemove: 'touchmove' - }, - - start: function Mouse2Touch_start() { - Utils.win.addEventListener('mousedown', this, true, true); - Utils.win.addEventListener('mouseup', this, true, true); - Utils.win.addEventListener('mousemove', this, true, true); - }, - - stop: function Mouse2Touch_stop() { - Utils.win.removeEventListener('mousedown', this, true, true); - Utils.win.removeEventListener('mouseup', this, true, true); - Utils.win.removeEventListener('mousemove', this, true, true); - }, - - handleEvent: function Mouse2Touch_handleEvent(aEvent) { - if (aEvent.buttons == 0) - return; - - let name = this._MouseToTouchMap[aEvent.type]; - let evt = Utils.win.document.createEvent("touchevent"); - let points = [Utils.win.document.createTouch( - Utils.win, aEvent.target, 0, - aEvent.pageX, aEvent.pageY, aEvent.screenX, aEvent.screenY, - aEvent.clientX, aEvent.clientY, 1, 1, 0, 0)]; - - // Simulate another touch point at a 5px offset when ctrl is pressed. - if (aEvent.ctrlKey) - points.push(Utils.win.document.createTouch( - Utils.win, aEvent.target, 1, - aEvent.pageX + 5, aEvent.pageY + 5, - aEvent.screenX + 5, aEvent.screenY + 5, - aEvent.clientX + 5, aEvent.clientY + 5, - 1, 1, 0, 0)); - - // Simulate another touch point at a -5px offset when alt is pressed. - if (aEvent.altKey) - points.push(Utils.win.document.createTouch( - Utils.win, aEvent.target, 2, - aEvent.pageX - 5, aEvent.pageY - 5, - aEvent.screenX - 5, aEvent.screenY - 5, - aEvent.clientX - 5, aEvent.clientY - 5, - 1, 1, 0, 0)); - - let touches = Utils.win.document.createTouchList(points); - if (name == "touchend") { - let empty = Utils.win.document.createTouchList(); - evt.initTouchEvent(name, true, true, Utils.win, 0, - false, false, false, false, empty, empty, touches); - } else { - evt.initTouchEvent(name, true, true, Utils.win, 0, - false, false, false, false, touches, touches, touches); - } - aEvent.target.dispatchEvent(evt); - aEvent.preventDefault(); - aEvent.stopImmediatePropagation(); - } -}; From d0809e0e80e98cba976f84ce134b39404f215299 Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Thu, 25 Apr 2013 12:39:16 -0700 Subject: [PATCH 002/155] Bug 865452 - Don't capture scripted mouse events. r=yzen --- accessible/src/jsat/TouchAdapter.jsm | 4 ++++ accessible/src/jsat/content-script.js | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/accessible/src/jsat/TouchAdapter.jsm b/accessible/src/jsat/TouchAdapter.jsm index 72c1c3f87ba..765a6705294 100644 --- a/accessible/src/jsat/TouchAdapter.jsm +++ b/accessible/src/jsat/TouchAdapter.jsm @@ -106,6 +106,10 @@ this.TouchAdapter = { return; } + if (aEvent.mozInputSource == Ci.nsIDOMMouseEvent.MOZ_SOURCE_UNKNOWN) { + return; + } + if (this._delayedEvent) { Utils.win.clearTimeout(this._delayedEvent); delete this._delayedEvent; diff --git a/accessible/src/jsat/content-script.js b/accessible/src/jsat/content-script.js index 90a10eb6174..17280e116b0 100644 --- a/accessible/src/jsat/content-script.js +++ b/accessible/src/jsat/content-script.js @@ -121,10 +121,17 @@ function activateCurrent(aMessage) { let x = Math.round((objX.value - docX.value) + objW.value / 2); let y = Math.round((objY.value - docY.value) + objH.value / 2); - let cwu = content.QueryInterface(Ci.nsIInterfaceRequestor). - getInterface(Ci.nsIDOMWindowUtils); - cwu.sendMouseEventToWindow('mousedown', x, y, 0, 1, 0, false); - cwu.sendMouseEventToWindow('mouseup', x, y, 0, 1, 0, false); + let node = aAccessible.DOMNode || aAccessible.parent.DOMNode; + + function dispatchMouseEvent(aEventType) { + let evt = content.document.createEvent("MouseEvents"); + evt.initMouseEvent(aEventType, true, true, content, + x, y, 0, 0, 0, false, false, false, false, 0, null); + node.dispatchEvent(evt); + } + + dispatchMouseEvent("mousedown"); + dispatchMouseEvent("mouseup"); } } From e820cc5342c74b9520dceb774d958613bdf0b85a Mon Sep 17 00:00:00 2001 From: Chris AtLee Date: Thu, 25 Apr 2013 13:27:08 -0400 Subject: [PATCH 003/155] Bug 838321: Remove unused manifests r=rail --HG-- extra : rebase_source : 3163ad5253201a4eac914aa7c1acb3d2a624b1b0 --- b2g/config/otoro/config.json | 2 - b2g/config/otoro/sources.xml | 110 ----------------------------------- b2g/config/panda/config.json | 2 - b2g/config/panda/sources.xml | 103 -------------------------------- b2g/config/unagi/config.json | 2 - b2g/config/unagi/sources.xml | 110 ----------------------------------- 6 files changed, 329 deletions(-) delete mode 100644 b2g/config/otoro/sources.xml delete mode 100644 b2g/config/panda/sources.xml delete mode 100644 b2g/config/unagi/sources.xml diff --git a/b2g/config/otoro/config.json b/b2g/config/otoro/config.json index 0214b8712d2..a3a9d183a24 100644 --- a/b2g/config/otoro/config.json +++ b/b2g/config/otoro/config.json @@ -24,8 +24,6 @@ }, "gecko_l10n_root": "http://hg.mozilla.org/l10n-central", "gaia": { - "vcs": "hgtool", - "repo": "http://hg.mozilla.org/integration/gaia-central", "l10n": { "vcs": "hgtool", "root": "http://hg.mozilla.org/gaia-l10n" diff --git a/b2g/config/otoro/sources.xml b/b2g/config/otoro/sources.xml deleted file mode 100644 index e879dd7ceac..00000000000 --- a/b2g/config/otoro/sources.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/b2g/config/panda/config.json b/b2g/config/panda/config.json index d0e4e9e79a9..6a9ed73e29b 100644 --- a/b2g/config/panda/config.json +++ b/b2g/config/panda/config.json @@ -15,8 +15,6 @@ "b2g_manifest": "pandaboard.xml", "gecko_l10n_root": "http://hg.mozilla.org/l10n-central", "gaia": { - "vcs": "hgtool", - "repo": "http://hg.mozilla.org/integration/gaia-central", "l10n": { "vcs": "hgtool", "root": "http://hg.mozilla.org/gaia-l10n" diff --git a/b2g/config/panda/sources.xml b/b2g/config/panda/sources.xml deleted file mode 100644 index a276fb6d22a..00000000000 --- a/b2g/config/panda/sources.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/b2g/config/unagi/config.json b/b2g/config/unagi/config.json index fdbc60dc8a4..4f32d1ddd5f 100644 --- a/b2g/config/unagi/config.json +++ b/b2g/config/unagi/config.json @@ -27,8 +27,6 @@ }, "gecko_l10n_root": "http://hg.mozilla.org/l10n-central", "gaia": { - "vcs": "hgtool", - "repo": "http://hg.mozilla.org/integration/gaia-central", "l10n": { "vcs": "hgtool", "root": "http://hg.mozilla.org/gaia-l10n" diff --git a/b2g/config/unagi/sources.xml b/b2g/config/unagi/sources.xml deleted file mode 100644 index b589feb816a..00000000000 --- a/b2g/config/unagi/sources.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 1c8fbdc1f4af4be69c023f4ef326f687de70cce7 Mon Sep 17 00:00:00 2001 From: "Adam Roach [:abr]" Date: Thu, 25 Apr 2013 14:41:31 -0500 Subject: [PATCH 004/155] Bug 864255: Ensure main thread dispatch for Pipeline destruction succeeds r=jesup --- media/webrtc/signaling/src/mediapipeline/MediaPipeline.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h index 758cdbdf1bc..b422ce56a8d 100644 --- a/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h +++ b/media/webrtc/signaling/src/mediapipeline/MediaPipeline.h @@ -337,7 +337,9 @@ class MediaPipelineTransmit : public MediaPipeline { ~PipelineListener() { // release conduit on mainthread. Must use forget()! - NS_DispatchToMainThread(new ConduitDeleteEvent(conduit_.forget()), NS_DISPATCH_NORMAL); + nsresult rv = NS_DispatchToMainThread(new + ConduitDeleteEvent(conduit_.forget()), NS_DISPATCH_NORMAL); + MOZ_ASSERT(!NS_FAILED(rv),"Could not dispatch conduit shutdown to main"); } @@ -447,7 +449,9 @@ class MediaPipelineReceiveAudio : public MediaPipelineReceive { ~PipelineListener() { // release conduit on mainthread. Must use forget()! - NS_DispatchToMainThread(new ConduitDeleteEvent(conduit_.forget()), NS_DISPATCH_NORMAL); + nsresult rv = NS_DispatchToMainThread(new + ConduitDeleteEvent(conduit_.forget()), NS_DISPATCH_NORMAL); + MOZ_ASSERT(!NS_FAILED(rv),"Could not dispatch conduit shutdown to main"); } // Implement MediaStreamListener From 3e4d5446b4073843d773b99e01c886ab981516ac Mon Sep 17 00:00:00 2001 From: Michal Novotny Date: Thu, 25 Apr 2013 21:54:20 +0200 Subject: [PATCH 005/155] Bug 852467 - nsDisableOldMaxSmartSizePrefEvent runs on the gecko main thread, blocks for long periods of time, r=honzab --- netwerk/cache/nsCacheService.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/netwerk/cache/nsCacheService.cpp b/netwerk/cache/nsCacheService.cpp index ea3151a22af..78bdcf25f9d 100644 --- a/netwerk/cache/nsCacheService.cpp +++ b/netwerk/cache/nsCacheService.cpp @@ -1610,7 +1610,9 @@ public: return rv; } - nsCacheService::SetDiskSmartSize(); + // It is safe to call SetDiskSmartSize_Locked() without holding the lock + // when we are on main thread and nsCacheService is initialized. + nsCacheService::gService->SetDiskSmartSize_Locked(); if (nsCacheService::gService->mObserver->PermittedToSmartSize(branch, false)) { rv = branch->SetIntPref(DISK_CACHE_CAPACITY_PREF, MAX_CACHE_SIZE); From 726813c2d919cbdbdf31fc3fcae132296ed96088 Mon Sep 17 00:00:00 2001 From: Brian Hackett Date: Thu, 25 Apr 2013 13:55:33 -0600 Subject: [PATCH 006/155] Bug 864957 - Consolidate locks used to avoid operation callback related races, r=djvj,luke. --- js/src/ion/AsmJSLink.cpp | 4 +- js/src/ion/AsmJSSignalHandlers.cpp | 2 +- js/src/jsapi.cpp | 49 ++++--------- js/src/jscntxt.cpp | 2 + js/src/jscntxt.h | 114 +++++++++++++++-------------- 5 files changed, 79 insertions(+), 92 deletions(-) diff --git a/js/src/ion/AsmJSLink.cpp b/js/src/ion/AsmJSLink.cpp index 977ab27b46d..a7f18ca9014 100644 --- a/js/src/ion/AsmJSLink.cpp +++ b/js/src/ion/AsmJSLink.cpp @@ -261,7 +261,7 @@ AsmJSActivation::AsmJSActivation(JSContext *cx, const AsmJSModule &module) prev_ = cx_->runtime->mainThread.asmJSActivationStack_; - PerThreadData::AsmJSActivationStackLock lock(cx_->runtime->mainThread); + JSRuntime::AutoLockForOperationCallback lock(cx_->runtime); cx_->runtime->mainThread.asmJSActivationStack_ = this; (void) errorRejoinSP_; // squelch GCC warning @@ -274,7 +274,7 @@ AsmJSActivation::~AsmJSActivation() JS_ASSERT(cx_->runtime->mainThread.asmJSActivationStack_ == this); - PerThreadData::AsmJSActivationStackLock lock(cx_->runtime->mainThread); + JSRuntime::AutoLockForOperationCallback lock(cx_->runtime); cx_->runtime->mainThread.asmJSActivationStack_ = prev_; } diff --git a/js/src/ion/AsmJSSignalHandlers.cpp b/js/src/ion/AsmJSSignalHandlers.cpp index 7c9d352b217..560c16d0c9b 100644 --- a/js/src/ion/AsmJSSignalHandlers.cpp +++ b/js/src/ion/AsmJSSignalHandlers.cpp @@ -976,7 +976,7 @@ void js::TriggerOperationCallbackForAsmJSCode(JSRuntime *rt) { #if defined(JS_ASMJS) - PerThreadData::AsmJSActivationStackLock lock(rt->mainThread); + JS_ASSERT(rt->currentThreadOwnsOperationCallbackLock()); AsmJSActivation *activation = rt->mainThread.asmJSActivationStackFromAnyThread(); if (!activation) diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index bb0f474fc77..be03271ac64 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -709,46 +709,20 @@ PerThreadData::PerThreadData(JSRuntime *runtime) ionTop(NULL), ionJSContext(NULL), ionStackLimit(0), -#ifdef JS_THREADSAFE - ionStackLimitLock_(NULL), -#endif ionActivation(NULL), asmJSActivationStack_(NULL), -#ifdef JS_THREADSAFE - asmJSActivationStackLock_(NULL), -#endif suppressGC(0) {} -bool -PerThreadData::init() -{ -#ifdef JS_THREADSAFE - ionStackLimitLock_ = PR_NewLock(); - if (!ionStackLimitLock_) - return false; - - asmJSActivationStackLock_ = PR_NewLock(); - if (!asmJSActivationStackLock_) - return false; -#endif - return true; -} - -PerThreadData::~PerThreadData() -{ -#ifdef JS_THREADSAFE - if (ionStackLimitLock_) - PR_DestroyLock(ionStackLimitLock_); - - if (asmJSActivationStackLock_) - PR_DestroyLock(asmJSActivationStackLock_); -#endif -} - JSRuntime::JSRuntime(JSUseHelperThreads useHelperThreads) : mainThread(this), interrupt(0), +#ifdef JS_THREADSAFE + operationCallbackLock(NULL), +#ifdef DEBUG + operationCallbackOwner(NULL), +#endif +#endif atomsCompartment(NULL), systemZone(NULL), numCompartments(0), @@ -941,10 +915,11 @@ JSRuntime::init(uint32_t maxbytes) { #ifdef JS_THREADSAFE ownerThread_ = PR_GetCurrentThread(); -#endif - if (!mainThread.init()) + operationCallbackLock = PR_NewLock(); + if (!operationCallbackLock) return false; +#endif js::TlsPerThreadData.set(&mainThread); @@ -1019,6 +994,10 @@ JSRuntime::~JSRuntime() { #ifdef JS_THREADSAFE clearOwnerThread(); + + JS_ASSERT(!operationCallbackOwner); + if (operationCallbackLock) + PR_DestroyLock(operationCallbackLock); #endif /* @@ -3122,7 +3101,7 @@ JS_SetNativeStackQuota(JSRuntime *rt, size_t stackSize) // ionStackLimit, then update it so that it reflects the new nativeStacklimit. #ifdef JS_ION { - PerThreadData::IonStackLimitLock lock(rt->mainThread); + JSRuntime::AutoLockForOperationCallback lock(rt); if (rt->mainThread.ionStackLimit != uintptr_t(-1)) rt->mainThread.ionStackLimit = rt->mainThread.nativeStackLimit; } diff --git a/js/src/jscntxt.cpp b/js/src/jscntxt.cpp index f9f46d1653c..8fb0a62b269 100644 --- a/js/src/jscntxt.cpp +++ b/js/src/jscntxt.cpp @@ -145,6 +145,8 @@ JSRuntime::sizeOfIncludingThis(JSMallocSizeOfFun mallocSizeOf, JS::RuntimeSizes void JSRuntime::triggerOperationCallback() { + AutoLockForOperationCallback lock(this); + /* * Invalidate ionTop to trigger its over-recursion check. Note this must be * set before interrupt, to avoid racing with js_InvokeOperationCallback, diff --git a/js/src/jscntxt.h b/js/src/jscntxt.h index 571ea10f8e5..ca8c2ffeb62 100644 --- a/js/src/jscntxt.h +++ b/js/src/jscntxt.h @@ -486,35 +486,7 @@ class PerThreadData : public js::PerThreadDataFriendFields JSContext *ionJSContext; uintptr_t ionStackLimit; -# ifdef JS_THREADSAFE - /* - * Synchronizes setting of ionStackLimit so signals by triggerOperationCallback don't - * get lost. - */ - PRLock *ionStackLimitLock_; - - class IonStackLimitLock { - PerThreadData &data_; - public: - IonStackLimitLock(PerThreadData &data) : data_(data) { - JS_ASSERT(data_.ionStackLimitLock_); - PR_Lock(data_.ionStackLimitLock_); - } - ~IonStackLimitLock() { - JS_ASSERT(data_.ionStackLimitLock_); - PR_Unlock(data_.ionStackLimitLock_); - } - }; -#else - class IonStackLimitLock { - public: - IonStackLimitLock(PerThreadData &data) {} - }; -# endif - void setIonStackLimit(uintptr_t limit) { - IonStackLimitLock lock(*this); - ionStackLimit = limit; - } + inline void setIonStackLimit(uintptr_t limit); /* * This points to the most recent Ion activation running on the thread. @@ -527,40 +499,19 @@ class PerThreadData : public js::PerThreadDataFriendFields * running asm.js without requiring dynamic polling operations in the * generated code. Since triggerOperationCallback may run on a separate * thread than the JSRuntime's owner thread all reads/writes must be - * synchronized (by asmJSActivationStackLock_). + * synchronized (by rt->operationCallbackLock). */ private: friend class js::AsmJSActivation; - /* See AsmJSActivation comment. */ + /* See AsmJSActivation comment. Protected by rt->operationCallbackLock. */ js::AsmJSActivation *asmJSActivationStack_; -# ifdef JS_THREADSAFE - /* Synchronizes pushing/popping with triggerOperationCallback. */ - PRLock *asmJSActivationStackLock_; -# endif - public: static unsigned offsetOfAsmJSActivationStackReadOnly() { return offsetof(PerThreadData, asmJSActivationStack_); } - class AsmJSActivationStackLock { -# ifdef JS_THREADSAFE - PerThreadData &data_; - public: - AsmJSActivationStackLock(PerThreadData &data) : data_(data) { - PR_Lock(data_.asmJSActivationStackLock_); - } - ~AsmJSActivationStackLock() { - PR_Unlock(data_.asmJSActivationStackLock_); - } -# else - public: - AsmJSActivationStackLock(PerThreadData &) {} -# endif - }; - js::AsmJSActivation *asmJSActivationStackFromAnyThread() const { return asmJSActivationStack_; } @@ -579,8 +530,6 @@ class PerThreadData : public js::PerThreadDataFriendFields int32_t suppressGC; PerThreadData(JSRuntime *runtime); - ~PerThreadData(); - bool init(); bool associatedWith(const JSRuntime *rt) { return runtime_ == rt; } }; @@ -690,6 +639,55 @@ struct JSRuntime : public JS::shadow::Runtime, */ volatile int32_t interrupt; +#ifdef JS_THREADSAFE + private: + /* + * Lock taken when triggering the operation callback from another thread. + * Protects all data that is touched in this process. + */ + PRLock *operationCallbackLock; +#ifdef DEBUG + PRThread *operationCallbackOwner; +#endif + public: +#endif // JS_THREADSAFE + + class AutoLockForOperationCallback { +#ifdef JS_THREADSAFE + JSRuntime *rt; + public: + AutoLockForOperationCallback(JSRuntime *rt MOZ_GUARD_OBJECT_NOTIFIER_PARAM) : rt(rt) { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + PR_Lock(rt->operationCallbackLock); +#ifdef DEBUG + rt->operationCallbackOwner = PR_GetCurrentThread(); +#endif + } + ~AutoLockForOperationCallback() { + JS_ASSERT(rt->operationCallbackOwner == PR_GetCurrentThread()); +#ifdef DEBUG + rt->operationCallbackOwner = NULL; +#endif + PR_Unlock(rt->operationCallbackLock); + } +#else // JS_THREADSAFE + public: + AutoLockForOperationCallback(JSRuntime *rt MOZ_GUARD_OBJECT_NOTIFIER_PARAM) { + MOZ_GUARD_OBJECT_NOTIFIER_INIT; + } +#endif // JS_THREADSAFE + + MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER + }; + + bool currentThreadOwnsOperationCallbackLock() { +#if defined(JS_THREADSAFE) && defined(DEBUG) + return operationCallbackOwner == PR_GetCurrentThread(); +#else + return true; +#endif + } + /* Default compartment. */ JSCompartment *atomsCompartment; @@ -1318,6 +1316,7 @@ struct JSRuntime : public JS::shadow::Runtime, // Used to reset stack limit after a signaled interrupt (i.e. ionStackLimit_ = -1) // has been noticed by Ion/Baseline. void resetIonStackLimit() { + AutoLockForOperationCallback lock(this); mainThread.setIonStackLimit(mainThread.nativeStackLimit); } @@ -2035,6 +2034,13 @@ enum ErrorArgumentsType { ArgumentsAreASCII }; +inline void +PerThreadData::setIonStackLimit(uintptr_t limit) +{ + JS_ASSERT(runtime_->currentThreadOwnsOperationCallbackLock()); + ionStackLimit = limit; +} + } /* namespace js */ #ifdef va_start From 334dac4952508427cdc0883d4a6110f3e44408e1 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Thu, 25 Apr 2013 09:34:47 -0400 Subject: [PATCH 007/155] Bug 865650 - Ensure that looping will only happen if the start offset is less than the end offset; r=padenot --HG-- extra : rebase_source : 3de31185083df174f7b6e823d1a135aee39c211d --- .../media/webaudio/AudioBufferSourceNode.cpp | 11 +++-- content/media/webaudio/test/Makefile.in | 1 + ...audioBufferSourceNodeLoopStartEndSame.html | 44 +++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 content/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html diff --git a/content/media/webaudio/AudioBufferSourceNode.cpp b/content/media/webaudio/AudioBufferSourceNode.cpp index 1f5ca8ee1a7..0022f1a44a3 100644 --- a/content/media/webaudio/AudioBufferSourceNode.cpp +++ b/content/media/webaudio/AudioBufferSourceNode.cpp @@ -562,8 +562,6 @@ AudioBufferSourceNode::SendDopplerShiftToStream(double aDopplerShift) void AudioBufferSourceNode::SendLoopParametersToStream() { - SendInt32ParameterToStream(LOOP, mLoop ? 1 : 0); - // Don't compute and set the loop parameters unnecessarily if (mLoop && mBuffer) { float rate = mBuffer->SampleRate(); @@ -580,8 +578,13 @@ AudioBufferSourceNode::SendLoopParametersToStream() } int32_t loopStartTicks = NS_lround(actualLoopStart * rate); int32_t loopEndTicks = NS_lround(actualLoopEnd * rate); - SendInt32ParameterToStream(LOOPSTART, loopStartTicks); - SendInt32ParameterToStream(LOOPEND, loopEndTicks); + if (loopStartTicks < loopEndTicks) { + SendInt32ParameterToStream(LOOPSTART, loopStartTicks); + SendInt32ParameterToStream(LOOPEND, loopEndTicks); + SendInt32ParameterToStream(LOOP, 1); + } + } else if (!mLoop) { + SendInt32ParameterToStream(LOOP, 0); } } diff --git a/content/media/webaudio/test/Makefile.in b/content/media/webaudio/test/Makefile.in index e064d869d80..c5bf15e8af0 100644 --- a/content/media/webaudio/test/Makefile.in +++ b/content/media/webaudio/test/Makefile.in @@ -25,6 +25,7 @@ MOCHITEST_FILES := \ test_audioBufferSourceNode.html \ test_audioBufferSourceNodeLoop.html \ test_audioBufferSourceNodeLoopStartEnd.html \ + test_audioBufferSourceNodeLoopStartEndSame.html \ test_audioBufferSourceNodeNullBuffer.html \ test_badConnect.html \ test_biquadFilterNode.html \ diff --git a/content/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html b/content/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html new file mode 100644 index 00000000000..03c6278c9a6 --- /dev/null +++ b/content/media/webaudio/test/test_audioBufferSourceNodeLoopStartEndSame.html @@ -0,0 +1,44 @@ + + + + Test AudioBufferSourceNode looping + + + + + +
+
+
+ + From 081d555a7490122a63407ccfe26bd38ebb7d733e Mon Sep 17 00:00:00 2001 From: Kai Engert Date: Thu, 25 Apr 2013 22:06:51 +0200 Subject: [PATCH 008/155] Bug 865828 - Upgrade Mozilla 23 to NSPR 4.10, r=wtc --- nsprpub/TAG-INFO | 2 +- nsprpub/configure | 12 +- nsprpub/configure.in | 15 +- nsprpub/lib/ds/plarena.c | 9 +- nsprpub/lib/ds/plarena.h | 84 ++++- nsprpub/pkg/linux/Makefile.in | 2 +- nsprpub/pkg/solaris/Makefile-devl.com | 2 +- nsprpub/pkg/solaris/Makefile-devl.targ | 2 +- nsprpub/pkg/solaris/Makefile.com | 2 +- nsprpub/pkg/solaris/Makefile.in | 2 +- nsprpub/pkg/solaris/Makefile.targ | 2 +- nsprpub/pkg/solaris/SUNWpr/Makefile.in | 2 +- nsprpub/pkg/solaris/SUNWpr/depend | 2 +- nsprpub/pkg/solaris/SUNWpr/pkginfo.tmpl | 2 +- nsprpub/pkg/solaris/SUNWpr/prototype_com | 2 +- nsprpub/pkg/solaris/SUNWpr/prototype_i386 | 2 +- nsprpub/pkg/solaris/SUNWpr/prototype_sparc | 2 +- nsprpub/pkg/solaris/SUNWprd/Makefile.in | 2 +- nsprpub/pkg/solaris/SUNWprd/depend | 2 +- nsprpub/pkg/solaris/SUNWprd/pkginfo.tmpl | 2 +- nsprpub/pkg/solaris/SUNWprd/prototype | 2 +- nsprpub/pkg/solaris/bld_awk_pkginfo.ksh | 2 +- nsprpub/pkg/solaris/proto64.mk | 2 +- nsprpub/pr/include/md/_win95.cfg | 8 +- nsprpub/pr/include/md/_win95.h | 1 - nsprpub/pr/include/prbit.h | 10 +- nsprpub/pr/include/prinit.h | 8 +- nsprpub/pr/include/prthread.h | 7 + nsprpub/pr/src/md/windows/ntsem.c | 4 +- nsprpub/pr/src/md/windows/w95io.c | 380 +-------------------- nsprpub/pr/src/misc/prlong.c | 2 +- nsprpub/pr/src/misc/prsystem.c | 45 +-- nsprpub/pr/src/pthreads/ptthread.c | 59 ++-- nsprpub/pr/tests/vercheck.c | 9 +- 34 files changed, 187 insertions(+), 504 deletions(-) mode change 100644 => 100755 nsprpub/pkg/solaris/SUNWprd/Makefile.in diff --git a/nsprpub/TAG-INFO b/nsprpub/TAG-INFO index d26f36a53c5..46b44f36c3e 100644 --- a/nsprpub/TAG-INFO +++ b/nsprpub/TAG-INFO @@ -1 +1 @@ -NSPR_4_9_6_RTM +NSPR_4_10_BETA1 diff --git a/nsprpub/configure b/nsprpub/configure index b06997fa19a..369a529b9d8 100755 --- a/nsprpub/configure +++ b/nsprpub/configure @@ -735,8 +735,8 @@ test "$host_alias" != "$target_alias" && MOD_MAJOR_VERSION=4 -MOD_MINOR_VERSION=9 -MOD_PATCH_VERSION=6 +MOD_MINOR_VERSION=10 +MOD_PATCH_VERSION=0 NSPR_MODNAME=nspr20 _HAVE_PTHREADS= USE_PTHREADS= @@ -1017,10 +1017,6 @@ echo "configure:961: checking for android platform directory" >&5 cat >> confdefs.h <<\EOF #define ANDROID 1 -EOF - - cat >> confdefs.h <&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* - ac_cv_prog_host_cc_works=1 echo "$ac_t""yes" 1>&6 + echo "$ac_t""yes" 1>&6 else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 diff --git a/nsprpub/configure.in b/nsprpub/configure.in index 71e9b856316..59598c05b79 100644 --- a/nsprpub/configure.in +++ b/nsprpub/configure.in @@ -14,8 +14,8 @@ dnl ======================================================== dnl = Defaults dnl ======================================================== MOD_MAJOR_VERSION=4 -MOD_MINOR_VERSION=9 -MOD_PATCH_VERSION=6 +MOD_MINOR_VERSION=10 +MOD_PATCH_VERSION=0 NSPR_MODNAME=nspr20 _HAVE_PTHREADS= USE_PTHREADS= @@ -271,7 +271,6 @@ case "$target" in fi AC_DEFINE(ANDROID) - AC_DEFINE_UNQUOTED(ANDROID_VERSION, $android_version) ;; esac fi @@ -593,9 +592,9 @@ if test "$target" != "$host" -o -n "$CROSS_COMPILE"; then LDFLAGS="$HOST_LDFLAGS" AC_MSG_CHECKING([whether the $host compiler ($HOST_CC $HOST_CFLAGS $HOST_LDFLAGS) works]) - AC_TRY_COMPILE([], [return(0);], - [ac_cv_prog_host_cc_works=1 AC_MSG_RESULT([yes])], - AC_MSG_ERROR([installation or configuration problem: $host compiler $HOST_CC cannot create executables.]) ) + AC_TRY_COMPILE([], [return 0;], + [AC_MSG_RESULT([yes])], + [AC_MSG_ERROR([installation or configuration problem: $host compiler $HOST_CC cannot create executables.])] ) CC=$_SAVE_CC CFLAGS=$_SAVE_CFLAGS @@ -2553,8 +2552,8 @@ case $target in ;; *) AC_CHECK_LIB(dl, dlopen, - AC_CHECK_HEADER(dlfcn.h, - OS_LIBS="-ldl $OS_LIBS")) + [AC_CHECK_HEADER(dlfcn.h, + OS_LIBS="-ldl $OS_LIBS")]) ;; esac diff --git a/nsprpub/lib/ds/plarena.c b/nsprpub/lib/ds/plarena.c index 40531951453..211dd671ccf 100644 --- a/nsprpub/lib/ds/plarena.c +++ b/nsprpub/lib/ds/plarena.c @@ -157,6 +157,7 @@ PR_IMPLEMENT(void *) PL_ArenaAllocate(PLArenaPool *pool, PRUint32 nb) pool->current = a; rp = (char *)a->avail; a->avail += nb; + PL_MAKE_MEM_UNDEFINED(rp, nb); return rp; } } while( NULL != (a = a->next) ); @@ -187,6 +188,7 @@ PR_IMPLEMENT(void *) PL_ArenaAllocate(PLArenaPool *pool, PRUint32 nb) pool->current = a; if ( NULL == pool->first.next ) pool->first.next = a; + PL_MAKE_MEM_UNDEFINED(rp, nb); return(rp); } } @@ -201,6 +203,7 @@ PR_IMPLEMENT(void *) PL_ArenaAllocate(PLArenaPool *pool, PRUint32 nb) if ( NULL != a ) { a->limit = (PRUword)a + sz; a->base = a->avail = (PRUword)PL_ARENA_ALIGN(pool, a + 1); + PL_MAKE_MEM_NOACCESS((void*)a->avail, a->limit - a->avail); rp = (char *)a->avail; a->avail += nb; /* the newly allocated arena is linked after pool->current @@ -212,6 +215,7 @@ PR_IMPLEMENT(void *) PL_ArenaAllocate(PLArenaPool *pool, PRUint32 nb) pool->first.next = a; PL_COUNT_ARENA(pool,++); COUNT(pool, nmallocs); + PL_MAKE_MEM_UNDEFINED(rp, nb); return(rp); } } @@ -237,7 +241,8 @@ static void ClearArenaList(PLArena *a, PRInt32 pattern) for (; a; a = a->next) { PR_ASSERT(a->base <= a->avail && a->avail <= a->limit); a->avail = a->base; - PL_CLEAR_UNUSED_PATTERN(a, pattern); + PL_CLEAR_UNUSED_PATTERN(a, pattern); + PL_MAKE_MEM_NOACCESS((void*)a->avail, a->limit - a->avail); } } @@ -273,6 +278,8 @@ static void FreeArenaList(PLArenaPool *pool, PLArena *head, PRBool reallyFree) } else { /* Insert the whole arena chain at the front of the freelist. */ do { + PL_MAKE_MEM_NOACCESS((void*)(*ap)->base, + (*ap)->limit - (*ap)->base); ap = &(*ap)->next; } while (*ap); LockArena(); diff --git a/nsprpub/lib/ds/plarena.h b/nsprpub/lib/ds/plarena.h index 4d54cc4616b..c4974304453 100644 --- a/nsprpub/lib/ds/plarena.h +++ b/nsprpub/lib/ds/plarena.h @@ -57,6 +57,68 @@ struct PLArenaPool { #endif }; +/* + * WARNING: The PL_MAKE_MEM_ macros are for internal use by NSPR. Do NOT use + * them in your code. + * + * NOTE: Valgrind support to be added. + * + * The PL_MAKE_MEM_ macros are modeled after the MOZ_MAKE_MEM_ macros in + * Mozilla's mfbt/MemoryChecking.h. Only AddressSanitizer is supported now. + * + * Provides a common interface to the ASan (AddressSanitizer) and Valgrind + * functions used to mark memory in certain ways. In detail, the following + * three macros are provided: + * + * PL_MAKE_MEM_NOACCESS - Mark memory as unsafe to access (e.g. freed) + * PL_MAKE_MEM_UNDEFINED - Mark memory as accessible, with content undefined + * PL_MAKE_MEM_DEFINED - Mark memory as accessible, with content defined + * + * With Valgrind in use, these directly map to the three respective Valgrind + * macros. With ASan in use, the NOACCESS macro maps to poisoning the memory, + * while the UNDEFINED/DEFINED macros unpoison memory. + * + * With no memory checker available, all macros expand to the empty statement. + */ + +/* WARNING: PL_SANITIZE_ADDRESS is for internal use by this header. Do NOT + * define or test this macro in your code. + */ +#if defined(__has_feature) +#if __has_feature(address_sanitizer) +#define PL_SANITIZE_ADDRESS 1 +#endif +#elif defined(__SANITIZE_ADDRESS__) +#define PL_SANITIZE_ADDRESS 1 +#endif + +#if defined(PL_SANITIZE_ADDRESS) + +/* These definitions are usually provided through the + * sanitizer/asan_interface.h header installed by ASan. + * See https://code.google.com/p/address-sanitizer/wiki/ManualPoisoning + */ + +void __asan_poison_memory_region(void const volatile *addr, size_t size); +void __asan_unpoison_memory_region(void const volatile *addr, size_t size); + +#define PL_MAKE_MEM_NOACCESS(addr, size) \ + __asan_poison_memory_region((addr), (size)) + +#define PL_MAKE_MEM_UNDEFINED(addr, size) \ + __asan_unpoison_memory_region((addr), (size)) + +#define PL_MAKE_MEM_DEFINED(addr, size) \ + __asan_unpoison_memory_region((addr), (size)) + +#else + +#define PL_MAKE_MEM_NOACCESS(addr, size) +#define PL_MAKE_MEM_UNDEFINED(addr, size) +#define PL_MAKE_MEM_DEFINED(addr, size) + +#endif + /* * If the including .c file uses only one power-of-2 alignment, it may define * PL_ARENA_CONST_ALIGN_MASK to the alignment mask and save a few instructions @@ -78,10 +140,12 @@ struct PLArenaPool { PRUint32 _nb = PL_ARENA_ALIGN(pool, nb); \ PRUword _p = _a->avail; \ PRUword _q = _p + _nb; \ - if (_q > _a->limit) \ + if (_q > _a->limit) { \ _p = (PRUword)PL_ArenaAllocate(pool, _nb); \ - else \ + } else { \ + PL_MAKE_MEM_UNDEFINED((void *)_p, nb); \ _a->avail = _q; \ + } \ p = (void *)_p; \ PL_ArenaCountAllocation(pool, nb); \ PR_END_MACRO @@ -94,6 +158,7 @@ struct PLArenaPool { PRUword _q = _p + _incr; \ if (_p == (PRUword)(p) + PL_ARENA_ALIGN(pool, size) && \ _q <= _a->limit) { \ + PL_MAKE_MEM_UNDEFINED((void *)((PRUword)(p) + size), incr); \ _a->avail = _q; \ PL_ArenaCountInplaceGrowth(pool, size, incr); \ } else { \ @@ -106,13 +171,19 @@ struct PLArenaPool { #define PR_UPTRDIFF(p,q) ((PRUword)(p) - (PRUword)(q)) #define PL_CLEAR_UNUSED_PATTERN(a, pattern) \ - (PR_ASSERT((a)->avail <= (a)->limit), \ - memset((void*)(a)->avail, (pattern), (a)->limit - (a)->avail)) + PR_BEGIN_MACRO \ + PR_ASSERT((a)->avail <= (a)->limit); \ + PL_MAKE_MEM_UNDEFINED((void*)(a)->avail, (a)->limit - (a)->avail); \ + memset((void*)(a)->avail, (pattern), (a)->limit - (a)->avail); \ + PR_END_MACRO #ifdef DEBUG #define PL_FREE_PATTERN 0xDA #define PL_CLEAR_UNUSED(a) PL_CLEAR_UNUSED_PATTERN((a), PL_FREE_PATTERN) -#define PL_CLEAR_ARENA(a) memset((void*)(a), PL_FREE_PATTERN, \ - (a)->limit - (PRUword)(a)) +#define PL_CLEAR_ARENA(a) \ + PR_BEGIN_MACRO \ + PL_MAKE_MEM_UNDEFINED((void*)(a), (a)->limit - (PRUword)(a)); \ + memset((void*)(a), PL_FREE_PATTERN, (a)->limit - (PRUword)(a)); \ + PR_END_MACRO #else #define PL_CLEAR_UNUSED(a) #define PL_CLEAR_ARENA(a) @@ -125,6 +196,7 @@ struct PLArenaPool { if (PR_UPTRDIFF(_m, _a->base) <= PR_UPTRDIFF(_a->avail, _a->base)) { \ _a->avail = (PRUword)PL_ARENA_ALIGN(pool, _m); \ PL_CLEAR_UNUSED(_a); \ + PL_MAKE_MEM_NOACCESS((void*)_a->avail, _a->limit - _a->avail); \ PL_ArenaCountRetract(pool, _m); \ } else { \ PL_ArenaRelease(pool, _m); \ diff --git a/nsprpub/pkg/linux/Makefile.in b/nsprpub/pkg/linux/Makefile.in index 9d51bcca741..63fa75030a8 100644 --- a/nsprpub/pkg/linux/Makefile.in +++ b/nsprpub/pkg/linux/Makefile.in @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile.in,v 1.12 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # MOD_DEPTH = ../.. diff --git a/nsprpub/pkg/solaris/Makefile-devl.com b/nsprpub/pkg/solaris/Makefile-devl.com index 4a6366a377a..86eab396259 100755 --- a/nsprpub/pkg/solaris/Makefile-devl.com +++ b/nsprpub/pkg/solaris/Makefile-devl.com @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile-devl.com,v 1.4 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # MACH = $(shell mach) diff --git a/nsprpub/pkg/solaris/Makefile-devl.targ b/nsprpub/pkg/solaris/Makefile-devl.targ index 32e14d31383..210b501c1d1 100755 --- a/nsprpub/pkg/solaris/Makefile-devl.targ +++ b/nsprpub/pkg/solaris/Makefile-devl.targ @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile-devl.targ,v 1.4 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # include $(srcdir)/../proto64.mk diff --git a/nsprpub/pkg/solaris/Makefile.com b/nsprpub/pkg/solaris/Makefile.com index 7515fcb0343..d4da88752f0 100644 --- a/nsprpub/pkg/solaris/Makefile.com +++ b/nsprpub/pkg/solaris/Makefile.com @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile.com,v 1.9 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # MACH = $(shell mach) diff --git a/nsprpub/pkg/solaris/Makefile.in b/nsprpub/pkg/solaris/Makefile.in index cdd6f1acf27..b34a23aafe8 100644 --- a/nsprpub/pkg/solaris/Makefile.in +++ b/nsprpub/pkg/solaris/Makefile.in @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile.in,v 1.4 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # MOD_DEPTH = ../.. diff --git a/nsprpub/pkg/solaris/Makefile.targ b/nsprpub/pkg/solaris/Makefile.targ index 5212ccd34cc..742ee932a9b 100644 --- a/nsprpub/pkg/solaris/Makefile.targ +++ b/nsprpub/pkg/solaris/Makefile.targ @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile.targ,v 1.7 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # include $(srcdir)/../proto64.mk diff --git a/nsprpub/pkg/solaris/SUNWpr/Makefile.in b/nsprpub/pkg/solaris/SUNWpr/Makefile.in index b07142f661b..9fe1f0abd0a 100644 --- a/nsprpub/pkg/solaris/SUNWpr/Makefile.in +++ b/nsprpub/pkg/solaris/SUNWpr/Makefile.in @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile.in,v 1.3 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # MOD_DEPTH = ../../.. diff --git a/nsprpub/pkg/solaris/SUNWpr/depend b/nsprpub/pkg/solaris/SUNWpr/depend index 473cda54664..4dd09c5aa78 100644 --- a/nsprpub/pkg/solaris/SUNWpr/depend +++ b/nsprpub/pkg/solaris/SUNWpr/depend @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -# $Id: depend,v 1.4 2012/03/06 13:13:41 gerv%gerv.net Exp $ +# $Id$ # # This package information file defines software dependencies associated # with the pkg. You can define three types of pkg dependencies with this file: diff --git a/nsprpub/pkg/solaris/SUNWpr/pkginfo.tmpl b/nsprpub/pkg/solaris/SUNWpr/pkginfo.tmpl index 8ceec7ca0f9..3c1a107bd8d 100644 --- a/nsprpub/pkg/solaris/SUNWpr/pkginfo.tmpl +++ b/nsprpub/pkg/solaris/SUNWpr/pkginfo.tmpl @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: pkginfo.tmpl,v 1.4 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # # # This required package information file describes characteristics of the diff --git a/nsprpub/pkg/solaris/SUNWpr/prototype_com b/nsprpub/pkg/solaris/SUNWpr/prototype_com index 65fedbafb43..4b994eac2f9 100644 --- a/nsprpub/pkg/solaris/SUNWpr/prototype_com +++ b/nsprpub/pkg/solaris/SUNWpr/prototype_com @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: prototype_com,v 1.5 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # # This required package information file contains a list of package contents. # The 'pkgmk' command uses this file to identify the contents of a package diff --git a/nsprpub/pkg/solaris/SUNWpr/prototype_i386 b/nsprpub/pkg/solaris/SUNWpr/prototype_i386 index 09d49a9adc2..e2f7a2f0386 100644 --- a/nsprpub/pkg/solaris/SUNWpr/prototype_i386 +++ b/nsprpub/pkg/solaris/SUNWpr/prototype_i386 @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: prototype_i386,v 1.5 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # # This required package information file contains a list of package contents. # The 'pkgmk' command uses this file to identify the contents of a package diff --git a/nsprpub/pkg/solaris/SUNWpr/prototype_sparc b/nsprpub/pkg/solaris/SUNWpr/prototype_sparc index a92b61be543..aae5f184852 100644 --- a/nsprpub/pkg/solaris/SUNWpr/prototype_sparc +++ b/nsprpub/pkg/solaris/SUNWpr/prototype_sparc @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: prototype_sparc,v 1.5 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # # This required package information file contains a list of package contents. # The 'pkgmk' command uses this file to identify the contents of a package diff --git a/nsprpub/pkg/solaris/SUNWprd/Makefile.in b/nsprpub/pkg/solaris/SUNWprd/Makefile.in old mode 100644 new mode 100755 index b6f12224121..0cb4c289e8e --- a/nsprpub/pkg/solaris/SUNWprd/Makefile.in +++ b/nsprpub/pkg/solaris/SUNWprd/Makefile.in @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: Makefile.in,v 1.4 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # MOD_DEPTH = ../../.. diff --git a/nsprpub/pkg/solaris/SUNWprd/depend b/nsprpub/pkg/solaris/SUNWprd/depend index 8d4b1ff1e61..2415c54103f 100755 --- a/nsprpub/pkg/solaris/SUNWprd/depend +++ b/nsprpub/pkg/solaris/SUNWprd/depend @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -# $Id: depend,v 1.4 2012/03/06 13:13:41 gerv%gerv.net Exp $ +# $Id$ # # This package information file defines software dependencies associated # with the pkg. You can define three types of pkg dependencies with this file: diff --git a/nsprpub/pkg/solaris/SUNWprd/pkginfo.tmpl b/nsprpub/pkg/solaris/SUNWprd/pkginfo.tmpl index 8b3d6afd71c..5003122ab81 100755 --- a/nsprpub/pkg/solaris/SUNWprd/pkginfo.tmpl +++ b/nsprpub/pkg/solaris/SUNWprd/pkginfo.tmpl @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: pkginfo.tmpl,v 1.4 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # # # This required package information file describes characteristics of the diff --git a/nsprpub/pkg/solaris/SUNWprd/prototype b/nsprpub/pkg/solaris/SUNWprd/prototype index 4f645b698a1..44f52bab208 100755 --- a/nsprpub/pkg/solaris/SUNWprd/prototype +++ b/nsprpub/pkg/solaris/SUNWprd/prototype @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: prototype,v 1.7 2012/03/06 13:13:41 gerv%gerv.net Exp $" +#ident "$Id$" # # This required package information file contains a list of package contents. # The 'pkgmk' command uses this file to identify the contents of a package diff --git a/nsprpub/pkg/solaris/bld_awk_pkginfo.ksh b/nsprpub/pkg/solaris/bld_awk_pkginfo.ksh index 260044bf22c..67f1df7e858 100644 --- a/nsprpub/pkg/solaris/bld_awk_pkginfo.ksh +++ b/nsprpub/pkg/solaris/bld_awk_pkginfo.ksh @@ -7,7 +7,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: bld_awk_pkginfo.ksh,v 1.4 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # # Simple script which builds the awk_pkginfo awk script. This awk script # is used to convert the pkginfo.tmpl files into pkginfo files diff --git a/nsprpub/pkg/solaris/proto64.mk b/nsprpub/pkg/solaris/proto64.mk index 7d97e188c39..69bb1fc8f1a 100644 --- a/nsprpub/pkg/solaris/proto64.mk +++ b/nsprpub/pkg/solaris/proto64.mk @@ -6,7 +6,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # -#ident "$Id: proto64.mk,v 1.4 2012/03/06 13:13:40 gerv%gerv.net Exp $" +#ident "$Id$" # ifeq ($(USE_64), 1) diff --git a/nsprpub/pr/include/md/_win95.cfg b/nsprpub/pr/include/md/_win95.cfg index 77d18287167..1e693cc68ca 100644 --- a/nsprpub/pr/include/md/_win95.cfg +++ b/nsprpub/pr/include/md/_win95.cfg @@ -14,15 +14,9 @@ #define WIN32 #endif -#ifdef _WIN32_WCE -#ifndef WINCE -#define WINCE -#endif -#else #ifndef WIN95 #define WIN95 #endif -#endif #define PR_AF_INET6 23 /* same as AF_INET6 */ @@ -214,7 +208,7 @@ #define PR_ALIGN_OF_FLOAT 4 #define PR_ALIGN_OF_WORD 4 #define PR_ALIGN_OF_DWORD 8 -#define PR_ALIGN_OF_DOUBLE 4 +#define PR_ALIGN_OF_DOUBLE 8 #define PR_ALIGN_OF_POINTER 4 #define PR_BYTES_PER_WORD_LOG2 2 diff --git a/nsprpub/pr/include/md/_win95.h b/nsprpub/pr/include/md/_win95.h index 3db340e3de4..b008c13237c 100644 --- a/nsprpub/pr/include/md/_win95.h +++ b/nsprpub/pr/include/md/_win95.h @@ -246,7 +246,6 @@ extern PRInt32 _MD_CloseFile(PROsfd osfd); #define _MD_UNLOCKFILE _PR_MD_UNLOCKFILE /* --- UTF16 IO stuff --- */ -extern PRBool _pr_useUnicode; #ifdef MOZ_UNICODE #define _MD_OPEN_FILE_UTF16 _PR_MD_OPEN_FILE_UTF16 #define _MD_OPEN_DIR_UTF16 _PR_MD_OPEN_DIR_UTF16 diff --git a/nsprpub/pr/include/prbit.h b/nsprpub/pr/include/prbit.h index f0a51d016c5..de8375088b4 100644 --- a/nsprpub/pr/include/prbit.h +++ b/nsprpub/pr/include/prbit.h @@ -9,8 +9,12 @@ #include "prtypes.h" PR_BEGIN_EXTERN_C -/* replace compare/jump/add/shift sequence with x86 BSF/BSR instruction */ -#if defined(_WIN32) && (_MSC_VER >= 1300) && (defined(_M_IX86) || defined(_M_AMD64)) +/* +** Replace compare/jump/add/shift sequence with compiler built-in/intrinsic +** functions. +*/ +#if defined(_WIN32) && (_MSC_VER >= 1300) && \ + (defined(_M_IX86) || defined(_M_AMD64) || defined(_M_ARM)) unsigned char _BitScanForward(unsigned long * Index, unsigned long Mask); unsigned char _BitScanReverse(unsigned long * Index, unsigned long Mask); # pragma intrinsic(_BitScanForward,_BitScanReverse) @@ -133,7 +137,7 @@ NSPR_API(PRIntn) PR_FloorLog2(PRUint32 i); */ #if defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_AMD64) || \ - defined(_M_X64)) + defined(_M_X64) || defined(_M_ARM)) #include #pragma intrinsic(_rotl, _rotr) #define PR_ROTATE_LEFT32(a, bits) _rotl(a, bits) diff --git a/nsprpub/pr/include/prinit.h b/nsprpub/pr/include/prinit.h index 5506bd04a1d..ca6df2d5f89 100644 --- a/nsprpub/pr/include/prinit.h +++ b/nsprpub/pr/include/prinit.h @@ -31,11 +31,11 @@ PR_BEGIN_EXTERN_C ** The format of the version string is ** ".[.] []" */ -#define PR_VERSION "4.9.6" +#define PR_VERSION "4.10 Beta" #define PR_VMAJOR 4 -#define PR_VMINOR 9 -#define PR_VPATCH 6 -#define PR_BETA PR_FALSE +#define PR_VMINOR 10 +#define PR_VPATCH 0 +#define PR_BETA PR_TRUE /* ** PRVersionCheck diff --git a/nsprpub/pr/include/prthread.h b/nsprpub/pr/include/prthread.h index 708c889c74b..f8b28a62d64 100644 --- a/nsprpub/pr/include/prthread.h +++ b/nsprpub/pr/include/prthread.h @@ -141,6 +141,13 @@ NSPR_API(PRThreadPriority) PR_GetThreadPriority(const PRThread *thread); /* ** Change the priority of the "thread" to "priority". +** +** PR_SetThreadPriority works in a best-effort manner. On some platforms a +** special privilege, such as root access, is required to change thread +** priorities, especially to raise thread priorities. If the caller doesn't +** have enough privileges to change thread priorites, the function has no +** effect except causing a future PR_GetThreadPriority call to return +** |priority|. */ NSPR_API(void) PR_SetThreadPriority(PRThread *thread, PRThreadPriority priority); diff --git a/nsprpub/pr/src/md/windows/ntsem.c b/nsprpub/pr/src/md/windows/ntsem.c index cc71fe30f12..f36a145a91d 100644 --- a/nsprpub/pr/src/md/windows/ntsem.c +++ b/nsprpub/pr/src/md/windows/ntsem.c @@ -46,7 +46,5 @@ _PR_MD_WAIT_SEM(_MDSemaphore *md) void _PR_MD_POST_SEM(_MDSemaphore *md) { - int old_count; - - ReleaseSemaphore(md->sem, 1, &old_count); + ReleaseSemaphore(md->sem, 1, NULL); } diff --git a/nsprpub/pr/src/md/windows/w95io.c b/nsprpub/pr/src/md/windows/w95io.c index dad08f25694..824b6fff7a3 100644 --- a/nsprpub/pr/src/md/windows/w95io.c +++ b/nsprpub/pr/src/md/windows/w95io.c @@ -16,197 +16,6 @@ #include #endif /* MOZ_UNICODE */ -#ifdef WINCE - -static HANDLE CreateFileA(LPCSTR lpFileName, - DWORD dwDesiredAccess, - DWORD dwShareMode, - LPSECURITY_ATTRIBUTES lpSecurityAttributes, - DWORD dwCreationDisposition, - DWORD dwFlagsAndAttributes, - HANDLE hTemplateFile) -{ - PRUnichar wFileName[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH); - return CreateFileW(wFileName, dwDesiredAccess, dwShareMode, - lpSecurityAttributes, dwCreationDisposition, - dwFlagsAndAttributes, hTemplateFile); -} - -/* - * We seem to call FindFirstFileA and FindNextFileA just to get - * the file names in a directory listing. If so, we could define - * a custom WIN32_FIND_DATAA structure with just the cFileName - * member, and the CopyFindFileDataW2A function could just - * copy/convert the cFileName member. - */ -static void CopyFindFileDataW2A(LPWIN32_FIND_DATAW from, - LPWIN32_FIND_DATAA to) -{ - /* - * WIN32_FIND_DATAA and WIN32_FIND_DATAW are slightly different. - * The dwReserved0, dwReserved1, and cAlternateFileName members - * exist only in WIN32_FIND_DATAA. The dwOID member exists only - * in WIN32_FIND_DATAW. - */ - to->dwFileAttributes = from->dwFileAttributes; - to->ftCreationTime = from->ftCreationTime; - to->ftLastAccessTime = from->ftLastAccessTime; - to->ftLastWriteTime = from->ftLastWriteTime; - to->nFileSizeHigh = from->nFileSizeHigh; - to->nFileSizeLow = from->nFileSizeLow; - to->dwReserved0 = 0; - to->dwReserved1 = 0; - WideCharToMultiByte(CP_ACP, 0, from->cFileName, -1, - to->cFileName, MAX_PATH, NULL, NULL); - to->cAlternateFileName[0] = '\0'; -} - -static HANDLE FindFirstFileA(LPCSTR lpFileName, - LPWIN32_FIND_DATAA lpFindFileData) -{ - PRUnichar wFileName[MAX_PATH]; - HANDLE hFindFile; - WIN32_FIND_DATAW wFindFileData; - - MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH); - hFindFile = FindFirstFileW(wFileName, &wFindFileData); - if (hFindFile != INVALID_HANDLE_VALUE) { - CopyFindFileDataW2A(&wFindFileData, lpFindFileData); - } - return hFindFile; -} - -static BOOL FindNextFileA(HANDLE hFindFile, - LPWIN32_FIND_DATAA lpFindFileData) -{ - WIN32_FIND_DATAW wFindFileData; - BOOL rv; - - rv = FindNextFileW(hFindFile, &wFindFileData); - if (rv) { - CopyFindFileDataW2A(&wFindFileData, lpFindFileData); - } - return rv; -} - -static BOOL GetFileAttributesExA(LPCSTR lpFileName, - GET_FILEEX_INFO_LEVELS fInfoLevelId, - LPVOID lpFileInformation) -{ - PRUnichar wFileName[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH); - return GetFileAttributesExW(wFileName, fInfoLevelId, lpFileInformation); -} - -static BOOL DeleteFileA(LPCSTR lpFileName) -{ - PRUnichar wFileName[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, lpFileName, -1, wFileName, MAX_PATH); - return DeleteFileW(wFileName); -} - -static BOOL MoveFileA(LPCSTR from, LPCSTR to) -{ - PRUnichar wFrom[MAX_PATH]; - PRUnichar wTo[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, from, -1, wFrom, MAX_PATH); - MultiByteToWideChar(CP_ACP, 0, to, -1, wTo, MAX_PATH); - return MoveFileW(wFrom, wTo); -} - -static BOOL CreateDirectoryA(LPCSTR lpPathName, - LPSECURITY_ATTRIBUTES lpSecurityAttributes) -{ - PRUnichar wPathName[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, lpPathName, -1, wPathName, MAX_PATH); - return CreateDirectoryW(wPathName, lpSecurityAttributes); -} - -static BOOL RemoveDirectoryA(LPCSTR lpPathName) -{ - PRUnichar wPathName[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, lpPathName, -1, wPathName, MAX_PATH); - return RemoveDirectoryW(wPathName); -} - -static long GetDriveType(const char *lpRootPathName) -{ - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return 0; // The drive type cannot be determined. -} - -static DWORD GetFullPathName(const char *lpFileName, - DWORD nBufferLength, - const char *lpBuffer, - const char **lpFilePart) -{ - // needs work dft - DWORD len = strlen(lpFileName); - if (len > nBufferLength) - return len; - - strncpy((char *)lpBuffer, lpFileName, len); - ((char *)lpBuffer)[len] = '\0'; - - if (lpFilePart) { - char *sep = strrchr(lpBuffer, '\\'); - if (sep) { - sep++; // pass the seperator - *lpFilePart = sep; - } else { - *lpFilePart = lpBuffer; - } - } - return len; -} - -static BOOL LockFile(HANDLE hFile, - DWORD dwFileOffsetLow, - DWORD dwFileOffsetHigh, - DWORD nNumberOfBytesToLockLow, - DWORD nNumberOfBytesToLockHigh) -{ - OVERLAPPED overlapped = {0}; - overlapped.Offset = dwFileOffsetLow; - overlapped.OffsetHigh = dwFileOffsetHigh; - return LockFileEx(hFile, - LOCKFILE_EXCLUSIVE_LOCK | LOCKFILE_FAIL_IMMEDIATELY, - 0, // reserved - nNumberOfBytesToLockLow, - nNumberOfBytesToLockHigh, &overlapped); -} - -static BOOL UnlockFile(HANDLE hFile, - DWORD dwFileOffsetLow, - DWORD dwFileOffsetHigh, - DWORD nNumberOfBytesToUnlockLow, - DWORD nNumberOfBytesToUnlockHigh) -{ - OVERLAPPED overlapped = {0}; - overlapped.Offset = dwFileOffsetLow; - overlapped.OffsetHigh = dwFileOffsetHigh; - return UnlockFileEx(hFile, - 0, // reserved - nNumberOfBytesToUnlockLow, - nNumberOfBytesToUnlockHigh, &overlapped); -} - -static unsigned char *_mbsdec(const unsigned char *string1, - const unsigned char *string2) -{ - // needs work dft - return NULL; -} - -static unsigned char *_mbsinc(const unsigned char *inCurrent) -{ - // needs work dft - return (unsigned char *)(inCurrent + 1); -} - -#endif - struct _MDLock _pr_ioq_lock; /* @@ -227,17 +36,6 @@ static DWORD dirAccessTable[] = { FILE_GENERIC_EXECUTE }; -/* Windows CE has GetFileAttributesEx. */ -#ifndef WINCE -typedef BOOL (WINAPI *GetFileAttributesExFn)(LPCTSTR, - GET_FILEEX_INFO_LEVELS, - LPVOID); -static GetFileAttributesExFn getFileAttributesEx; -static void InitGetFileInfo(void); -#endif - -static void InitUnicodeSupport(void); - static PRBool IsPrevCharSlash(const char *str, const char *current); void @@ -277,12 +75,6 @@ _PR_MD_INIT_IO() _PR_NT_InitSids(); -#ifndef WINCE - InitGetFileInfo(); -#endif - - InitUnicodeSupport(); - _PR_MD_InitSockets(); } @@ -795,11 +587,6 @@ _PR_FileTimeToPRTime(const FILETIME *filetime, PRTime *prtm) PRInt32 _PR_MD_STAT(const char *fn, struct stat *info) { -#ifdef WINCE - // needs work. dft - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return -1; -#else PRInt32 rv; rv = _stat(fn, (struct _stat *)info); @@ -831,7 +618,6 @@ _PR_MD_STAT(const char *fn, struct stat *info) _PR_MD_MAP_STAT_ERROR(errno); } return rv; -#endif } #define _PR_IS_SLASH(ch) ((ch) == '/' || (ch) == '\\') @@ -935,117 +721,10 @@ IsRootDirectory(char *fn, size_t buflen) return rv; } -#ifndef WINCE -/* - * InitGetFileInfo -- - * - * Called during IO init. Checks for the existence of the system function - * GetFileAttributeEx, which when available is used in GETFILEINFO calls. - * If the routine exists, then the address of the routine is stored in the - * variable getFileAttributesEx, which will be used to call the routine. - */ -static void InitGetFileInfo(void) -{ - HMODULE module; - module = GetModuleHandle("Kernel32.dll"); - if (!module) { - PR_LOG(_pr_io_lm, PR_LOG_DEBUG, - ("InitGetFileInfo: GetModuleHandle() failed: %d", - GetLastError())); - return; - } - - getFileAttributesEx = (GetFileAttributesExFn) - GetProcAddress(module, "GetFileAttributesExA"); -} - -/* - * If GetFileAttributeEx doesn't exist, we call FindFirstFile as a - * fallback. - */ -static BOOL -GetFileAttributesExFB(const char *fn, WIN32_FIND_DATA *findFileData) -{ - HANDLE hFindFile; - - /* - * FindFirstFile() expands wildcard characters. So - * we make sure the pathname contains no wildcard. - */ - if (NULL != _mbspbrk(fn, "?*")) { - SetLastError(ERROR_INVALID_NAME); - return FALSE; - } - - hFindFile = FindFirstFile(fn, findFileData); - if (INVALID_HANDLE_VALUE == hFindFile) { - DWORD len; - char *filePart; - char pathbuf[MAX_PATH + 1]; - - /* - * FindFirstFile() does not work correctly on root directories. - * It also doesn't work correctly on a pathname that ends in a - * slash. So we first check to see if the pathname specifies a - * root directory. If not, and if the pathname ends in a slash, - * we remove the final slash and try again. - */ - - /* - * If the pathname does not contain ., \, and /, it cannot be - * a root directory or a pathname that ends in a slash. - */ - if (NULL == _mbspbrk(fn, ".\\/")) { - return FALSE; - } - len = GetFullPathName(fn, sizeof(pathbuf), pathbuf, - &filePart); - if (0 == len) { - return FALSE; - } - if (len > sizeof(pathbuf)) { - SetLastError(ERROR_FILENAME_EXCED_RANGE); - return FALSE; - } - if (IsRootDirectory(pathbuf, sizeof(pathbuf))) { - findFileData->dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY; - /* The file size doesn't have a meaning for directories. */ - findFileData->nFileSizeHigh = 0; - findFileData->nFileSizeLow = 0; - /* - * For a directory, these timestamps all specify when the - * directory is created. The creation time doesn't make - * sense for root directories, so we set it to (NSPR) time 0. - */ - memcpy(&findFileData->ftCreationTime, &_pr_filetime_offset, 8); - findFileData->ftLastAccessTime = findFileData->ftCreationTime; - findFileData->ftLastWriteTime = findFileData->ftCreationTime; - return TRUE; - } - if (!IsPrevCharSlash(pathbuf, pathbuf + len)) { - return FALSE; - } else { - pathbuf[len - 1] = '\0'; - hFindFile = FindFirstFile(pathbuf, findFileData); - if (INVALID_HANDLE_VALUE == hFindFile) { - return FALSE; - } - } - } - - FindClose(hFindFile); - return TRUE; -} -#endif - PRInt32 _PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info) { -#ifdef WINCE WIN32_FILE_ATTRIBUTE_DATA findFileData; -#else - WIN32_FIND_DATA findFileData; -#endif BOOL rv; if (NULL == fn || '\0' == *fn) { @@ -1053,16 +732,7 @@ _PR_MD_GETFILEINFO64(const char *fn, PRFileInfo64 *info) return -1; } -#ifdef WINCE - rv = GetFileAttributesExA(fn, GetFileExInfoStandard, &findFileData); -#else - /* GetFileAttributesEx is supported on Win 2K and up. */ - if (getFileAttributesEx) { - rv = getFileAttributesEx(fn, GetFileExInfoStandard, &findFileData); - } else { - rv = GetFileAttributesExFB(fn, &findFileData); - } -#endif + rv = GetFileAttributesEx(fn, GetFileExInfoStandard, &findFileData); if (!rv) { _PR_MD_MAP_OPENDIR_ERROR(GetLastError()); return -1; @@ -1150,10 +820,6 @@ _PR_MD_GETOPENFILEINFO(const PRFileDesc *fd, PRFileInfo *info) PRStatus _PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable) { -#ifdef WINCE - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return PR_FAILURE; -#else BOOL rv; /* @@ -1169,7 +835,6 @@ _PR_MD_SET_FD_INHERITABLE(PRFileDesc *fd, PRBool inheritable) return PR_FAILURE; } return PR_SUCCESS; -#endif } void @@ -1185,9 +850,6 @@ _PR_MD_INIT_FD_INHERITABLE(PRFileDesc *fd, PRBool imported) void _PR_MD_QUERY_FD_INHERITABLE(PRFileDesc *fd) { -#ifdef WINCE - fd->secret->inheritable = _PR_TRI_FALSE; -#else DWORD flags; PR_ASSERT(_PR_TRI_UNKNOWN == fd->secret->inheritable); @@ -1198,7 +860,6 @@ _PR_MD_QUERY_FD_INHERITABLE(PRFileDesc *fd) fd->secret->inheritable = _PR_TRI_FALSE; } } -#endif } PRInt32 @@ -1216,10 +877,6 @@ _PR_MD_RENAME(const char *from, const char *to) PRInt32 _PR_MD_ACCESS(const char *name, PRAccessHow how) { -#ifdef WINCE - PR_SetError(PR_NOT_IMPLEMENTED_ERROR, 0); - return -1; -#else PRInt32 rv; switch (how) { case PR_ACCESS_WRITE_OK: @@ -1238,7 +895,6 @@ PRInt32 rv; if (rv < 0) _PR_MD_MAP_ACCESS_ERROR(errno); return rv; -#endif } PRInt32 @@ -1364,40 +1020,6 @@ static GetDriveTypeWFn getDriveTypeW = GetDriveTypeW; #endif /* MOZ_UNICODE */ -PRBool _pr_useUnicode = PR_FALSE; - -static void InitUnicodeSupport(void) -{ -#ifdef WINCE - /* The A functions don't even exist in Windows Mobile. */ - _pr_useUnicode = PR_TRUE; -#else - /* - * The W functions exist on Win9x as stubs that fail with the - * ERROR_CALL_NOT_IMPLEMENTED error. We plan to emulate the - * MSLU W functions on Win9x in the future. - */ - - /* Find out if we are running on a Unicode enabled version of Windows */ - OSVERSIONINFOA osvi = {0}; - - osvi.dwOSVersionInfoSize = sizeof(osvi); - if (GetVersionExA(&osvi)) { - _pr_useUnicode = (osvi.dwPlatformId >= VER_PLATFORM_WIN32_NT); - } else { - _pr_useUnicode = PR_FALSE; - } -#ifdef DEBUG - /* - * In debug builds, allow explicit use of ANSI methods to simulate - * a Win9x environment for testing purposes. - */ - if (getenv("WINAPI_USE_ANSI")) - _pr_useUnicode = PR_FALSE; -#endif -#endif -} - #ifdef MOZ_UNICODE /* ================ UTF16 Interfaces ================================ */ diff --git a/nsprpub/pr/src/misc/prlong.c b/nsprpub/pr/src/misc/prlong.c index 630b2a86684..701d0812d78 100644 --- a/nsprpub/pr/src/misc/prlong.c +++ b/nsprpub/pr/src/misc/prlong.c @@ -3,7 +3,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -#include "primpl.h" +#include "prlong.h" static PRInt64 ll_zero = LL_INIT( 0x00000000,0x00000000 ); static PRInt64 ll_maxint = LL_INIT( 0x7fffffff, 0xffffffff ); diff --git a/nsprpub/pr/src/misc/prsystem.c b/nsprpub/pr/src/misc/prsystem.c index f79d5884c11..9579fcc931f 100644 --- a/nsprpub/pr/src/misc/prsystem.c +++ b/nsprpub/pr/src/misc/prsystem.c @@ -56,24 +56,6 @@ #include #endif -#if defined(WIN32) -/* This struct is not present in VC6 headers, so declare it here */ -typedef struct { - DWORD dwLength; - DWORD dwMemoryLoad; - DWORDLONG ullTotalPhys; - DWORDLONG ullAvailPhys; - DWORDLONG ullToalPageFile; - DWORDLONG ullAvailPageFile; - DWORDLONG ullTotalVirtual; - DWORDLONG ullAvailVirtual; - DWORDLONG ullAvailExtendedVirtual; -} PR_MEMORYSTATUSEX; - -/* Typedef for dynamic lookup of GlobalMemoryStatusEx(). */ -typedef BOOL (WINAPI *GlobalMemoryStatusExFn)(PR_MEMORYSTATUSEX *); -#endif - PR_IMPLEMENT(char) PR_GetDirectorySeparator(void) { return PR_DIRECTORY_SEPARATOR; @@ -327,29 +309,10 @@ PR_IMPLEMENT(PRUint64) PR_GetPhysicalMemorySize(void) #elif defined(WIN32) - /* Try to use the newer GlobalMemoryStatusEx API for Windows 2000+. */ - GlobalMemoryStatusExFn globalMemory = (GlobalMemoryStatusExFn) NULL; - HMODULE module = GetModuleHandleW(L"kernel32.dll"); - - if (module) { - globalMemory = (GlobalMemoryStatusExFn)GetProcAddress(module, "GlobalMemoryStatusEx"); - - if (globalMemory) { - PR_MEMORYSTATUSEX memStat; - memStat.dwLength = sizeof(memStat); - - if (globalMemory(&memStat)) - bytes = memStat.ullTotalPhys; - } - } - - if (!bytes) { - /* Fall back to the older API. */ - MEMORYSTATUS memStat; - memset(&memStat, 0, sizeof(memStat)); - GlobalMemoryStatus(&memStat); - bytes = memStat.dwTotalPhys; - } + MEMORYSTATUSEX memStat; + memStat.dwLength = sizeof(memStat); + if (GlobalMemoryStatusEx(&memStat)) + bytes = memStat.ullTotalPhys; #elif defined(OS2) diff --git a/nsprpub/pr/src/pthreads/ptthread.c b/nsprpub/pr/src/pthreads/ptthread.c index abc27603261..8a87c14fba8 100644 --- a/nsprpub/pr/src/pthreads/ptthread.c +++ b/nsprpub/pr/src/pthreads/ptthread.c @@ -62,9 +62,7 @@ static void _pt_thread_death(void *arg); static void _pt_thread_death_internal(void *arg, PRBool callDestructors); static void init_pthread_gc_support(void); -#if defined(_PR_DCETHREADS) || \ - defined(_POSIX_THREAD_PRIORITY_SCHEDULING) || \ - defined(_PR_NICE_PRIORITY_SCHEDULING) +#if defined(_PR_DCETHREADS) || defined(_POSIX_THREAD_PRIORITY_SCHEDULING) static PRIntn pt_PriorityMap(PRThreadPriority pri) { #ifdef NTO @@ -74,18 +72,26 @@ static PRIntn pt_PriorityMap(PRThreadPriority pri) * Jerry.Kirk@Nexwarecorp.com */ return 10; -#elif defined(_PR_NICE_PRIORITY_SCHEDULING) - /* This maps high priorities to low nice values: - * PR_PRIORITY_LOW 1 - * PR_PRIORITY_NORMAL 0 - * PR_PRIORITY_HIGH -1 - * PR_PRIORITY_URGENT -2 */ - return 1 - pri; #else return pt_book.minPrio + pri * (pt_book.maxPrio - pt_book.minPrio) / PR_PRIORITY_LAST; #endif } +#elif defined(_PR_NICE_PRIORITY_SCHEDULING) +/* + * This functions maps higher priorities to lower nice values relative to the + * nice value specified in the |nice| parameter. The corresponding relative + * adjustments are: + * + * PR_PRIORITY_LOW +1 + * PR_PRIORITY_NORMAL 0 + * PR_PRIORITY_HIGH -1 + * PR_PRIORITY_URGENT -2 + */ +static int pt_RelativePriority(int nice, PRThreadPriority pri) +{ + return nice + (1 - pri); +} #endif /* @@ -133,11 +139,18 @@ static void *_pt_root(void *arg) #ifdef _PR_NICE_PRIORITY_SCHEDULING /* * We need to know the kernel thread ID of each thread in order to - * set its priority hence we do it here instead of at creation time. + * set its nice value hence we do it here instead of at creation time. */ tid = gettid(); + errno = 0; + rv = getpriority(PRIO_PROCESS, 0); - rv = setpriority(PRIO_PROCESS, tid, pt_PriorityMap(thred->priority)); + /* If we cannot read the main thread's nice value don't try to change the + * new thread's nice value. */ + if (errno == 0) { + setpriority(PRIO_PROCESS, tid, + pt_RelativePriority(rv, thred->priority)); + } PR_Lock(pt_book.ml); thred->tid = tid; @@ -688,14 +701,22 @@ PR_IMPLEMENT(void) PR_SetThreadPriority(PRThread *thred, PRThreadPriority newPri PR_WaitCondVar(pt_book.cv, PR_INTERVAL_NO_TIMEOUT); PR_Unlock(pt_book.ml); - rv = setpriority(PRIO_PROCESS, thred->tid, pt_PriorityMap(newPri)); + errno = 0; + rv = getpriority(PRIO_PROCESS, 0); - if (rv == -1 && errno == EPERM) - { - /* We don't set pt_schedpriv to EPERM because adjusting the nice - * value might be permitted for certain ranges but not others */ - PR_LOG(_pr_thread_lm, PR_LOG_MIN, - ("PR_SetThreadPriority: no thread scheduling privilege")); + /* Do not proceed unless we know the main thread's nice value. */ + if (errno == 0) { + rv = setpriority(PRIO_PROCESS, thred->tid, + pt_RelativePriority(rv, newPri)); + + if (rv == -1) + { + /* We don't set pt_schedpriv to EPERM in case errno == EPERM + * because adjusting the nice value might be permitted for certain + * ranges but not for others. */ + PR_LOG(_pr_thread_lm, PR_LOG_MIN, + ("PR_SetThreadPriority: no thread scheduling privilege")); + } } #endif diff --git a/nsprpub/pr/tests/vercheck.c b/nsprpub/pr/tests/vercheck.c index 3ba852e0aed..8b98d87a88c 100644 --- a/nsprpub/pr/tests/vercheck.c +++ b/nsprpub/pr/tests/vercheck.c @@ -20,9 +20,9 @@ #include /* - * This release (4.9.6) is backward compatible with the + * This release (4.10) is backward compatible with the * 4.0.x, 4.1.x, 4.2.x, 4.3.x, 4.4.x, 4.5.x, 4.6.x, 4.7.x, - * 4.8.x, 4.9, 4.9.1, 4.9.2, 4.9.3, 4.9.4, and 4.9.5 releases. + * 4.8.x, and 4.9.x releases. * It, of course, is compatible with itself. */ static char *compatible_version[] = { @@ -36,6 +36,7 @@ static char *compatible_version[] = { "4.8", "4.8.1", "4.8.2", "4.8.3", "4.8.4", "4.8.5", "4.8.6", "4.8.7", "4.8.8", "4.8.9", "4.9", "4.9.1", "4.9.2", "4.9.3", "4.9.4", "4.9.5", + "4.9.6", PR_VERSION }; @@ -51,8 +52,8 @@ static char *incompatible_version[] = { "3.0", "3.0.1", "3.1", "3.1.1", "3.1.2", "3.1.3", "3.5", "3.5.1", - "4.9.7", - "4.10", "4.10.1", + "4.10.1", + "4.11", "4.11.1", "10.0", "11.1", "12.14.20" }; From 0718f3703d2f48248b9e471d6643cb2e4596ebf5 Mon Sep 17 00:00:00 2001 From: Chris Peterson Date: Tue, 23 Apr 2013 16:00:44 -0700 Subject: [PATCH 009/155] Bug 864339 - Part 2: Replace GeckoJarReader EmptyStackException with an empty() check. r=wesj --- mobile/android/base/util/GeckoJarReader.java | 34 ++++++++------------ 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/mobile/android/base/util/GeckoJarReader.java b/mobile/android/base/util/GeckoJarReader.java index 754b271ac0d..a4521d14a5c 100644 --- a/mobile/android/base/util/GeckoJarReader.java +++ b/mobile/android/base/util/GeckoJarReader.java @@ -16,7 +16,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; -import java.util.EmptyStackException; import java.util.Stack; /* Reads out of a multiple level deep jar file such as @@ -99,30 +98,25 @@ public final class GeckoJarReader { return new NativeZip(fileUrl.getPath()); } - private static InputStream getStream(NativeZip zip, Stack jarUrls) throws IOException { + private static InputStream getStream(NativeZip zip, Stack jarUrls) { InputStream inputStream = null; - try { - // loop through children jar files until we reach the innermost one - while (jarUrls.peek() != null) { - String fileName = jarUrls.pop(); - if (inputStream != null) { - // intermediate NativeZips and InputStreams will be garbage collected. - zip = new NativeZip(inputStream); - } + // loop through children jar files until we reach the innermost one + while (!jarUrls.empty()) { + String fileName = jarUrls.pop(); - inputStream = zip.getInputStream(fileName); - if (inputStream == null) { - Log.d(LOGTAG, "No Entry for " + fileName); - return null; - } - - // if there is nothing else on the stack, this will throw and break us out of the loop - jarUrls.peek(); + if (inputStream != null) { + // intermediate NativeZips and InputStreams will be garbage collected. + zip = new NativeZip(inputStream); + } + + inputStream = zip.getInputStream(fileName); + if (inputStream == null) { + Log.d(LOGTAG, "No Entry for " + fileName); + return null; } - } catch (EmptyStackException ex) { - Log.d(LOGTAG, "Jar reader reached end of stack"); } + return inputStream; } From b668808b8505a8e1d8331183e4e4d160170a984e Mon Sep 17 00:00:00 2001 From: James Willcox Date: Thu, 25 Apr 2013 16:27:43 -0400 Subject: [PATCH 010/155] Bug 862448 - Fix the fast fencing path for GL when drawing buffer is preserved r=jgilbert --- gfx/gl/SurfaceStream.cpp | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/gfx/gl/SurfaceStream.cpp b/gfx/gl/SurfaceStream.cpp index 8453a09495e..e65718b7051 100644 --- a/gfx/gl/SurfaceStream.cpp +++ b/gfx/gl/SurfaceStream.cpp @@ -311,26 +311,20 @@ SurfaceStream_TripleBuffer_Copy::SwapProducer(SurfaceFactory* factory, RecycleScraps(factory); if (mProducer) { - if (mStaging && mStaging->Type() != factory->Type()) + if (mStaging) { + // We'll re-use this for a new mProducer later on if + // the size remains the same Recycle(factory, mStaging); + } - if (!mStaging) - New(factory, mProducer->Size(), mStaging); - - if (!mStaging) - return nullptr; - - SharedSurface::Copy(mProducer, mStaging, factory); - // Fence now, before we start (maybe) juggling Prod around. + Move(mProducer, mStaging); mStaging->Fence(); - if (mProducer->Size() != size) - Recycle(factory, mProducer); - } - - // The old Prod (if there every was one) was invalid, - // so we need a new one. - if (!mProducer) { + New(factory, size, mProducer); + + if (mProducer && mStaging->Size() == mProducer->Size()) + SharedSurface::Copy(mStaging, mProducer, factory); + } else { New(factory, size, mProducer); } From 198d012d16e4f471443d670f6851d783eeb610be Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Thu, 25 Apr 2013 13:31:50 -0700 Subject: [PATCH 011/155] Bug 851581 - Clean up external protocol prompt. r=mfinkle --- mobile/android/base/GeckoAppShell.java | 6 ++-- .../components/ContentDispatchChooser.js | 35 +++++++++++++++---- .../locales/en-US/chrome/handling.properties | 5 +++ mobile/android/locales/jar.mn | 1 + 4 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 mobile/android/locales/en-US/chrome/handling.properties diff --git a/mobile/android/base/GeckoAppShell.java b/mobile/android/base/GeckoAppShell.java index b091b67fba9..39be90b775d 100644 --- a/mobile/android/base/GeckoAppShell.java +++ b/mobile/android/base/GeckoAppShell.java @@ -801,8 +801,10 @@ public class GeckoAppShell static String[] getHandlersForURL(String aURL, String aAction) { // aURL may contain the whole URL or just the protocol Uri uri = aURL.indexOf(':') >= 0 ? Uri.parse(aURL) : new Uri.Builder().scheme(aURL).build(); - Intent intent = getIntentForActionString(aAction); - intent.setData(uri); + + Intent intent = getOpenURIIntent(GeckoApp.mAppContext, uri.toString(), "", + TextUtils.isEmpty(aAction) ? Intent.ACTION_VIEW : aAction, ""); + return getHandlersForIntent(intent); } diff --git a/mobile/android/components/ContentDispatchChooser.js b/mobile/android/components/ContentDispatchChooser.js index 03e7e28c0a4..0d77982a2ff 100644 --- a/mobile/android/components/ContentDispatchChooser.js +++ b/mobile/android/components/ContentDispatchChooser.js @@ -4,6 +4,7 @@ const Ci = Components.interfaces; const Cu = Components.utils; +const Cc = Components.classes; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); @@ -16,6 +17,19 @@ ContentDispatchChooser.prototype = QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentDispatchChooser]), + get protoSvc() { + delete this.protoSvc; + return this.protoSvc = Cc["@mozilla.org/uriloader/external-protocol-service;1"].getService(Ci.nsIExternalProtocolService); + }, + + _getChromeWin: function getChromeWin() { + try { + return Services.wm.getMostRecentWindow("navigator:browser"); + } catch (e) { + throw Cr.NS_ERROR_FAILURE; + } + }, + ask: function ask(aHandler, aWindowContext, aURI, aReason) { let window = null; try { @@ -23,15 +37,24 @@ ContentDispatchChooser.prototype = window = aWindowContext.getInterface(Ci.nsIDOMWindow); } catch (e) { /* it's OK to not have a window */ } - let bundle = Services.strings.createBundle("chrome://mozapps/locale/handling/handling.properties"); + // The current list is based purely on the scheme. Redo the query using the url to get more + // specific results. + aHandler = this.protoSvc.getProtocolHandlerInfoFromOS(aURI.spec, {}); - let title = bundle.GetStringFromName("protocol.title"); - let message = bundle.GetStringFromName("protocol.description"); - - let open = Services.prompt.confirm(window, title, message); - if (open) + // The first handler in the set is the Android Application Chooser (which will fall back to a default if one is set) + // If we have more than one option, show a list so the user can choose what to launch with. + if(aHandler.possibleApplicationHandlers.length > 1) { aHandler.launchWithURI(aURI, aWindowContext); + } else { + let win = this._getChromeWin(); + if (win && win.NativeWindow) { + let bundle = Services.strings.createBundle("chrome://browser/locale/handling.properties"); + let text = bundle.GetStringFromName("protocol.failed"); + win.NativeWindow.toast.show(text, "long"); + } + } } + }; this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ContentDispatchChooser]); diff --git a/mobile/android/locales/en-US/chrome/handling.properties b/mobile/android/locales/en-US/chrome/handling.properties new file mode 100644 index 00000000000..88b092b8c3d --- /dev/null +++ b/mobile/android/locales/en-US/chrome/handling.properties @@ -0,0 +1,5 @@ +# 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/. + +protocol.failed=Could not find an app to open this link diff --git a/mobile/android/locales/jar.mn b/mobile/android/locales/jar.mn index 663b27b4e9b..02d598f5256 100644 --- a/mobile/android/locales/jar.mn +++ b/mobile/android/locales/jar.mn @@ -28,3 +28,4 @@ locale/@AB_CD@/browser/prompt.dtd (%chrome/prompt.dtd) locale/@AB_CD@/browser/feedback.dtd (%chrome/feedback.dtd) locale/@AB_CD@/browser/phishing.dtd (%chrome/phishing.dtd) + locale/@AB_CD@/browser/handling.properties (%chrome/handling.properties) From 76da970a9934741cc31250f7c6e011660220cdf5 Mon Sep 17 00:00:00 2001 From: Rob Wood Date: Wed, 24 Apr 2013 12:38:19 -0400 Subject: [PATCH 012/155] Bug 849714 - Fix intermittent failure in outgoing_answer_hangup_oncallschanged; r=jgriffin --- ...t_outgoing_answer_hangup_oncallschanged.js | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/dom/telephony/test/marionette/test_outgoing_answer_hangup_oncallschanged.js b/dom/telephony/test/marionette/test_outgoing_answer_hangup_oncallschanged.js index af5fbd94fb9..f6b46af9417 100644 --- a/dom/telephony/test/marionette/test_outgoing_answer_hangup_oncallschanged.js +++ b/dom/telephony/test/marionette/test_outgoing_answer_hangup_oncallschanged.js @@ -46,16 +46,10 @@ function dial() { is(outgoing.number, number); is(outgoing, telephony.active); - //ok(telephony.calls === calls); // bug 717414 is(telephony.calls.length, 1); is(telephony.calls[0], outgoing); - runEmulatorCmd("gsm list", function(result) { - log("Call list is now: " + result); - is(result[0], "outbound to " + number + " : unknown"); - is(result[1], "OK"); - answer(); - }); + checkCallList(); } if (event.call.state == "disconnected") { @@ -69,6 +63,17 @@ function dial() { telephony.dial(number); } +function checkCallList() { + runEmulatorCmd("gsm list", function(result) { + log("Call list is now: " + result) + if ((result[0] == "outbound to " + number + " : unknown") && (result[1] == "OK")) { + answer(); + } else { + window.setTimeout(checkCallList, 100); + } + }); +} + function answer() { log("Answering the outgoing call."); @@ -82,7 +87,7 @@ function answer() { is(outgoing, telephony.active); runEmulatorCmd("gsm list", function(result) { - log("Call list is now: " + result); + log("Call list (after 'connected' event) is now: " + result); is(result[0], "outbound to " + number + " : active"); is(result[1], "OK"); hangUp(); From bdfd84e9de2c17c3ddfef113c84962f418609876 Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Thu, 25 Apr 2013 13:35:05 -0700 Subject: [PATCH 013/155] Bug 851581 - Whitespace cleanup. r=mfinkle DONTBUILD --- mobile/android/components/ContentDispatchChooser.js | 4 ++-- mobile/android/locales/en-US/chrome/handling.properties | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/android/components/ContentDispatchChooser.js b/mobile/android/components/ContentDispatchChooser.js index 0d77982a2ff..430d27d2d25 100644 --- a/mobile/android/components/ContentDispatchChooser.js +++ b/mobile/android/components/ContentDispatchChooser.js @@ -42,8 +42,8 @@ ContentDispatchChooser.prototype = aHandler = this.protoSvc.getProtocolHandlerInfoFromOS(aURI.spec, {}); // The first handler in the set is the Android Application Chooser (which will fall back to a default if one is set) - // If we have more than one option, show a list so the user can choose what to launch with. - if(aHandler.possibleApplicationHandlers.length > 1) { + // If we have more than one option, let the OS handle showing a list (if needed). + if (aHandler.possibleApplicationHandlers.length > 1) { aHandler.launchWithURI(aURI, aWindowContext); } else { let win = this._getChromeWin(); diff --git a/mobile/android/locales/en-US/chrome/handling.properties b/mobile/android/locales/en-US/chrome/handling.properties index 88b092b8c3d..3e08919ec5d 100644 --- a/mobile/android/locales/en-US/chrome/handling.properties +++ b/mobile/android/locales/en-US/chrome/handling.properties @@ -2,4 +2,4 @@ # 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/. -protocol.failed=Could not find an app to open this link +protocol.failed=Couldn't find an application to open this link From d9e7df5f65ab89b4551ea62ea375c60368d49b2d Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Thu, 25 Apr 2013 16:34:30 -0400 Subject: [PATCH 014/155] Bug 863958 - Don't call SetSize from the ICO decoder if we already have the size. r=seth --HG-- extra : rebase_source : 924fbe8460992b919d3d7072d162f23eaef30e2f --- image/decoders/nsICODecoder.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/image/decoders/nsICODecoder.cpp b/image/decoders/nsICODecoder.cpp index e08fdb4723f..395965ccd46 100644 --- a/image/decoders/nsICODecoder.cpp +++ b/image/decoders/nsICODecoder.cpp @@ -349,7 +349,7 @@ nsICODecoder::WriteInternal(const char* aBuffer, uint32_t aCount) return; } - if (mContainedDecoder->HasSize()) { + if (!HasSize() && mContainedDecoder->HasSize()) { PostSize(mContainedDecoder->GetImageMetadata().GetWidth(), mContainedDecoder->GetImageMetadata().GetHeight()); } From 6205ca16e1af5a5db24b86ead7146d46d33d3dc4 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Thu, 25 Apr 2013 16:35:03 -0400 Subject: [PATCH 015/155] Bug 863958 - Crashtest. r=seth --HG-- extra : rebase_source : 5f1fa4cd01aba2b1a9b07a8120711b58d36f5ddf --- image/test/crashtests/crashtests.list | 5 +++++ image/test/crashtests/multiple-png-hassize.ico | Bin 0 -> 18096 bytes 2 files changed, 5 insertions(+) create mode 100644 image/test/crashtests/multiple-png-hassize.ico diff --git a/image/test/crashtests/crashtests.list b/image/test/crashtests/crashtests.list index aebef5decd9..5c76b20b3f3 100644 --- a/image/test/crashtests/crashtests.list +++ b/image/test/crashtests/crashtests.list @@ -32,3 +32,8 @@ load 681190.html skip-if(Android&&smallScreen) load 694165-1.xhtml # nexus-s Android 2.3.6 load 732319-1.html load 844403-1.html + +# Bug 863958 +# This icon's size is such that it leads to multiple writes to the PNG decoder +# after we've gotten our size. +load multiple-png-hassize.ico diff --git a/image/test/crashtests/multiple-png-hassize.ico b/image/test/crashtests/multiple-png-hassize.ico new file mode 100644 index 0000000000000000000000000000000000000000..6944220018d0b486d7d21598f26a1d1a1739a5c6 GIT binary patch literal 18096 zcmeHP3p7+)A3w$n<5d%hCO2bH;SS>}luKhwdE`|dk#eWdgX>X52;-4RH}s;sDvA_? zQXV6^DcuN3scs=Aq`XFX4b44!G<_|rzHhB>t$WwHYn{E;KKu3m{rCUubJpJH{LX(L z2oi$O5Do{yDFNDzhM@Hj1j)LPBXSYkY43nUz|ghR6!4hI<*~#l=RWm&e~wApNI@f2^VF;kW7`tMwS}0wAcUs z%TkAJAA3%j_McwoLSC2rdTM&IPBtdWK2_EcrE~R>SMafymvcf7y@@T7kf_azNGr1> zSQ#5tXsGMk$uA}NnDnmjKjACwqI#+H>{fQiV(dd(XCac)=7`0c>5hf?BNzRTg@mb3 z8bw}THr!H>8?TPVTrMKY%eKc5Vy}h9PNN*!kE>G$r1psKaS-L4_s(|7F}yW@KJ*j9D>`&&>Loh9h2$j&>W2JTGWz^R^BYRWUXDRN@w0rfrLsknQXq zl}oUT$M2SrYWYN=@ys+Lt0wj9FRS}y7gE~2RIm$Q2jzvm?7n>wugzAb`6+S=``y?} zl+9boJ$s6OH?7I&bz^(o!T%}G!R3DNTdpN^a+J=t(u*H|=gWGbM5(xMHxM2EXn68D zSHwR7r-nlBEpff?z!eKcH|mfUH9B4hDo^u#5T>8Jdo14~J?=D);DeUD+dC!69W!h0 zSp=;vI`ej4zHsm*vfO>Ogt5|%GjGH=N!`C;J7XA*+eZEJp7&i>uuh|egY`96iM{fm_ zghs6>p?%Wxk85QFH}pp{&Uh+fJ?C%D)>{1Dw=SsR?P(=;z1_##>s8+v;T9TfP4~_r zJyPjWqX*ja!t%rQ{%||l8Hw`g<+-gS8%eZ1^u4a$&V5x&;^4dFdzw3+%;c2W<}i+~ zG^)-Ii@MvR!POqEsN`O*B%sEo^>UeEMRa}FjN$%i&Vz$4xATY4+^ABibXL!VpP|b5 zEyV?#aGA)%kYvinCB<%6alOYreGEH#K=)l~iWU5!s_b7DLGj8-!B0ivOUNc>V zX;J+UjNKd2RK1lub|VfqZyZyqTxYX>RqdW5-3!PH@rgxTbQu)6^GcVqrC8LM;=q`? zKW;7Ucw?I`;exTx%6P(|s{^`cvZe#CY$(W^A4|NaE*vx5@I*K0v++WXYG|SamGZ3mp<-d@`^f{#k&eB-w%0EX^WM6 z`{!Nwi8^opVA;=N3s@2j=|L*R%0qV6_h^3X;HaNX{uJ#Pi;FwG;5-$DuYS&QHxwD# z!fXiWOM+e;JaJ|9GBtA1bCYAmYY6mr^i}=QK_LUGXNty%?}Uk#*G2OmDNy&<(c3J4 zZIeJZ$Fee`Jh$dSZ!nek(>z?#0-*v^S6iX*?#sKo-^;w_{F)~JemP29D{on3M0l=@ z=(5DES%1Vs5d|%;mi~G0NV_mkE864gy-0C#WR2B$>=aaI+1(`NKQ);@nO|I<)V*+b zBx6+5uiMPkV$fUvk?ZXl?QKsow^Vmo9I#}}H_7x(-Q`KmbZN+B3L04q=xeW`_KLsCX0Kx?*xp0uL6f)kUcJ|FK?=uwm{LL9|Azd_B@gc# z@k*k4C;Q+T@Mfk-L_0>KczfIr($-OHHYqAxZnmeay&j|`+gjHCquf$e8*Z?cz3`y0s>`#15rg7+fp$*8HZw=8dh(RO$?u`rqx;=^Cn2 zY>$u9wSjUi;9L2>-S^1KiL9K+%89I;|NqJfKfOcp{FSpa$Z+ECTsegv%&wfL94fu< zkZ}$f7W;S9T))O>$?1VK(e6SH`8p`QW~}8DL|fL0Z4qe@!5f!fOVr-qWvV?)xXlV3 zniw>5aOfEy4e$}dcR~`;*`>O5$;8uQEepwxgQ|*w(l3~I{;08gWWBzDl>AQe@{CdX zlXn~Ydb9l)stn9ZoHFz=LPIa>u$?ekc!ApbLG5g_#?d@xk_x0OK5^i{P+U^Nvy+hT ziVzpKb+p!zboy@zE7MsX?6X);&X$WIB3|A!N)O&E%02BRXG_eu`!-v8;;0N|saw%A zrOu#!%%CVUt3o}`Rm42?+y=JsbZF~^@ShxN&-&PzJ5vrsGFT!F4mlw*-j2@h&I9;? zx49V1&P9Eu%!H(K9cd>lltZ=p9jiuBXEC8#+sxLp`%2jlbGLOYFU*S7SbZd>jijn& znUl?vs?rN6QOywEP`OCM%jelVi>^%PxYopxnx_@m)jJGU#CJ2x$L*`?lPaZFtHv&W zES-GxoEY9yel_(H+OtI2>38eLpnsgy?Xrh9hrI1alSc>%N6eFOO1qHGV4m_}C9OR|hCJ0okwh@OV4|=V|3oOZ`3G&jxFG1Vv?j)Ff&1 zg5B+St;w6_>KXc42aInT85!XLd4LV@59B2!CVz<;8Ckr^_Z>W78;ldgCSU`MrNfbT z{fej-gGyE|G=l;C_#sTyn6&cMJ0pkGo zUkz;7zxO@A4&cGHm>UFr1N=^p-GXK&jHLrSh`V<5!{;`{zji=g5I|mVZvZ^Fo}U99 z+ygMSNuUFqOGQ~fUk9*bE>0Vo5L6=! zK@6eUIJbRnSs({60Q(K%6nXtaUjLBSKZKP>Sb2n%N4{qx-?NeL+5i0aZ1B>D_|+hO zHHcpg;#Y(C)gXQ~h+hrjSA%$@A|9!TN9w=WBNZW55n>e~RuN(qAyyG$6(Lp;Vih4) z|9N5+@vA}nY6Q+Bf)w$qnf2E~{A&K=Era;gAloXCZ57|zFOTeYMRvO)yIqn0L?Hi( MK>ic)ulrBLUqNm8)&Kwi literal 0 HcmV?d00001 From 60014f40bc5a9634aec880f89ee34a2efc4f37e8 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Thu, 25 Apr 2013 16:35:23 -0400 Subject: [PATCH 016/155] Bug 863975 - Handle the situation that we're left mid-frame when decoding a multi-frame image. r=seth --HG-- extra : rebase_source : e485eb48a615f3e35e4e5592d0f37604402142f8 --- image/src/Decoder.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/image/src/Decoder.cpp b/image/src/Decoder.cpp index aaea351bffe..7b016d7394c 100644 --- a/image/src/Decoder.cpp +++ b/image/src/Decoder.cpp @@ -163,6 +163,9 @@ Decoder::Finish(RasterImage::eShutdownIntent aShutdownIntent) // If we're usable, do exactly what we should have when the decoder // completed. if (usable) { + if (mInFrame) { + PostFrameStop(); + } PostDecodeDone(); } else { if (mObserver) { From 639834377f99e61f13430d7703955691f78d226d Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Thu, 25 Apr 2013 16:35:38 -0400 Subject: [PATCH 017/155] Bug 863975 - Crashtest. r=seth --HG-- extra : rebase_source : 2816b2f65b49091914c643357275c169911a4b2f --- image/test/crashtests/crashtests.list | 2 ++ .../test/crashtests/truncated-second-frame.png | Bin 0 -> 72247 bytes 2 files changed, 2 insertions(+) create mode 100644 image/test/crashtests/truncated-second-frame.png diff --git a/image/test/crashtests/crashtests.list b/image/test/crashtests/crashtests.list index 5c76b20b3f3..204db592a40 100644 --- a/image/test/crashtests/crashtests.list +++ b/image/test/crashtests/crashtests.list @@ -33,6 +33,8 @@ skip-if(Android&&smallScreen) load 694165-1.xhtml # nexus-s Android 2.3.6 load 732319-1.html load 844403-1.html +load truncated-second-frame.png # bug 863975 + # Bug 863958 # This icon's size is such that it leads to multiple writes to the PNG decoder # after we've gotten our size. diff --git a/image/test/crashtests/truncated-second-frame.png b/image/test/crashtests/truncated-second-frame.png new file mode 100644 index 0000000000000000000000000000000000000000..0aef5e44de75032889972f64af21d27c571c9baa GIT binary patch literal 72247 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 Date: Thu, 25 Apr 2013 13:39:43 -0700 Subject: [PATCH 018/155] Bug 864633 - broken site identity info bar. r=bsmith --HG-- extra : rebase_source : 36c4613ed39ab93c33008964ed62bccdcacc9c9c --- b2g/confvars.sh | 1 + configure.in | 13 ++++++++++--- security/manager/ssl/src/nsNSSCertificateDB.cpp | 3 ++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/b2g/confvars.sh b/b2g/confvars.sh index cda5d84dc6f..21cc5e083d6 100644 --- a/b2g/confvars.sh +++ b/b2g/confvars.sh @@ -25,6 +25,7 @@ MOZ_CAPTIVEDETECT=1 MOZ_WEBSMS_BACKEND=1 MOZ_DISABLE_CRYPTOLEGACY=1 MOZ_APP_STATIC_INI=1 +NSS_NO_LIBPKIX=1 if test "$OS_TARGET" = "Android"; then MOZ_CAPTURE=1 diff --git a/configure.in b/configure.in index 5d169c74a79..656cb6ac00b 100644 --- a/configure.in +++ b/configure.in @@ -223,7 +223,6 @@ if test -n "$gonkdir" ; then AC_DEFINE(HAVE_PTHREADS) CROSS_COMPILE=1 MOZ_CHROME_FILE_FORMAT=omni - NSS_NO_LIBPKIX=1 direct_nspr_config=1 else MOZ_ANDROID_NDK @@ -4268,6 +4267,7 @@ MOZ_SYS_MSG= MOZ_TIME_MANAGER= MOZ_PAY= MOZ_AUDIO_CHANNEL_MANAGER= +NSS_NO_LIBPKIX= case "$target_os" in mingw*) @@ -6429,6 +6429,15 @@ if test -n "$MOZ_DISABLE_CRYPTOLEGACY"; then fi AC_SUBST(MOZ_DISABLE_CRYPTOLEGACY) +dnl ======================================================== +dnl = Disable libpkix +dnl ======================================================== +if test -n "$NSS_NO_LIBPKIX"; then + AC_DEFINE(NSS_NO_LIBPKIX) +fi +AC_SUBST(NSS_NO_LIBPKIX) + + dnl ======================================================== dnl = dnl = Module specific options @@ -8525,8 +8534,6 @@ AC_SUBST(MOZ_PERMISSIONS) AC_SUBST(MOZ_PREF_EXTENSIONS) AC_SUBST(MOZ_JS_LIBS) AC_SUBST(MOZ_PSM) -AC_DEFINE(NSS_NO_LIBPKIX) -AC_SUBST(NSS_NO_LIBPKIX) AC_SUBST(MOZ_DEBUG) AC_SUBST(MOZ_DEBUG_SYMBOLS) AC_SUBST(MOZ_DEBUG_ENABLE_DEFS) diff --git a/security/manager/ssl/src/nsNSSCertificateDB.cpp b/security/manager/ssl/src/nsNSSCertificateDB.cpp index 31ef1e235d1..09697614b29 100644 --- a/security/manager/ssl/src/nsNSSCertificateDB.cpp +++ b/security/manager/ssl/src/nsNSSCertificateDB.cpp @@ -1359,11 +1359,12 @@ nsNSSCertificateDB::FindCertByEmailAddress(nsISupports *aToken, const char *aEma #ifndef NSS_NO_LIBPKIX } else { + nsresult nsrv; nsCOMPtr inss = do_GetService(kNSSComponentCID, &nsrv); if (!inss) return nsrv; RefPtr survivingParams; - nsresult nsrv = inss->GetDefaultCERTValInParam(survivingParams); + nsrv = inss->GetDefaultCERTValInParam(survivingParams); if (NS_FAILED(nsrv)) return nsrv; CERTValOutParam cvout[1]; From abaa3fbfde25d2374112caabfd913ec70f354f63 Mon Sep 17 00:00:00 2001 From: Camilo Viecco Date: Thu, 25 Apr 2013 13:40:26 -0700 Subject: [PATCH 019/155] Bug 864633 - broken site identity info bar part2 (tests from 813418). r=bsmith --HG-- extra : rebase_source : b9acce3f6db1b1560b5e9928e8b3794ead151bc1 --- build/pgo/certs/cert8.db | Bin 65536 -> 65536 bytes build/pgo/certs/evintermediate.ca | 34 ++++++++++ build/pgo/certs/evroot.ca | 32 +++++++++ build/pgo/certs/key3.db | Bin 69632 -> 98304 bytes build/pgo/server-locations.txt | 2 + .../manager/ssl/src/nsIdentityChecking.cpp | 21 +++++- .../ssl/tests/mochitest/bugs/Makefile.in | 2 + .../mochitest/bugs/test_ev_validation.html | 52 +++++++++++++++ .../bugs/test_ev_validation_child.html | 62 ++++++++++++++++++ testing/mochitest/Makefile.in | 2 + testing/mochitest/android.json | 1 + testing/mochitest/intermediate-ev-tester.crl | Bin 0 -> 541 bytes testing/mochitest/root-ev-tester.crl | Bin 0 -> 557 bytes 13 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 build/pgo/certs/evintermediate.ca create mode 100644 build/pgo/certs/evroot.ca create mode 100644 security/manager/ssl/tests/mochitest/bugs/test_ev_validation.html create mode 100644 security/manager/ssl/tests/mochitest/bugs/test_ev_validation_child.html create mode 100644 testing/mochitest/intermediate-ev-tester.crl create mode 100644 testing/mochitest/root-ev-tester.crl diff --git a/build/pgo/certs/cert8.db b/build/pgo/certs/cert8.db index 3123b417b151a77a7ededbd77dc6e9a7c6fae898..aa38b3b0d57ae2c303d6873e659ee0f288853e3e 100644 GIT binary patch literal 65536 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

}-#DC2qjn9%ro9ChFN^$g2Co=;A z+`QMj_>(kg<4a9POELZF$`mHeaon!&Iw9(>v?xI0xUloeB+beJTV~FSlO2rqdWqDX zm7EU!BomQdHy5^@CwHg|4$5(CSyf?xrdNey&>TC*(8h4^$KkwxPdzo5)Sv$ryvBgT)dru`5i~R2+C>lv5c_#j6Gi z*kjDP37%UAoK;d{w)nO#UlPD8jQ^7MJZ5vq;H7%PK3D1Yygqqu0@X}2y4c~c9%4B5 zR_`O&0)y#0)f{MgjPG{dY|5%zqd`TGTR)kubE6T4h6BYwkOu@!ZWVC9k|)%bLHwD2 zE_B$h0KauBWmY7OIY_rk8kqoNh5VSD39uho(JbfJ;m{c*HBGfKku-*r@J|AS{M0UZ z!(M0=Rb4m5zcInuK$Rv@(w*#e{e%9RB(0pBp^xJAv%lhncT;FjOwO%ah|ZuF3zlr-dt*Vn8(g+jmfEu zx}{;gp&Pf}{OmDf>4$vn>$`Yjgy`od+@wN}owfKx-kUhn;ag4x%zr|qod zUY*3hzdwQYF8xt$&&|i#J)Y}*Pn$2l(~@6$O}b=fr5ic^(V2vywW8^#w5gVs3XS`m z&Zf_$6p>t=-1X92t6jq@5?sO_z1-JohayyJ=Uv_keMFf;-V(=G4$=N*_x-D3nI1Bm;!FV^|&&f|B+#Bq*~`BlAs4)0x+-D|Mg zujY%Avy9C)ZHPYg#4pUNH_)Z)nCg}5br<+#LZe>HzZDeUy=E61mi#c5lVj`oO$UX~ zA2C%>5PZ9e@+65(Ca)Ru*+R!LuDUCWX z`iwk={Yx0vzvZCJ5>zx)00o&+gUM*1R957GugSmX_WV=fEfT_C?8$l-FvDr1)n-ju znNDp6RpW9>+S&o~v-M4c0i|s`c+!m)IBMV9;04=08NNSJb>VKvGM~1-evbG}B0iWM zgV#m5m7;tirne_1#?7tbIdno{_8YAw+_<8Os1r`n`8?hGYBN(#F7@xd(oHD9o5y9R zyxROWF7C*7X=U%>kVFT@tJMg}QAh0`d5-_UvPrB=yBxG1lYDymYKOTUGJ7vA@S7Lv z^|B!^1S`F&onPnnnmCs#8=s1~*-J}zMV3pOFLgin5 zd8;)4SsTlf5f*)7JLPX^t`;r0!N5K=a9feS>4D+RsDbE|Sy|7+T9i8n)41-6Z@pml zKEk7fjdQfVEXQ(WBI$44{$UXoKmreaA8P=OP&TRI25^&Vpdq8eq)zp*BB_lF=I{lH zdjvj!03ZMe00MvjAOHve0)PM@00;mAfB+x>2mk_r03ZMe00MvjAOHve0)PM@00;mA zfB+x>2mk_r03ZMe00MvjAOHve0)PM@00;mAfB+x>2mk_r03ZMe00MvjAOHve0)PM@ P00;mAfB+!yza{X0cco0F delta 60 zcmV-C0K@-)fCPYm1duxcAhA5eKLIF{0YFg%>MlSpvvEKj9kYNy%@MOeZ@>@%7?S~j SF$8BWoi4G_XD+jyu47SUvlVIp diff --git a/build/pgo/certs/evintermediate.ca b/build/pgo/certs/evintermediate.ca new file mode 100644 index 00000000000..17a048ad86c --- /dev/null +++ b/build/pgo/certs/evintermediate.ca @@ -0,0 +1,34 @@ +-----BEGIN CERTIFICATE----- +MIIF9zCCBN+gAwIBAgIBAzANBgkqhkiG9w0BAQUFADCB4TELMAkGA1UEBhMCVVMx +CzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MSMwIQYDVQQKExpN +b3ppbGxhIC0gRVYgZGVidWcgdGVzdCBDQTEdMBsGA1UECxMUU2VjdXJpdHkgRW5n +aW5lZXJpbmcxJjAkBgNVBAMTHUVWIFRlc3RpbmcgKHVudHJ1c3R3b3J0aHkpIENB +MRMwEQYDVQQpEwpldi10ZXN0LWNhMSwwKgYJKoZIhvcNAQkBFh1jaGFybGF0YW5A +dGVzdGluZy5leGFtcGxlLmNvbTAeFw0xMzAyMTQxNzU5MDlaFw0yMzAyMTIxNzU5 +MDlaMIHRMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50 +YWluIFZpZXcxIzAhBgNVBAoTGk1vemlsbGEgLSBFViBkZWJ1ZyB0ZXN0IENBMR0w +GwYDVQQLExRTZWN1cml0eSBFbmdpbmVlcmluZzEWMBQGA1UEAxMNaW50ZXJtZWRp +YXRlMzETMBEGA1UEKRMKZXYtdGVzdC1jYTEsMCoGCSqGSIb3DQEJARYdY2hhcmxh +dGFuQHRlc3RpbmcuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDAfzrlJdawr7v8m7lslODk5FTqCiBO7tPxnWhAOEL5g05knLTZTc5J +3ywmGoW6ae6RwPlWuqRuFd2Ea+yCawyjkUoLOpFH/xziDzvaS6LXNdJoxQqWk/LX +8YYQVFfmxh8E11fz74IoCzX++mY1byaNONf3bLU2HU8vnVvENr1gy9Bzpm8wUuKm +HkBYuG0SVzaeym2H/mo5PJICPVhPa+YxfEVS8EIFCigXGH7xrz/bPXnpfgsSJTnN +4amBNkORfjf7H9x6IWkJGEkIvkVoYKT4iQ9q6/C4YDjWa9p5lA4F/qxnJefezH/I +6hcqEODSaDsY+I6vsN8ks8r8MTTnd7BjAgMBAAGjggHGMIIBwjAdBgNVHQ4EFgQU +fluXMAT0ZS21pV13vv46m8k7nRkwggEYBgNVHSMEggEPMIIBC4AUyJg651hwk+3B +V0rQvQZv9n2bWPahgeekgeQwgeExCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEW +MBQGA1UEBxMNTW91bnRhaW4gVmlldzEjMCEGA1UEChMaTW96aWxsYSAtIEVWIGRl +YnVnIHRlc3QgQ0ExHTAbBgNVBAsTFFNlY3VyaXR5IEVuZ2luZWVyaW5nMSYwJAYD +VQQDEx1FViBUZXN0aW5nICh1bnRydXN0d29ydGh5KSBDQTETMBEGA1UEKRMKZXYt +dGVzdC1jYTEsMCoGCSqGSIb3DQEJARYdY2hhcmxhdGFuQHRlc3RpbmcuZXhhbXBs +ZS5jb22CCQCvxT0iZiZJMjAMBgNVHRMEBTADAQH/MDYGA1UdHwQvMC0wK6ApoCeG +JWh0dHA6Ly9leGFtcGxlLmNvbS9yb290LWV2LXRlc3Rlci5jcmwwPwYDVR0gBDgw +NjA0BgRVHSAAMCwwKgYIKwYBBQUHAgEWHmh0dHA6Ly9teXRlc3Rkb21haW4ubG9j +YWwvY3BzOzANBgkqhkiG9w0BAQUFAAOCAQEAC4grNTV5K8yqiAJ/0f6oIkTMqyJ4 +lyHXvvKXMHTpRZ7Jdy0aq5KTSHswx64ZRN7V2ds+czzDWgxX3rBuZZAgOW1JYva3 +Ps3XRYUiaTW8eeaWjuVRFAp7ytRmSsOGeOtHbez8jDmTqPRQ1mTMsMzpY4bFD8do +5y0xsbz4DYIeeNnX9+XGB5u2ml8t5L8Cj65wwMAx9HlsjTrfQTMIwpwbNle6GuZ3 +9FzmE2piAND73yCgU5W66K2lZg8N6vHBq0UhPDCF72y8MlHxQOpTr3/jIGr4X7k9 +uyYq0Pw5Y/LKyGbyW5iMFdLzabm1ua8IWAf7DSFMH6L3WlK8mngCfJ1icQ== +-----END CERTIFICATE----- diff --git a/build/pgo/certs/evroot.ca b/build/pgo/certs/evroot.ca new file mode 100644 index 00000000000..df220e446c4 --- /dev/null +++ b/build/pgo/certs/evroot.ca @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFljCCBH6gAwIBAgIJAK/FPSJmJkkyMA0GCSqGSIb3DQEBBQUAMIHhMQswCQYD +VQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxIzAh +BgNVBAoTGk1vemlsbGEgLSBFViBkZWJ1ZyB0ZXN0IENBMR0wGwYDVQQLExRTZWN1 +cml0eSBFbmdpbmVlcmluZzEmMCQGA1UEAxMdRVYgVGVzdGluZyAodW50cnVzdHdv +cnRoeSkgQ0ExEzARBgNVBCkTCmV2LXRlc3QtY2ExLDAqBgkqhkiG9w0BCQEWHWNo +YXJsYXRhbkB0ZXN0aW5nLmV4YW1wbGUuY29tMB4XDTEzMDIxNDE3NDkwMFoXDTIz +MDIxMjE3NDkwMFowgeExCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UE +BxMNTW91bnRhaW4gVmlldzEjMCEGA1UEChMaTW96aWxsYSAtIEVWIGRlYnVnIHRl +c3QgQ0ExHTAbBgNVBAsTFFNlY3VyaXR5IEVuZ2luZWVyaW5nMSYwJAYDVQQDEx1F +ViBUZXN0aW5nICh1bnRydXN0d29ydGh5KSBDQTETMBEGA1UEKRMKZXYtdGVzdC1j +YTEsMCoGCSqGSIb3DQEJARYdY2hhcmxhdGFuQHRlc3RpbmcuZXhhbXBsZS5jb20w +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCk+k5mvnrxhVdVnhaxCeDG +ZC5kcC8951K3xTkh2JMtUpSQL2IoGLOZOWTNY+2wGNyHbdJjKDv1d0bzZfz3yDkB +AbY6OcxS4WkwccKsyIzkdacpYWhi7kEFevm9p7TI8jdrpKmItrlqfZKfteh+K+DF +XZF7xp6zpoUis6dykmk5v8RivpCZl7HIlsOW0wSqCocXWH/WWFgAQyozjW8MgGOL +/eV2aLsx+yg7it9GMMtyidggwvlYM7O8vY0gJqQKXntbHq1zV7jIJ3bXzJceur+G +Ce4HvsRHAQUSl6jUfm00aKkqS+1t3svZURIKM6qWAuIKMGcspv+L8lyn1KImG8M5 +AgMBAAGjggFNMIIBSTAdBgNVHQ4EFgQUyJg651hwk+3BV0rQvQZv9n2bWPYwggEY +BgNVHSMEggEPMIIBC4AUyJg651hwk+3BV0rQvQZv9n2bWPahgeekgeQwgeExCzAJ +BgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEj +MCEGA1UEChMaTW96aWxsYSAtIEVWIGRlYnVnIHRlc3QgQ0ExHTAbBgNVBAsTFFNl +Y3VyaXR5IEVuZ2luZWVyaW5nMSYwJAYDVQQDEx1FViBUZXN0aW5nICh1bnRydXN0 +d29ydGh5KSBDQTETMBEGA1UEKRMKZXYtdGVzdC1jYTEsMCoGCSqGSIb3DQEJARYd +Y2hhcmxhdGFuQHRlc3RpbmcuZXhhbXBsZS5jb22CCQCvxT0iZiZJMjAMBgNVHRME +BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAcKVLC9MbdSZjzkVBseCm6t49aIIBm +xQrsTNV2Gnp5eIXBfUhNAfD0zbBcKHK9AfHmNT8ZK6iABjiOrnn6yQNufW5MMdNx ++/4FtTmdlBPLpyuBY7re+XbIaPxr/jB9jJ1pmh52xH3wMkO7ATDQ2fqFnODFrUKS +UpXzuydPnsCdu32KPSnewIrkDB10Sah7vw3uwASO2GWqaFtUDFWGpt6rYQTcOF8g +7a6Zj0johBMQFHE3HDRebWxiOf21ppN/tvv0gtGiA0ZIXBezeLaJ+Hob1xTbi4sw +sGYDKHPCrLuTZWXmkv0rAIkLLK4VHbsA5xYPQNJJsTpX3u0Z0vZxJd9/ +-----END CERTIFICATE----- diff --git a/build/pgo/certs/key3.db b/build/pgo/certs/key3.db index f4edf2e72fbfede0ad14ff150df337352a729964..a99595c52a9f799b96b1a081e885916aa8e90237 100644 GIT binary patch delta 3400 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 delta 138 zcmZo@U~5>wGC^IGnSp_U3yArFm>q~&fLLdujWi?c#EUr_kJ#vMW;FQEzxlsCqkFrNt j7^RsP6*z3V;LN<)dGlVINeV(h#Xf8x#hWX?wMzm3!qz60 diff --git a/build/pgo/server-locations.txt b/build/pgo/server-locations.txt index dbc0cf4af3f..98c7d3f34d3 100644 --- a/build/pgo/server-locations.txt +++ b/build/pgo/server-locations.txt @@ -101,6 +101,8 @@ https://mismatch.expired.example.com:443 privileged,cert=expired https://mismatch.untrusted.example.com:443 privileged,cert=untrusted https://untrusted-expired.example.com:443 privileged,cert=untrustedandexpired https://mismatch.untrusted-expired.example.com:443 privileged,cert=untrustedandexpired +https://ev-valid.example.com:443 privileged,cert=evvalid +https://ev-invalid.example.com:443 priviliged,cert=evinvalid # This is here so that we don't load the default live bookmark over # the network in every test suite. diff --git a/security/manager/ssl/src/nsIdentityChecking.cpp b/security/manager/ssl/src/nsIdentityChecking.cpp index eae0ffd4d7b..cb759b4696d 100644 --- a/security/manager/ssl/src/nsIdentityChecking.cpp +++ b/security/manager/ssl/src/nsIdentityChecking.cpp @@ -113,6 +113,21 @@ static struct nsMyTrustedEVInfo myTrustedEVInfos[] = { * In other words, if you add another list, that uses the same dotted_oid * as an existing entry, then please use the same oid_name. */ + { + // This is the testing EV signature. + // C=US, ST=CA, L=Mountain View, O=Mozilla - EV debug test CA, OU=Security Engineering, CN=EV Testing (untrustworthy) CA/name=ev-test-ca/emailAddress=charlatan@testing.example.com + "1.3.6.1.4.1.13769.666.666.666.1.500.9.1", + "DEBUGtesting EV OID", + SEC_OID_UNKNOWN, + "AD:FE:0E:44:16:45:B0:17:46:8B:76:01:74:B7:FF:64:5A:EC:35:91", + "MIHhMQswCQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDU1vdW50YWlu" + "IFZpZXcxIzAhBgNVBAoTGk1vemlsbGEgLSBFViBkZWJ1ZyB0ZXN0IENBMR0wGwYD" + "VQQLExRTZWN1cml0eSBFbmdpbmVlcmluZzEmMCQGA1UEAxMdRVYgVGVzdGluZyAo" + "dW50cnVzdHdvcnRoeSkgQ0ExEzARBgNVBCkTCmV2LXRlc3QtY2ExLDAqBgkqhkiG" + "9w0BCQEWHWNoYXJsYXRhbkB0ZXN0aW5nLmV4YW1wbGUuY29t", + "AK/FPSJmJkky", + nullptr + }, { // CN=WellsSecure Public Root Certificate Authority,OU=Wells Fargo Bank NA,O=Wells Fargo WellsSecure,C=US "2.16.840.1.114171.500.9", @@ -1065,7 +1080,11 @@ nsNSSComponent::IdentityInfoInit() ias.serialNumber.type = siUnsignedInteger; entry.cert = CERT_FindCertByIssuerAndSN(nullptr, &ias); - NS_ASSERTION(entry.cert, "Could not find EV root in NSS storage"); + + // The debug CA info is at position 0, and is NOT on the NSS root db + if (iEV != 0) { + NS_ASSERTION(entry.cert, "Could not find EV root in NSS storage"); + } SECITEM_FreeItem(&ias.derIssuer, false); SECITEM_FreeItem(&ias.serialNumber, false); diff --git a/security/manager/ssl/tests/mochitest/bugs/Makefile.in b/security/manager/ssl/tests/mochitest/bugs/Makefile.in index d08b4551b44..4812cac4439 100644 --- a/security/manager/ssl/tests/mochitest/bugs/Makefile.in +++ b/security/manager/ssl/tests/mochitest/bugs/Makefile.in @@ -15,6 +15,8 @@ MOCHITEST_FILES = \ test_bug480509.html \ test_bug483440.html \ test_bug484111.html \ + test_ev_validation.html \ + test_ev_validation_child.html \ $(NULL) MOCHITEST_CHROME_FILES = \ diff --git a/security/manager/ssl/tests/mochitest/bugs/test_ev_validation.html b/security/manager/ssl/tests/mochitest/bugs/test_ev_validation.html new file mode 100644 index 00000000000..62413dcbc9b --- /dev/null +++ b/security/manager/ssl/tests/mochitest/bugs/test_ev_validation.html @@ -0,0 +1,52 @@ + + + + + + Test for Bug 813418 + + + + + +Mozilla Bug 813418 +

+ +
+
+
+ + diff --git a/security/manager/ssl/tests/mochitest/bugs/test_ev_validation_child.html b/security/manager/ssl/tests/mochitest/bugs/test_ev_validation_child.html new file mode 100644 index 00000000000..0faa27a015c --- /dev/null +++ b/security/manager/ssl/tests/mochitest/bugs/test_ev_validation_child.html @@ -0,0 +1,62 @@ + + + + + + + + +

Security_state_child

+ + + diff --git a/testing/mochitest/Makefile.in b/testing/mochitest/Makefile.in index 4f8240cc21c..98ed5ee90d1 100644 --- a/testing/mochitest/Makefile.in +++ b/testing/mochitest/Makefile.in @@ -61,6 +61,8 @@ _SERV_FILES = \ plain-loop.html \ android.json \ b2g.json \ + root-ev-tester.crl \ + intermediate-ev-tester.crl \ $(NULL) ifeq ($(MOZ_BUILD_APP),mobile/android) diff --git a/testing/mochitest/android.json b/testing/mochitest/android.json index 479bd413cf6..9c473a88d83 100644 --- a/testing/mochitest/android.json +++ b/testing/mochitest/android.json @@ -299,6 +299,7 @@ "security/manager/ssl/tests/mochitest/bugs/test_bug480509.html": "", "security/manager/ssl/tests/mochitest/bugs/test_bug483440.html": "", "security/manager/ssl/tests/mochitest/bugs/test_bug484111.html": "", + "security/manager/ssl/tests/mochitest/bugs/test_ev_validation.html": "TIMED_OUT", "security/manager/ssl/tests/mochitest/mixedcontent": "TIMED_OUT", "security/manager/ssl/tests/mochitest/stricttransportsecurity/test_stricttransportsecurity.html": "TIMED_OUT", "security/manager/ssl/tests/mochitest/stricttransportsecurity/test_sts_privatebrowsing.html": "TIMED_OUT", diff --git a/testing/mochitest/intermediate-ev-tester.crl b/testing/mochitest/intermediate-ev-tester.crl new file mode 100644 index 0000000000000000000000000000000000000000..3d94e958fd77301027d4b0122c9213400f8704b6 GIT binary patch literal 541 zcmXqLVv;myVq`SnW#iOp^Jx3d%gD&e%3#oV(U9AKlZ`o)g-w_#G#JL=5N2|AG!!!s z0m-ln^ZMqO=9MI7<|%|_rj{Ej8z_RrxrC*B^Q$s*auOAE6{7L5jGAMS@e4ON%l~DivJw(lhf?Q;Rb5(qU#Z3-e~?m82Hsrlw>jmZTaR3L6N5 zv}p=+rIzV}%+gIxG}JNBf;*d&QA{>DBe5tau_Q6i0i*(GoL*{0Vs1fBs$Oz_t~jru zv4N4HiJ^tDrKv%bIIj_iYXs$@1pqTJOc?yFKNoS^MFz8ox4U+%5f=A*l_93ASa{BV z(e=k05@w&e-Yk{CRGa9v`6uJ|hV@IHntt$N5&CG@wymc)$won8`tHeH>6VN+{05wN z&n}RxulnkFc2|vB`i}1}6fYm#WqwJc<6T(JZIKfvRv4BhwSISgYgN+FK1pBu*qZRh z%GFC}ER|iu_;gj&l!NcD{PcZq=TaEPv&+bkY4-hMsS7GP=Qq8Ldm`Z_Jl$XU(N@@aWr}ViC;$m*nPie literal 0 HcmV?d00001 diff --git a/testing/mochitest/root-ev-tester.crl b/testing/mochitest/root-ev-tester.crl new file mode 100644 index 0000000000000000000000000000000000000000..4d0dee3a0e42bdd95c5df0476b04731a0e115e8d GIT binary patch literal 557 zcmXqLV$w8dViYvsW#iOp^Jx3d%gD&e%3#p=(2(1JlZ`o)g-w_#G#JL=5N2|AG!!!s z0m-ln^ZMqO=9MI7<|%|_rj{Ej8z_RrxrC*B^Q$s*auOAE6{7L5jGAMS@e4ON%l~DivJw(lhf?Q;Rb5(hb!NR6x?q!m>b}AwWGqK?Mzl!r08%JW8C`2*fpla?t{WxrvdHA@0bGzWj$X9A?&k zaq?fdfHT>u;QSANel`7Uzpc3rUXS+Iv?;w0>=IdeabuFf?D_tD+RmYM3s{$2nLB^a zO-YBED5u=u=*MrY7gdQy9u$7Dx<2f{%!HgM-+*n$@ZoU0EOg Date: Thu, 25 Apr 2013 14:44:44 -0600 Subject: [PATCH 020/155] Bug 865635 - Use MMonitorTypes instead of MTypeBarrier for type write barriers, r=dvander. --- js/src/ion/Lowering.cpp | 2 +- js/src/ion/MIR.cpp | 3 +-- js/src/ion/MIR.h | 5 ++--- js/src/ion/shared/Lowering-shared-inl.h | 3 --- 4 files changed, 4 insertions(+), 9 deletions(-) diff --git a/js/src/ion/Lowering.cpp b/js/src/ion/Lowering.cpp index 56af3f7af86..c2407718d6a 100644 --- a/js/src/ion/Lowering.cpp +++ b/js/src/ion/Lowering.cpp @@ -1730,7 +1730,7 @@ LIRGenerator::visitMonitorTypes(MMonitorTypes *ins) LMonitorTypes *lir = new LMonitorTypes(temp()); if (!useBox(lir, LMonitorTypes::Input, ins->input())) return false; - return assignSnapshot(lir, Bailout_Monitor) && add(lir, ins); + return assignSnapshot(lir, Bailout_Normal) && add(lir, ins); } bool diff --git a/js/src/ion/MIR.cpp b/js/src/ion/MIR.cpp index e2252dcd8be..563d728a0aa 100644 --- a/js/src/ion/MIR.cpp +++ b/js/src/ion/MIR.cpp @@ -2473,9 +2473,8 @@ TryAddTypeBarrierForWrite(JSContext *cx, MBasicBlock *current, types::StackTypeS if (!types) return false; - MInstruction *ins = MTypeBarrier::New(*pvalue, types, Bailout_Normal); + MInstruction *ins = MMonitorTypes::New(*pvalue, types); current->add(ins); - *pvalue = ins; return true; } diff --git a/js/src/ion/MIR.h b/js/src/ion/MIR.h index ad704e4978e..d34225e41fb 100644 --- a/js/src/ion/MIR.h +++ b/js/src/ion/MIR.h @@ -6878,8 +6878,8 @@ class MTypeBarrier }; // Like MTypeBarrier, guard that the value is in the given type set. This is -// used after some VM calls (like GetElement) to avoid the slower calls to -// TypeScript::Monitor inside these stubs. +// used before property writes to ensure the value being written is represented +// in the property types for the object. class MMonitorTypes : public MUnaryInstruction { const types::StackTypeSet *typeSet_; @@ -6888,7 +6888,6 @@ class MMonitorTypes : public MUnaryInstruction : MUnaryInstruction(def), typeSet_(types) { - setResultType(MIRType_Value); setGuard(); JS_ASSERT(!types->unknown()); } diff --git a/js/src/ion/shared/Lowering-shared-inl.h b/js/src/ion/shared/Lowering-shared-inl.h index 4529a6f94e7..6139c7ea064 100644 --- a/js/src/ion/shared/Lowering-shared-inl.h +++ b/js/src/ion/shared/Lowering-shared-inl.h @@ -401,9 +401,6 @@ LIRGeneratorShared::add(T *ins, MInstruction *mir) static inline uint32_t VirtualRegisterOfPayload(MDefinition *mir) { - // Type barriers may have box inputs, and pass through their input's vreg. - while (mir->isTypeBarrier()) - mir = mir->getOperand(0); if (mir->isBox()) { MDefinition *inner = mir->toBox()->getOperand(0); if (!inner->isConstant() && inner->type() != MIRType_Double) From 6b4ae93176d8bbb8535452836e12dfe21ac01072 Mon Sep 17 00:00:00 2001 From: Chris Lord Date: Thu, 25 Apr 2013 15:39:33 -0400 Subject: [PATCH 021/155] Bug 853867 - Allow --enable-gtest on Android and fix build issues. NPOTB r=bas,bgirard --HG-- extra : rebase_source : 2e870fd157ea7e9a4de4cf8f4d465784eab0ff8e --- configure.in | 10 +++++++++- gfx/2d/unittest/TestScaling.cpp | 28 ++++++++++++++-------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/configure.in b/configure.in index 656cb6ac00b..71666cef3c2 100644 --- a/configure.in +++ b/configure.in @@ -6395,7 +6395,7 @@ MOZ_ARG_ENABLE_BOOL(gtest, MOZ_ENABLE_GTEST= ) if test -n "$MOZ_ENABLE_GTEST"; then - if test "${OS_TARGET}" = "WINNT" -o "${OS_TARGET}" = "Darwin" -o "${OS_TARGET}" = "Linux"; then + if test "${OS_TARGET}" = "WINNT" -o "${OS_TARGET}" = "Darwin" -o "${OS_TARGET}" = "Linux" -o "${OS_TARGET}" = "Android"; then MOZ_ENABLE_GTEST=1 GTEST_HAS_RTTI=0 AC_DEFINE(MOZ_ENABLE_GTEST) @@ -6405,6 +6405,14 @@ if test -n "$MOZ_ENABLE_GTEST"; then else AC_MSG_ERROR([Cannot build with --enable-gtest on this platform.]) fi + if test "${OS_TARGET}" = "Android"; then + AC_DEFINE(GTEST_OS_LINUX_ANDROID) + AC_DEFINE(GTEST_USE_OWN_TR1_TUPLE) + AC_DEFINE_UNQUOTED(GTEST_HAS_CLONE, 0) + AC_SUBST(GTEST_OS_LINUX_ANDROID) + AC_SUBST(GTEST_USE_OWN_TR1_TUPLE) + AC_SUBST(GTEST_HAS_CLONE) + fi fi dnl ======================================================== diff --git a/gfx/2d/unittest/TestScaling.cpp b/gfx/2d/unittest/TestScaling.cpp index 451fdf87e2a..1515c13fe22 100644 --- a/gfx/2d/unittest/TestScaling.cpp +++ b/gfx/2d/unittest/TestScaling.cpp @@ -26,7 +26,7 @@ TestScaling::BasicHalfScale() std::vector data; data.resize(500 * 500 * 4); - uint32_t *pixels = (uint32_t*)data.data(); + uint32_t *pixels = reinterpret_cast(&data.front()); for (int y = 0; y < 500; y += 2) { for (int x = 0; x < 500; x += 2) { pixels[y * 500 + x] = 0xff00ff00; @@ -35,7 +35,7 @@ TestScaling::BasicHalfScale() pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; } } - ImageHalfScaler scaler(data.data(), 500 * 4, IntSize(500, 500)); + ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); scaler.ScaleForSize(IntSize(220, 240)); @@ -57,7 +57,7 @@ TestScaling::DoubleHalfScale() std::vector data; data.resize(500 * 500 * 4); - uint32_t *pixels = (uint32_t*)data.data(); + uint32_t *pixels = reinterpret_cast(&data.front()); for (int y = 0; y < 500; y += 2) { for (int x = 0; x < 500; x += 2) { pixels[y * 500 + x] = 0xff00ff00; @@ -66,7 +66,7 @@ TestScaling::DoubleHalfScale() pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; } } - ImageHalfScaler scaler(data.data(), 500 * 4, IntSize(500, 500)); + ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); scaler.ScaleForSize(IntSize(120, 110)); VERIFY(scaler.GetSize().width == 125); @@ -89,7 +89,7 @@ TestScaling::UnevenHalfScale() // separately. data.resize(499 * 500 * 4); - uint32_t *pixels = (uint32_t*)data.data(); + uint32_t *pixels = reinterpret_cast(&data.front()); for (int y = 0; y < 500; y += 2) { for (int x = 0; x < 500; x += 2) { pixels[y * 500 + x] = 0xff00ff00; @@ -104,7 +104,7 @@ TestScaling::UnevenHalfScale() } } } - ImageHalfScaler scaler(data.data(), 500 * 4, IntSize(499, 499)); + ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(499, 499)); scaler.ScaleForSize(IntSize(220, 220)); VERIFY(scaler.GetSize().width == 249); @@ -126,7 +126,7 @@ TestScaling::OddStrideHalfScale() // Use a 4-byte aligned stride to test if that doesn't cause any issues. data.resize(499 * 499 * 4); - uint32_t *pixels = (uint32_t*)data.data(); + uint32_t *pixels = reinterpret_cast(&data.front()); for (int y = 0; y < 500; y += 2) { for (int x = 0; x < 500; x += 2) { pixels[y * 499 + x] = 0xff00ff00; @@ -141,7 +141,7 @@ TestScaling::OddStrideHalfScale() } } } - ImageHalfScaler scaler(data.data(), 499 * 4, IntSize(499, 499)); + ImageHalfScaler scaler(&data.front(), 499 * 4, IntSize(499, 499)); scaler.ScaleForSize(IntSize(220, 220)); VERIFY(scaler.GetSize().width == 249); @@ -161,7 +161,7 @@ TestScaling::VerticalHalfScale() std::vector data; data.resize(500 * 500 * 4); - uint32_t *pixels = (uint32_t*)data.data(); + uint32_t *pixels = reinterpret_cast(&data.front()); for (int y = 0; y < 500; y += 2) { for (int x = 0; x < 500; x += 2) { pixels[y * 500 + x] = 0xff00ff00; @@ -170,7 +170,7 @@ TestScaling::VerticalHalfScale() pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; } } - ImageHalfScaler scaler(data.data(), 500 * 4, IntSize(500, 500)); + ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); scaler.ScaleForSize(IntSize(400, 240)); VERIFY(scaler.GetSize().width == 500); @@ -192,7 +192,7 @@ TestScaling::HorizontalHalfScale() std::vector data; data.resize(520 * 500 * 4); - uint32_t *pixels = (uint32_t*)data.data(); + uint32_t *pixels = reinterpret_cast(&data.front()); for (int y = 0; y < 500; y ++) { for (int x = 0; x < 520; x += 8) { pixels[y * 520 + x] = 0xff00ff00; @@ -205,7 +205,7 @@ TestScaling::HorizontalHalfScale() pixels[y * 520 + x + 7] = 0xff0000ff; } } - ImageHalfScaler scaler(data.data(), 520 * 4, IntSize(520, 500)); + ImageHalfScaler scaler(&data.front(), 520 * 4, IntSize(520, 500)); scaler.ScaleForSize(IntSize(240, 400)); VERIFY(scaler.GetSize().width == 260); @@ -229,7 +229,7 @@ TestScaling::MixedHalfScale() std::vector data; data.resize(500 * 500 * 4); - uint32_t *pixels = (uint32_t*)data.data(); + uint32_t *pixels = reinterpret_cast(&data.front()); for (int y = 0; y < 500; y += 2) { for (int x = 0; x < 500; x += 2) { pixels[y * 500 + x] = 0xff00ff00; @@ -238,7 +238,7 @@ TestScaling::MixedHalfScale() pixels[(y + 1) * 500 + x + 1] = 0xff0000ff; } } - ImageHalfScaler scaler(data.data(), 500 * 4, IntSize(500, 500)); + ImageHalfScaler scaler(&data.front(), 500 * 4, IntSize(500, 500)); scaler.ScaleForSize(IntSize(120, 240)); VERIFY(scaler.GetSize().width == 125); From 0d0c29df0157f4ee833537008a318ecb9f164103 Mon Sep 17 00:00:00 2001 From: Brian Hackett Date: Thu, 25 Apr 2013 15:22:04 -0600 Subject: [PATCH 022/155] Bug 865626 - Disallow generating extra barrier instructions when compiling Array.push, r=dvander. --- js/src/ion/MCallOptimize.cpp | 7 +++---- js/src/ion/MIR.cpp | 8 +++++++- js/src/ion/MIR.h | 3 ++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/js/src/ion/MCallOptimize.cpp b/js/src/ion/MCallOptimize.cpp index efe1ab4af46..d5fe2801a98 100644 --- a/js/src/ion/MCallOptimize.cpp +++ b/js/src/ion/MCallOptimize.cpp @@ -311,10 +311,9 @@ IonBuilder::inlineArrayPush(CallInfo &callInfo) MDefinition *obj = callInfo.thisArg(); MDefinition *value = callInfo.getArg(0); - if (PropertyWriteNeedsTypeBarrier(cx, current, &obj, NULL, &value)) - return InliningStatus_NotInlined; - if (obj != callInfo.thisArg() || value != callInfo.getArg(0)) + if (PropertyWriteNeedsTypeBarrier(cx, current, &obj, NULL, &value, /* canModify = */ false)) return InliningStatus_NotInlined; + JS_ASSERT(obj == callInfo.thisArg() && value == callInfo.getArg(0)); if (getInlineReturnType() != MIRType_Int32) return InliningStatus_NotInlined; @@ -926,7 +925,7 @@ IonBuilder::inlineUnsafeSetElement(CallInfo &callInfo) MDefinition *id = callInfo.getArg(idxi); MDefinition *elem = callInfo.getArg(elemi); - if (PropertyWriteNeedsTypeBarrier(cx, current, &obj, NULL, &elem)) + if (PropertyWriteNeedsTypeBarrier(cx, current, &obj, NULL, &elem, /* canModify = */ false)) return InliningStatus_NotInlined; int arrayType; diff --git a/js/src/ion/MIR.cpp b/js/src/ion/MIR.cpp index 563d728a0aa..40f0c529df1 100644 --- a/js/src/ion/MIR.cpp +++ b/js/src/ion/MIR.cpp @@ -2493,7 +2493,7 @@ AddTypeGuard(MBasicBlock *current, MDefinition *obj, types::TypeObject *typeObje bool ion::PropertyWriteNeedsTypeBarrier(JSContext *cx, MBasicBlock *current, MDefinition **pobj, - PropertyName *name, MDefinition **pvalue) + PropertyName *name, MDefinition **pvalue, bool canModify) { // If any value being written is not reflected in the type information for // objects which obj could represent, a type barrier is needed when writing @@ -2535,6 +2535,12 @@ ion::PropertyWriteNeedsTypeBarrier(JSContext *cx, MBasicBlock *current, MDefinit break; } if (!TypeSetIncludes(property, (*pvalue)->type(), (*pvalue)->resultTypeSet())) { + // Either pobj or pvalue needs to be modified to filter out the + // types which the value could have but are not in the property, + // or a VM call is required. A VM call is always required if pobj + // and pvalue cannot be modified. + if (!canModify) + return true; success = TryAddTypeBarrierForWrite(cx, current, types, id, pvalue); break; } diff --git a/js/src/ion/MIR.h b/js/src/ion/MIR.h index d34225e41fb..d3389a43c24 100644 --- a/js/src/ion/MIR.h +++ b/js/src/ion/MIR.h @@ -7725,7 +7725,8 @@ bool PropertyReadNeedsTypeBarrier(JSContext *cx, MDefinition *obj, PropertyName types::StackTypeSet *observed); bool PropertyReadIsIdempotent(JSContext *cx, MDefinition *obj, PropertyName *name); bool PropertyWriteNeedsTypeBarrier(JSContext *cx, MBasicBlock *current, MDefinition **pobj, - PropertyName *name, MDefinition **pvalue); + PropertyName *name, MDefinition **pvalue, + bool canModify = true); } // namespace ion } // namespace js From cd4ebfbb80cd86b23a5a55ef3882e4b6eed04635 Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Thu, 25 Apr 2013 14:31:42 -0700 Subject: [PATCH 023/155] Bug 865544 - Add support for nsIDOMGlobalPropertyInitializer to JS-implemented WebIDL. r=bz --- dom/bindings/Codegen.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 6d90a509e7b..eaedb1a1700 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -669,6 +669,9 @@ class CGHeaders(CGWrapper): parentDesc = jsImplemented.getDescriptor(jsParent.identifier.name) declareIncludes.add(parentDesc.jsImplParentHeader) + if len(jsImplementedDescriptors) != 0: + bindingHeaders.add("nsIDOMGlobalPropertyInitializer.h") + # Let the machinery do its thing. def _includeString(includes): return ''.join(['#include "%s"\n' % i for i in includes]) + '\n' @@ -8346,19 +8349,32 @@ class CGJSImplMethod(CGNativeMember): raise TypeError("Constructors with arguments are unsupported. See bug 851178.") return string.Template( -""" // Get the window to use as a parent. +""" // Get the window to use as a parent and for initialization. nsCOMPtr window = do_QueryInterface(global.Get()); if (!window) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } - // Get the JS implementation for the WebIDL interface. + // Get the XPCOM component containing the JS implementation. nsCOMPtr implISupports = do_CreateInstance("${contractId}"); MOZ_ASSERT(implISupports, "Failed to get JS implementation instance from contract ID."); if (!implISupports) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; } + // Initialize the object, if it implements nsIDOMGlobalPropertyInitializer. + nsCOMPtr gpi = do_QueryInterface(implISupports); + if (gpi) { + JS::Value initReturn = JSVAL_VOID; + nsresult rv = gpi->Init(window, &initReturn); + if (NS_FAILED(rv)) { + aRv.Throw(rv); + return nullptr; + } + MOZ_ASSERT(initReturn.isUndefined(), + "Expected nsIDOMGlobalPropertyInitializer to return undefined"); + } + // Extract the JS implementation from the XPCOM object. nsCOMPtr implWrapped = do_QueryInterface(implISupports); MOZ_ASSERT(implWrapped, "Failed to get wrapped JS from XPCOM component."); if (!implWrapped) { From 492fe7b2d576986b793bf12497e3708d21b5f053 Mon Sep 17 00:00:00 2001 From: Frank Yan Date: Thu, 25 Apr 2013 14:42:18 -0700 Subject: [PATCH 024/155] Bug 649216 - Remove unnecessary delay when clicking tab close buttons sequentially. r=jaws ui-r=limi --- browser/base/content/tabbrowser.xml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 7dff3366f81..573ed0bb8ba 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -4229,16 +4229,17 @@ */ var clickedOnce = false; function enableDblClick(event) { - if (event.detail == 1 && !clickedOnce) { + var target = event.originalTarget; + if (target.className == 'tab-close-button') + target._ignoredClick = true; + if (!clickedOnce) { clickedOnce = true; return; } - setTimeout(function() { - tabContainer._blockDblClick = false; - }, 0); - tabContainer.removeEventListener("click", enableDblClick, false); + tabContainer._blockDblClick = false; + tabContainer.removeEventListener("click", enableDblClick, true); } - tabContainer.addEventListener("click", enableDblClick, false); + tabContainer.addEventListener("click", enableDblClick, true); ]]> From 6b1000074d2acb0a4e5dd479e36dd581edc2d739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hubert=20Figui=C3=A8re?= Date: Mon, 22 Apr 2013 16:09:15 -0400 Subject: [PATCH 025/155] Bug 855040 - Add a bit of logging in the crash report to help diagnostics and silence exception of crash report is disabled. r=fabrice --- b2g/chrome/content/shell.js | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/b2g/chrome/content/shell.js b/b2g/chrome/content/shell.js index 1588bc79d07..eaf55e13ddc 100644 --- a/b2g/chrome/content/shell.js +++ b/b2g/chrome/content/shell.js @@ -84,6 +84,14 @@ function debug(str) { dump(' -*- Shell.js: ' + str + '\n'); } +#ifdef MOZ_CRASHREPORTER +function debugCrashReport(aStr) { + dump('Crash reporter : ' + aStr); +} +#else +function debugCrashReport(aStr) {} +#endif + var shell = { get CrashSubmit() { @@ -92,6 +100,7 @@ var shell = { Cu.import("resource://gre/modules/CrashSubmit.jsm", this); return this.CrashSubmit; #else + dump('Crash reporter : disabled at build time.'); return this.CrashSubmit = null; #endif }, @@ -111,7 +120,10 @@ var shell = { crashID = Cc["@mozilla.org/xre/app-info;1"] .getService(Ci.nsIXULRuntime).lastRunCrashID; } - } catch(e) { } + } catch(e) { + debugCrashReport('Failed to fetch crash id. Crash ID is "' + crashID + + '" Exception: ' + e); + } // Bail if there isn't a valid crashID. if (!this.CrashSubmit || !crashID && !this.CrashSubmit.pendingIDs().length) { @@ -123,10 +135,14 @@ var shell = { try { // Check if we should automatically submit this crash. - if (Services.prefs.getBoolPref("app.reportCrashes")) { + if (Services.prefs.getBoolPref('app.reportCrashes')) { this.submitCrash(crashID); + } else { + debugCrashReport('app.reportCrashes is disabled'); } - } catch (e) { } + } catch (e) { + debugCrashReport('Can\'t fetch app.reportCrashes. Exception: ' + e); + } // We can get here if we're just submitting old pending crashes. // Check that there's a valid crashID so that we only notify the @@ -146,6 +162,7 @@ var shell = { // submit the pending queue. let pending = shell.CrashSubmit.pendingIDs(); for (let crashid of pending) { + debugCrashReport('Submitting crash: ' + crashid); shell.CrashSubmit.submit(crashid); } }, @@ -157,6 +174,8 @@ var shell = { return; } + debugCrashReport('Not online, postponing.'); + Services.obs.addObserver(function observer(subject, topic, state) { let network = subject.QueryInterface(Ci.nsINetworkInterface); if (network.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED @@ -242,7 +261,7 @@ var shell = { }); #endif } catch(e) { - dump("exception: " + e); + debugCrashReport('exception: ' + e); } let homeURL = this.homeURL; From 63b625865e29e8df94c5358527e7536aba7ab990 Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Wed, 24 Apr 2013 22:29:46 -0700 Subject: [PATCH 026/155] s/JS_TRUE/true/g; s/JS_FALSE/false/g. Following up on a request in bug 858677, r=lumpy --HG-- extra : rebase_source : 992fe9e7f92924d03abeb5f8839bfd0bca8650f1 --- js/src/jsarray.cpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index 9a83b8e8a63..b7bc6fbae2f 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -234,13 +234,13 @@ GetElement(JSContext *cx, HandleObject obj, IndexType index, JSBool *hole, Mutab if (obj->isNative() && index < obj->getDenseInitializedLength()) { vp.set(obj->getDenseElement(uint32_t(index))); if (!vp.isMagic(JS_ELEMENTS_HOLE)) { - *hole = JS_FALSE; - return JS_TRUE; + *hole = false; + return true; } } if (obj->isArguments()) { if (obj->asArguments().maybeGetElement(uint32_t(index), vp)) { - *hole = JS_FALSE; + *hole = false; return true; } } @@ -2107,7 +2107,7 @@ array_unshift(JSContext *cx, unsigned argc, Value *vp) uint32_t length; if (!GetLengthProperty(cx, obj, &length)) - return JS_FALSE; + return false; double newlen = length; if (args.length() > 0) { @@ -2158,16 +2158,16 @@ array_unshift(JSContext *cx, unsigned argc, Value *vp) /* Copy from args to the bottom of the array. */ if (!InitArrayElements(cx, obj, 0, args.length(), args.array(), UpdateTypes)) - return JS_FALSE; + return false; newlen += args.length(); } if (!SetLengthProperty(cx, obj, newlen)) - return JS_FALSE; + return false; /* Follow Perl by returning the new array length. */ args.rval().setNumber(newlen); - return JS_TRUE; + return true; } static inline void @@ -2505,18 +2505,18 @@ js::array_concat(JSContext *cx, unsigned argc, Value *vp) uint32_t initlen = aobj->getDenseInitializedLength(); nobj = NewDenseCopiedArray(cx, initlen, aobj, 0); if (!nobj) - return JS_FALSE; + return false; TryReuseArrayType(aobj, nobj); JSObject::setArrayLength(cx, nobj, length); args.rval().setObject(*nobj); if (argc == 0) - return JS_TRUE; + return true; argc--; p++; } else { nobj = NewDenseEmptyArray(cx); if (!nobj) - return JS_FALSE; + return false; args.rval().setObject(*nobj); length = 0; } @@ -2571,7 +2571,7 @@ array_slice(JSContext *cx, unsigned argc, Value *vp) return false; if (!GetLengthProperty(cx, obj, &length)) - return JS_FALSE; + return false; begin = 0; end = length; @@ -2612,29 +2612,29 @@ array_slice(JSContext *cx, unsigned argc, Value *vp) { nobj = NewDenseCopiedArray(cx, end - begin, obj, begin); if (!nobj) - return JS_FALSE; + return false; TryReuseArrayType(obj, nobj); args.rval().setObject(*nobj); - return JS_TRUE; + return true; } nobj = NewDenseAllocatedArray(cx, end - begin); if (!nobj) - return JS_FALSE; + return false; TryReuseArrayType(obj, nobj); RootedValue value(cx); for (slot = begin; slot < end; slot++) { if (!JS_CHECK_OPERATION_LIMIT(cx) || !GetElement(cx, obj, slot, &hole, &value)) { - return JS_FALSE; + return false; } if (!hole && !SetArrayElement(cx, nobj, slot - begin, value)) - return JS_FALSE; + return false; } args.rval().setObject(*nobj); - return JS_TRUE; + return true; } /* ES5 15.4.4.20. */ @@ -2788,7 +2788,7 @@ js_Array(JSContext *cx, unsigned argc, Value *vp) CallArgs args = CallArgsFromVp(argc, vp); RootedTypeObject type(cx, GetTypeCallerInitObject(cx, JSProto_Array)); if (!type) - return JS_FALSE; + return false; if (args.length() != 1 || !args[0].isNumber()) { if (!InitArrayTypes(cx, type, args.array(), args.length())) @@ -3060,7 +3060,7 @@ js_ArrayInfo(JSContext *cx, unsigned argc, Value *vp) char *bytes = DecompileValueGenerator(cx, JSDVG_SEARCH_STACK, arg, NullPtr()); if (!bytes) - return JS_FALSE; + return false; if (arg.isPrimitive() || !(array = arg.toObjectOrNull())->isArray()) { fprintf(stderr, "%s: not array\n", bytes); From bee0c7c55b2696c15dfbd62ec3a31735c14c9480 Mon Sep 17 00:00:00 2001 From: Norbert Lindenberg Date: Thu, 25 Apr 2013 14:57:13 -0700 Subject: [PATCH 027/155] Bug 845190 - Made test_logging.js correctly ignore messages it wants to ignore. r=dteller --- toolkit/components/osfile/tests/xpcshell/test_logging.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolkit/components/osfile/tests/xpcshell/test_logging.js b/toolkit/components/osfile/tests/xpcshell/test_logging.js index aadedec61f5..3e0c615203b 100644 --- a/toolkit/components/osfile/tests/xpcshell/test_logging.js +++ b/toolkit/components/osfile/tests/xpcshell/test_logging.js @@ -14,7 +14,6 @@ function run_test() { // Create a console listener. let consoleListener = { observe: function (aMessage) { - ++messageCount; //Ignore unexpected messages. if (!(aMessage instanceof Components.interfaces.nsIConsoleMessage)) { return; @@ -23,6 +22,7 @@ function run_test() { return; } + ++messageCount; if(messageCount == 1) { do_check_eq(aMessage.message, "TEST OS {\"name\":\"test\"}\n"); } From e035b7c8eb398b320b568becf7ef5ac98be5b071 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Thu, 25 Apr 2013 18:08:58 -0400 Subject: [PATCH 028/155] Bug 832400 - Add an imgIContainer flag HIGH_QUALITY_SCALING that controls whether to use the high quality scaler, and only use it when we're drawing to a window. r=tn --- image/public/imgIContainer.idl | 7 ++++++- image/src/RasterImage.cpp | 14 +++++++++----- image/src/RasterImage.h | 5 +++-- layout/base/nsCSSRendering.cpp | 14 +++++++++++--- layout/base/nsCSSRendering.h | 3 ++- layout/generic/nsImageFrame.cpp | 12 ++++++++---- layout/xul/base/src/nsImageBoxFrame.cpp | 11 +++++++---- 7 files changed, 46 insertions(+), 20 deletions(-) diff --git a/image/public/imgIContainer.idl b/image/public/imgIContainer.idl index de2ca0c9e51..30921cf737b 100644 --- a/image/public/imgIContainer.idl +++ b/image/public/imgIContainer.idl @@ -57,7 +57,7 @@ native nsSize(nsSize); * * Internally, imgIContainer also manages animation of images. */ -[scriptable, builtinclass, uuid(0c1caf24-bce7-4db5-971d-8e1b6ed07540)] +[scriptable, builtinclass, uuid(55531bcd-7d4a-4da0-ab87-7c64c5ae5e12)] interface imgIContainer : nsISupports { /** @@ -130,6 +130,10 @@ interface imgIContainer : nsISupports * * FLAG_CLAMP: Extend the image to the fill area by clamping image sample * coordinates instead of by tiling. This only affects 'draw'. + * + * FLAG_HIGH_QUALITY_SCALING: A hint as to whether this image should be + * scaled using the high quality scaler. Do not set this if not drawing to + * a window or not listening to invalidations. */ const long FLAG_NONE = 0x0; @@ -137,6 +141,7 @@ interface imgIContainer : nsISupports const long FLAG_DECODE_NO_PREMULTIPLY_ALPHA = 0x2; const long FLAG_DECODE_NO_COLORSPACE_CONVERSION = 0x4; const long FLAG_CLAMP = 0x8; + const long FLAG_HIGH_QUALITY_SCALING = 0x10; /** * Constants for specifying various "special" frames. diff --git a/image/src/RasterImage.cpp b/image/src/RasterImage.cpp index 47e813a31dd..141743de29c 100644 --- a/image/src/RasterImage.cpp +++ b/image/src/RasterImage.cpp @@ -2944,14 +2944,17 @@ RasterImage::CanQualityScale(const gfxSize& scale) bool RasterImage::CanScale(gfxPattern::GraphicsFilter aFilter, - gfxSize aScale) + gfxSize aScale, uint32_t aFlags) { // The high-quality scaler requires Skia. #ifdef MOZ_ENABLE_SKIA // We don't use the scaler for animated or multipart images to avoid doing a // bunch of work on an image that just gets thrown away. + // We only use the scaler when drawing to the window because, if we're not + // drawing to a window (eg a canvas), updates to that image will be ignored. if (gHQDownscaling && aFilter == gfxPattern::FILTER_GOOD && - !mAnim && mDecoded && !mMultipart && CanQualityScale(aScale)) { + !mAnim && mDecoded && !mMultipart && CanQualityScale(aScale) && + (aFlags & imgIContainer::FLAG_HIGH_QUALITY_SCALING)) { gfxFloat factor = gHQDownscalingMinFactor / 1000.0; return (aScale.width < factor || aScale.height < factor); @@ -3007,7 +3010,8 @@ RasterImage::DrawWithPreDownscaleIfNeeded(imgFrame *aFrame, gfxPattern::GraphicsFilter aFilter, const gfxMatrix &aUserSpaceToImageSpace, const gfxRect &aFill, - const nsIntRect &aSubimage) + const nsIntRect &aSubimage, + uint32_t aFlags) { imgFrame *frame = aFrame; nsIntRect framerect = frame->GetRect(); @@ -3017,7 +3021,7 @@ RasterImage::DrawWithPreDownscaleIfNeeded(imgFrame *aFrame, gfxSize scale = imageSpaceToUserSpace.ScaleFactors(true); nsIntRect subimage = aSubimage; - if (CanScale(aFilter, scale)) { + if (CanScale(aFilter, scale, aFlags)) { // If scale factor is still the same that we scaled for and // ScaleWorker isn't still working, then we can use pre-downscaled frame. // If scale factor has changed, order new request. @@ -3150,7 +3154,7 @@ RasterImage::Draw(gfxContext *aContext, return NS_OK; // Getting the frame (above) touches the image and kicks off decoding } - DrawWithPreDownscaleIfNeeded(frame, aContext, aFilter, aUserSpaceToImageSpace, aFill, aSubimage); + DrawWithPreDownscaleIfNeeded(frame, aContext, aFilter, aUserSpaceToImageSpace, aFill, aSubimage, aFlags); if (mDecoded && !mDrawStartTime.IsNull()) { TimeDuration drawLatency = TimeStamp::Now() - mDrawStartTime; diff --git a/image/src/RasterImage.h b/image/src/RasterImage.h index 1919310fa44..87f290e8d93 100644 --- a/image/src/RasterImage.h +++ b/image/src/RasterImage.h @@ -585,7 +585,8 @@ private: gfxPattern::GraphicsFilter aFilter, const gfxMatrix &aUserSpaceToImageSpace, const gfxRect &aFill, - const nsIntRect &aSubimage); + const nsIntRect &aSubimage, + uint32_t aFlags); nsresult CopyFrame(uint32_t aWhichFrame, uint32_t aFlags, @@ -821,7 +822,7 @@ private: // data TimeStamp mDrawStartTime; inline bool CanQualityScale(const gfxSize& scale); - inline bool CanScale(gfxPattern::GraphicsFilter aFilter, gfxSize aScale); + inline bool CanScale(gfxPattern::GraphicsFilter aFilter, gfxSize aScale, uint32_t aFlags); struct ScaleResult { diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 076c232755b..a83bea7219a 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -2950,6 +2950,9 @@ nsCSSRendering::PrepareBackgroundLayer(nsPresContext* aPresContext, if (aFlags & nsCSSRendering::PAINTBG_SYNC_DECODE_IMAGES) { irFlags |= nsImageRenderer::FLAG_SYNC_DECODE_IMAGES; } + if (aFlags & nsCSSRendering::PAINTBG_TO_WINDOW) { + irFlags |= nsImageRenderer::FLAG_PAINTING_TO_WINDOW; + } nsBackgroundLayerState state(aForFrame, &aLayer.mImage, irFlags); if (!state.mImageRenderer.PrepareImage()) { @@ -4637,9 +4640,14 @@ nsImageRenderer::Draw(nsPresContext* aPresContext, switch (mType) { case eStyleImageType_Image: { - uint32_t drawFlags = (mFlags & FLAG_SYNC_DECODE_IMAGES) - ? (uint32_t) imgIContainer::FLAG_SYNC_DECODE - : (uint32_t) imgIContainer::FLAG_NONE; + uint32_t drawFlags = imgIContainer::FLAG_NONE; + if (mFlags & FLAG_SYNC_DECODE_IMAGES) { + drawFlags |= imgIContainer::FLAG_SYNC_DECODE; + } + if (mFlags & FLAG_PAINTING_TO_WINDOW) { + drawFlags |= imgIContainer::FLAG_HIGH_QUALITY_SCALING; + } + nsLayoutUtils::DrawBackgroundImage(&aRenderingContext, mImageContainer, nsIntSize(nsPresContext::AppUnitsToIntCSSPixels(mSize.width), nsPresContext::AppUnitsToIntCSSPixels(mSize.height)), diff --git a/layout/base/nsCSSRendering.h b/layout/base/nsCSSRendering.h index c2d9dc2b1a8..fc3e97276b4 100644 --- a/layout/base/nsCSSRendering.h +++ b/layout/base/nsCSSRendering.h @@ -33,7 +33,8 @@ public: typedef mozilla::layers::ImageContainer ImageContainer; enum { - FLAG_SYNC_DECODE_IMAGES = 0x01 + FLAG_SYNC_DECODE_IMAGES = 0x01, + FLAG_PAINTING_TO_WINDOW = 0x02 }; nsImageRenderer(nsIFrame* aForFrame, const nsStyleImage* aImage, uint32_t aFlags); ~nsImageRenderer(); diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp index 2e9f2666529..b61fdf6d307 100644 --- a/layout/generic/nsImageFrame.cpp +++ b/layout/generic/nsImageFrame.cpp @@ -1218,11 +1218,15 @@ static void PaintDebugImageMap(nsIFrame* aFrame, nsRenderingContext* aCtx, void nsDisplayImage::Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) { + uint32_t flags = imgIContainer::FLAG_NONE; + if (aBuilder->ShouldSyncDecodeImages()) { + flags |= imgIContainer::FLAG_SYNC_DECODE; + } + if (aBuilder->IsPaintingToWindow()) { + flags |= imgIContainer::FLAG_HIGH_QUALITY_SCALING; + } static_cast(mFrame)-> - PaintImage(*aCtx, ToReferenceFrame(), mVisibleRect, mImage, - aBuilder->ShouldSyncDecodeImages() - ? (uint32_t) imgIContainer::FLAG_SYNC_DECODE - : (uint32_t) imgIContainer::FLAG_NONE); + PaintImage(*aCtx, ToReferenceFrame(), mVisibleRect, mImage, flags); } already_AddRefed diff --git a/layout/xul/base/src/nsImageBoxFrame.cpp b/layout/xul/base/src/nsImageBoxFrame.cpp index 71eb7a20232..4f707bb7185 100644 --- a/layout/xul/base/src/nsImageBoxFrame.cpp +++ b/layout/xul/base/src/nsImageBoxFrame.cpp @@ -343,11 +343,14 @@ nsImageBoxFrame::PaintImage(nsRenderingContext& aRenderingContext, void nsDisplayXULImage::Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) { + uint32_t flags = imgIContainer::FLAG_NONE; + if (aBuilder->ShouldSyncDecodeImages()) + flags |= imgIContainer::FLAG_SYNC_DECODE; + if (aBuilder->IsPaintingToWindow()) + flags |= imgIContainer::FLAG_HIGH_QUALITY_SCALING; + static_cast(mFrame)-> - PaintImage(*aCtx, mVisibleRect, ToReferenceFrame(), - aBuilder->ShouldSyncDecodeImages() - ? (uint32_t) imgIContainer::FLAG_SYNC_DECODE - : (uint32_t) imgIContainer::FLAG_NONE); + PaintImage(*aCtx, mVisibleRect, ToReferenceFrame(), flags); } void From f536477e52873687a4191b3915a98748ccacdfc1 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Thu, 25 Apr 2013 00:28:39 -0400 Subject: [PATCH 029/155] Bug 859600 - Make AudioContext an EventTarget; r=smaug --- content/media/webaudio/AudioContext.cpp | 13 +++++++------ content/media/webaudio/AudioContext.h | 12 ++++++------ content/media/webaudio/test/test_AudioContext.html | 1 + dom/webidl/AudioContext.webidl | 2 +- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/content/media/webaudio/AudioContext.cpp b/content/media/webaudio/AudioContext.cpp index 3250ce043e3..a087835f576 100644 --- a/content/media/webaudio/AudioContext.cpp +++ b/content/media/webaudio/AudioContext.cpp @@ -29,20 +29,21 @@ const unsigned MAX_SCRIPT_PROCESSOR_CHANNELS = 10000; namespace mozilla { namespace dom { -NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_3(AudioContext, - mWindow, mDestination, mListener) +NS_IMPL_CYCLE_COLLECTION_2(AudioContext, mDestination, mListener) -NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(AudioContext, AddRef) -NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(AudioContext, Release) +NS_IMPL_ADDREF_INHERITED(AudioContext, nsDOMEventTargetHelper) +NS_IMPL_RELEASE_INHERITED(AudioContext, nsDOMEventTargetHelper) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AudioContext) +NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper) static uint8_t gWebAudioOutputKey; AudioContext::AudioContext(nsPIDOMWindow* aWindow) - : mWindow(aWindow) - , mDestination(new AudioDestinationNode(this, MediaStreamGraph::GetInstance())) + : mDestination(new AudioDestinationNode(this, MediaStreamGraph::GetInstance())) { // Actually play audio mDestination->Stream()->AddAudioOutput(&gWebAudioOutputKey); + nsDOMEventTargetHelper::BindToOwner(aWindow); SetIsDOMBinding(); mPannerNodes.Init(); diff --git a/content/media/webaudio/AudioContext.h b/content/media/webaudio/AudioContext.h index a78cb4dca9d..cd74facc9a8 100644 --- a/content/media/webaudio/AudioContext.h +++ b/content/media/webaudio/AudioContext.h @@ -7,7 +7,7 @@ #ifndef AudioContext_h_ #define AudioContext_h_ -#include "nsWrapperCache.h" +#include "nsDOMEventTargetHelper.h" #include "nsCycleCollectionParticipant.h" #include "mozilla/Attributes.h" #include "nsCOMPtr.h" @@ -51,19 +51,20 @@ class GlobalObject; class PannerNode; class ScriptProcessorNode; -class AudioContext MOZ_FINAL : public nsWrapperCache, +class AudioContext MOZ_FINAL : public nsDOMEventTargetHelper, public EnableWebAudioCheck { explicit AudioContext(nsPIDOMWindow* aParentWindow); ~AudioContext(); public: - NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AudioContext) - NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AudioContext) + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(AudioContext, + nsDOMEventTargetHelper) nsPIDOMWindow* GetParentObject() const { - return mWindow; + return GetOwner(); } void Shutdown(); @@ -164,7 +165,6 @@ private: friend struct ::mozilla::WebAudioDecodeJob; private: - nsCOMPtr mWindow; nsRefPtr mDestination; nsRefPtr mListener; MediaBufferDecoder mDecoder; diff --git a/content/media/webaudio/test/test_AudioContext.html b/content/media/webaudio/test/test_AudioContext.html index 34d1e940f1c..a4530812571 100644 --- a/content/media/webaudio/test/test_AudioContext.html +++ b/content/media/webaudio/test/test_AudioContext.html @@ -15,6 +15,7 @@ addLoadEvent(function() { var ac = new AudioContext(); ok(ac, "Create a AudioContext object"); is(ac.sampleRate, 48000, "Correct sample rate"); + ok(ac instanceof EventTarget, "AudioContexts must be EventTargets"); SpecialPowers.clearUserPref("media.webaudio.enabled"); SimpleTest.finish(); }); diff --git a/dom/webidl/AudioContext.webidl b/dom/webidl/AudioContext.webidl index fd92be7df0d..161da026c77 100644 --- a/dom/webidl/AudioContext.webidl +++ b/dom/webidl/AudioContext.webidl @@ -14,7 +14,7 @@ callback DecodeSuccessCallback = void (AudioBuffer decodedData); callback DecodeErrorCallback = void (); [Constructor, PrefControlled] -interface AudioContext { +interface AudioContext : EventTarget { readonly attribute AudioDestinationNode destination; readonly attribute float sampleRate; From 537ebfa2f3153460d792b71ac447c543cda3a910 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Thu, 25 Apr 2013 16:52:52 -0400 Subject: [PATCH 030/155] Bug 865550 - Unlink AudioBufferSourceNode members before AudioNode; r=mccr8 --- content/media/webaudio/AudioBufferSourceNode.cpp | 4 ++-- xpcom/glue/nsCycleCollectionParticipant.h | 13 +++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/content/media/webaudio/AudioBufferSourceNode.cpp b/content/media/webaudio/AudioBufferSourceNode.cpp index 0022f1a44a3..d69af906b8d 100644 --- a/content/media/webaudio/AudioBufferSourceNode.cpp +++ b/content/media/webaudio/AudioBufferSourceNode.cpp @@ -17,13 +17,13 @@ namespace mozilla { namespace dom { -NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(AudioBufferSourceNode, AudioNode) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AudioBufferSourceNode) NS_IMPL_CYCLE_COLLECTION_UNLINK(mBuffer) NS_IMPL_CYCLE_COLLECTION_UNLINK(mPlaybackRate) if (tmp->Context()) { tmp->Context()->UnregisterAudioBufferSourceNode(tmp); } -NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(AudioNode) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(AudioBufferSourceNode, AudioNode) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBuffer) diff --git a/xpcom/glue/nsCycleCollectionParticipant.h b/xpcom/glue/nsCycleCollectionParticipant.h index 19686fcd48d..cb306c37d18 100644 --- a/xpcom/glue/nsCycleCollectionParticipant.h +++ b/xpcom/glue/nsCycleCollectionParticipant.h @@ -381,6 +381,12 @@ T* DowncastCCParticipant(void *p) /////////////////////////////////////////////////////////////////////////////// // Helpers for implementing nsCycleCollectionParticipant::Unlink +// +// You need to use NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED if you want +// the base class Unlink version to be called before your own implementation. +// You can use NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED if you want the +// base class Unlink to get called after your own implementation. You should +// never use them together. /////////////////////////////////////////////////////////////////////////////// #define NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ @@ -402,6 +408,13 @@ T* DowncastCCParticipant(void *p) return NS_OK; \ } +#define NS_IMPL_CYCLE_COLLECTION_UNLINK_END_INHERITED(_base_class) \ + nsISupports *s = static_cast(p); \ + NS_CYCLE_COLLECTION_CLASSNAME(_base_class)::UnlinkImpl(s); \ + (void)tmp; \ + return NS_OK; \ + } + #define NS_IMPL_CYCLE_COLLECTION_UNLINK_0(_class) \ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_class) \ NS_IMPL_CYCLE_COLLECTION_UNLINK_END From fed17fff355b84b3fca2690c40c1c34ada40d427 Mon Sep 17 00:00:00 2001 From: Wes Johnston Date: Thu, 25 Apr 2013 15:19:31 -0700 Subject: [PATCH 031/155] Bug 813288 - Use same doorhanger transitions as desktop. r=lucasr --- mobile/android/base/DoorHangerPopup.java | 2 ++ mobile/android/base/Makefile.in | 2 ++ mobile/android/base/MenuPopup.java | 1 + mobile/android/base/SiteIdentityPopup.java | 1 + .../android/base/resources/anim/popup_hide.xml | 16 ++++++++++++++++ .../android/base/resources/anim/popup_show.xml | 16 ++++++++++++++++ mobile/android/base/resources/values/styles.xml | 5 +++++ 7 files changed, 43 insertions(+) create mode 100644 mobile/android/base/resources/anim/popup_hide.xml create mode 100644 mobile/android/base/resources/anim/popup_show.xml diff --git a/mobile/android/base/DoorHangerPopup.java b/mobile/android/base/DoorHangerPopup.java index e3a4e872fd2..9d88ce25242 100644 --- a/mobile/android/base/DoorHangerPopup.java +++ b/mobile/android/base/DoorHangerPopup.java @@ -54,6 +54,8 @@ public class DoorHangerPopup extends PopupWindow registerEventListener("Doorhanger:Add"); registerEventListener("Doorhanger:Remove"); Tabs.registerOnTabsChangedListener(this); + + setAnimationStyle(R.style.PopupAnimation); } void destroy() { diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index ad7eb2d34b0..9843fe00f59 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -526,6 +526,8 @@ RES_XML = \ RES_ANIM = \ res/anim/awesomebar_fade_in.xml \ + res/anim/popup_show.xml \ + res/anim/popup_hide.xml \ res/anim/awesomebar_fade_out.xml \ res/anim/awesomebar_hold_still.xml \ res/anim/grow_fade_in.xml \ diff --git a/mobile/android/base/MenuPopup.java b/mobile/android/base/MenuPopup.java index 535c31756e5..95ffc4879e5 100644 --- a/mobile/android/base/MenuPopup.java +++ b/mobile/android/base/MenuPopup.java @@ -55,6 +55,7 @@ public class MenuPopup extends PopupWindow { mArrowBottom = (ImageView) layout.findViewById(R.id.menu_arrow_bottom); mPanel = (RelativeLayout) layout.findViewById(R.id.menu_panel); mShowArrow = true; + setAnimationStyle(R.style.PopupAnimation); } /** diff --git a/mobile/android/base/SiteIdentityPopup.java b/mobile/android/base/SiteIdentityPopup.java index ea382919e19..fa591357955 100644 --- a/mobile/android/base/SiteIdentityPopup.java +++ b/mobile/android/base/SiteIdentityPopup.java @@ -53,6 +53,7 @@ public class SiteIdentityPopup extends PopupWindow { mResources = GeckoApp.mAppContext.getResources(); mYOffset = mResources.getDimensionPixelSize(R.dimen.menu_popup_offset); mInflated = false; + setAnimationStyle(R.style.PopupAnimation); } public static synchronized SiteIdentityPopup getInstance() { diff --git a/mobile/android/base/resources/anim/popup_hide.xml b/mobile/android/base/resources/anim/popup_hide.xml new file mode 100644 index 00000000000..5ea5bc2cbef --- /dev/null +++ b/mobile/android/base/resources/anim/popup_hide.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/mobile/android/base/resources/anim/popup_show.xml b/mobile/android/base/resources/anim/popup_show.xml new file mode 100644 index 00000000000..6057b9063fa --- /dev/null +++ b/mobile/android/base/resources/anim/popup_show.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/mobile/android/base/resources/values/styles.xml b/mobile/android/base/resources/values/styles.xml index c25a4b9290e..8aae4263653 100644 --- a/mobile/android/base/resources/values/styles.xml +++ b/mobile/android/base/resources/values/styles.xml @@ -428,4 +428,9 @@ @style/TextAppearance + + From 769a51ef2da972a43eaaa75537f79a5274d3fcbe Mon Sep 17 00:00:00 2001 From: Margaret Leibovic Date: Thu, 25 Apr 2013 15:27:22 -0700 Subject: [PATCH 032/155] Bug 777975 - Text handles for text-selection in the AwesomeBar should be orange. r=mfinkle --- mobile/android/base/TextSelectionHandle.java | 2 +- .../resources/drawable-hdpi/handle_end.png | Bin 2356 -> 2441 bytes .../resources/drawable-hdpi/handle_middle.png | Bin 2517 -> 2557 bytes .../resources/drawable-hdpi/handle_start.png | Bin 2303 -> 2406 bytes .../resources/drawable-mdpi/handle_end.png | Bin 1734 -> 1778 bytes .../resources/drawable-mdpi/handle_middle.png | Bin 1850 -> 1936 bytes .../resources/drawable-mdpi/handle_start.png | Bin 1676 -> 1731 bytes .../resources/drawable-xhdpi/handle_end.png | Bin 2812 -> 2967 bytes .../drawable-xhdpi/handle_middle.png | Bin 3034 -> 3076 bytes .../resources/drawable-xhdpi/handle_start.png | Bin 2702 -> 2787 bytes .../resources/layout/awesomebar_search.xml | 3 +++ .../android/base/resources/values/dimens.xml | 6 +++--- 12 files changed, 7 insertions(+), 4 deletions(-) diff --git a/mobile/android/base/TextSelectionHandle.java b/mobile/android/base/TextSelectionHandle.java index 5a88f614265..40acf29441d 100644 --- a/mobile/android/base/TextSelectionHandle.java +++ b/mobile/android/base/TextSelectionHandle.java @@ -172,7 +172,7 @@ class TextSelectionHandle extends ImageView implements View.OnTouchListener { if (mHandleType.equals(HandleType.START)) return mIsRTL ? mShadow : mWidth - mShadow; else if (mHandleType.equals(HandleType.MIDDLE)) - return (mWidth - mShadow) / 2; + return mWidth / 2; else return mIsRTL ? mWidth - mShadow : mShadow; } diff --git a/mobile/android/base/resources/drawable-hdpi/handle_end.png b/mobile/android/base/resources/drawable-hdpi/handle_end.png index d5e204429ef3935c6e67fdfe71e9be70497a8a98..dbd752831879284edc74731c922f1ee33c432a52 100644 GIT binary patch delta 1656 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 VmM30>_W%F@2>?k&PDHLkV1oIz)+GP{ diff --git a/mobile/android/base/resources/drawable-hdpi/handle_middle.png b/mobile/android/base/resources/drawable-hdpi/handle_middle.png index 5dcee14f7a70c720d23716cef4cae3c399c7f96b..2b63c0e438b982a553427977e82e03acf5e5339a 100644 GIT binary patch delta 1773 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 Tm{h$I00000NkvXXu0mjfgS62A diff --git a/mobile/android/base/resources/drawable-mdpi/handle_end.png b/mobile/android/base/resources/drawable-mdpi/handle_end.png index 32b77dfa6e26a4560c1e921110e2ce0b4ed5bd76..64bbc0b669fefca2e3b0fca6c18dfba7c14f14f7 100644 GIT binary patch delta 988 zcmV<210(##4e|{kiBL{Q4GJ0x0000DNk~Le0000l0000w2nGNE03bX7gs~wx0w6Xu zH8n6bH8?~c)z_5c6_AW1|)RCwC#n$1rWK@`B>bh}WOZ_+fe7BN~)L=X-}NCZg$IS>yD z(Vz!|dLZ<~#ft|;0WtBwAE2N{6O9K2{}K;|gYkp~tkzTuTN~Ql@eLiIa4_t4ciAR0 z$?JY}KYo2XzwNwk38fT@wR!itAt8iK{CTV5e^$d7O{B-@32t3#IKyZC`<;0s@GSM@ z;<>Z!o7NIav`&mP%@1EWeGK1|o%XhCsY7(tl{qe@>BYk&2020nsgyXCBxivTb*Se35&aH$hMugkn$nj9*a&YePXh&zEB0D;q-4eNGMd@!> zW@pDQ+{_c%zDjDdWs@3Y5*g4Uy#D#nO3Q$|&*JJCDW__4g(UHg#lR`CNCbW3 zwT!c5T`TN=+5t0(bPK#}hQ%%L9>;cqV*bPeUcd`@0WaVMyer`~${xR1Ri5LZk~#># zq{8pD3|4d&fV1N)tFUVJ7+!~^6pKTDb>)*?o$i3q~MNE1O4Kn}!% zLNw^XpdLtj;^M`FqJWrq;15u$MiY$(1^*HchJ*2hrHEpX!q$d%cYFgw8P+1SyUVFB zdAmD1oB8a#`OePUA(T=egaDcswrmk>HpUT6e-aC~F4dpmmtJt#Ho>gRUYm(LP72NoAHiUouR`X zykCJ{CJ(qmeFwI^x&1#$FNSZd)y`A>}CRI1(_zPN1oMB`hM0% zfBFK`<3nxd?G~K~R>TTI(@+U>daydK_O+_dpAL5o*eN<`8;er14Gub}bit^rh(UKV z41bvDd1RO9_VDHuN{nChpnFzt32N6+bgw%@b(^BAb`ZQ_3eAe{>}a@Qdhlvfkc-mm zC|DF-y>GEL(tBviis@6)Vw>pt^A(-t z`6!BREZp#MucEVM_1XH;Ee0Z&{Zo&J+S+#$oo&lrR&<_uwYOD`Mn^8(6h!xrxx_*y zp+kBp4MxGQlg96E%<#)e(tgx`fAUWAiQ7*;-Q5+OT1Y{%R07#@95h;`By@jbf2kh} z_ju3gj^MS0HAt~BBX$HoMdgjm&CQx*0o@Ty4T_FuV$;AI>&G(A$v7ge|JVU@2lorC zy&L7*tGS)7ALw#@SFy}SJRlq*Z^hi#5Gvi=^2;s zEWDh7cM5@lBb88TB^h8nom+)ue{=@knllga50UNql;ia&^yBCOz5^gzOaYeBx?5_d=oOaA)}0pr)-oLhYKkdD>qA76t%BG8kV` SvFgzP00001cdv#4v-HaiBL{Q4GJ0x0000DNk~Le0000l0000w2nGNE03bX7gs~wx0w6Iq zH$y}=LN`Q0G(#~lMKM7&H!(RyHAOT*I5RRvL^zXr0vsSQHa9~=HbOQ;LNr4$F-0*! zH8(LiMKwhyae~wynKdw|+PEZAvg0c*Lp(;0T14o!O zK_zh5)qJR`w#@zF$@L@WNnZ^I1U0~0FJ_k>^MIQ!)1XwC_M@@ma!#ch4hXElTk1VW zkLMfO_n60_NqR3O7$=bTfd1BPUsefg2Ux+|3D}jI^t|%J=7)*42~j7F;WrL}Fno2I zev+WwwQB1ySi13gsMt=)o)sPayO)=e8BN zmMWrzAxVSg|9hVe2}U>;a==%ELjS27ubaTi9y>0JO96cJ{nN=U-V9S+v^0#w;0&{~ zbVzH3BOn&OeDl4dq4z^8el#YBe@mlat!tB}Kh{}>tVmjzLK4#>(HOFX2SL)zOdamr zqw^tF@MJyebWj4~{G=-Bi#R`p^un+22f15f^}-S-Bh=1}&`QK3dhv)Ddp2Kr^4!;}WB_t!Uf82Z`vTR>9 z_%8u49S8!*+5uvZ*!>&;lS=fI)Cf`c0C<=Lk^uk! N002ovPDHLkV1nOf0oMQk delta 1061 zcmV+=1ls$M54sK^iBL{Q4GJ0x0000DNk~Le0000U0000i2nGNE0CIu|1hFAG0w6&) zF*7wbK{-N3IW#dbMKL);IW{;%MmRV@GdD#zMlzFn0vsSgHZe0bHbFQ-MmaPwF-0*s zLpe4$L`FC`K{Gc+I7Tv)wgO@xF+?^tHbFB*F-9^lHaIacI50RfMm9z?I59IfMmaJx zlQ;u@e>pNxWdHyJXh}ptRCwC#m)lDeQ5e9#nZ3Jr*HByAc4e(K*;P?7!;C@}A@o6^ z$W-*9d}u47QbLF>bVINt1dG5@!=R`BgP_M=dZ`Bqx~XmJ-Bxkk-E*3=dq##W%~?lZ z+7CWv&N<)te&;)vneVWWoMZ@8v|x;ZO%e(hf0{~4g=MkACIMvzx(_wA*129kzj@?5 zDJKJG#X@^77S$f}z-^~~3{~c@c0RgX+?WiU6$8D|?m2qAT-&$DFwN-ECzPX`!QL{> zox8rm8nN)rfGx!7m6n3i`oo4NcJqu(jixZSML@|tZH5`9u0q#;?Touh4E$eUBeC(F ze{>yatTqoj%(F^03dEpve*!6UgON8>86S5vx(X@WxD~LDQ)O$NGq<(I^1^AE)24wR zGk_8g2WW5r=cdnTo4uA{Vo&)G1O5$CQ&ixz&OKcR6U^;+;FXU3wb zy)JW<^y7Vq0V~L8y$7upU%hoGKP#AHe_;F^G_v8;F%ShkXXnZcW|Mx^<-5~q)bh=M zWn_Jd_gi#bP4=Mz>r$RUMxfzM?Nnk%>`A|?&Gun;Ub>d6Hc`Lpg2|>Z@6Fb!?)hBL zJhl~&Nj8aC91{0o;Ot31k1gc6e{SDXTb52m{B8ucnDi<|f2Vt($QCL$%f&+zf8oXU zNM+w8cdt^x$`X$m!+#*SMs}pTq_@HuZOCB9ksL3>Rwcsfn5l@Bc{|3Ap1$?23*zT+ zn*1dAg=hMj?bk~Ts|`l~Bu3!{SOqC$78?}^%8Xg39yU9sJBB~^@GWv0wZbv~rOh~Q z!f0g z3C0owlNa=60^V~P;P1o|vZI_Xa5_%k*TAIkLy&1M(L9WiXr{?EbDq-)PW_Y@14k$< zK#dpIyILkGVd^tLIT2yRK{}dWf}~rjh>8CYWh@CJChNaS*Fnl@PJ~CO#@85Q%r`{o f0Cq%v3orowcq0ygOx4~13jhEBNkvXXu0mjf!z$W` diff --git a/mobile/android/base/resources/drawable-mdpi/handle_start.png b/mobile/android/base/resources/drawable-mdpi/handle_start.png index cf12a0dcdcf3b27566fb4a4cd990306965759d3d..3dd7d7a0eccb519d594e36318edc193ccf2ed24e 100644 GIT binary patch delta 941 zcmeC-JERLtr1gQ=ih~VED%dczY*e&lQZO_#cXlyzGInt? zaW*t`HFPvJH?(v$bv1FcFg9{?v6x)NBm+}qgj3NrrX&ReQwsw_Lvs@Yb0Y&Y3qwN- zXG0TbM;A9sCrd+DXJg077R+_^_H!k#FfcHE^mK6yskrrK*4b=fM~P$U-xkj@QOxa- zUn02rhSSQWN=eERtA8*qGv~jhbVH2g6gG3w@KP)^Zwe;HaE-Dm<*3Ch@E{ci=9J}zt81zVP*Y# z&QKPQ1}Q{hIkjx@`l{ro=jt_dlsaBBO#IGilQJ{hWfE^|r}eR# zs$3)E73aRWbQ!eN3lwbmym^<$hbuDzv(B{MJYAgbe?_gYZCXHk>_*RZ|9>l7^!46v zvghIK-k)s}#VQM>J+}MamwPFdpX}Ga^xjw1Ye83LXx;m?RqSF#qy7AoJ@;ff_q=)g zEB#FE`rIhv`ehqu8@4v(o2B(h6xWz1cd^~iIm4QC=5w9&WO1M`+RNL1t8HFsqo4e# zf&a{my2I8>bL`4%Up;F0)Uw_1Z(DnJ|G6{$^VaywIJzzg*V^{<;EawNw~PW6K70{e zr+QZZ@x~;LW)cBb{0Uis@@Z(#MBcTl$C)6)8@UI$OO6~D@pX3qJ& zIM(WZnentoLUt;LF10_})PHZ?hebLwI~Wxos_to-{y`}2koOO_%^T}qGi_PrV&PD+ zn9I!UHAB^2##{6IHpj5qH_u{ww4L?C#FYPe{wyt`{M9)okMH{?)M+&M`+ncNT{Cud z^h|+68kLs5i{`sbayhfOy#B?L(z!>3I@hakwPa2XfA;byk5FP+TxziMiy+eyHBZ&e zK1r>;=Y7q@nB!8Pt9{t^FE~AU&89-#d7BnSzEcontp7eiD%vp5*xz`sZ|&&^+c_tn z<(4ywn3{TLZA#g_hNDc6ZJiF5{d?c2!>kM3!o0_H#l MPgg&ebxsLQ0D+pL6#xJL delta 885 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 delta 2253 zcma);c|6mN1IKrnBgf`ut{hP$JIuy}%~sB2syWhfmXxC+tOIc5yx;C7~(-0)eFLj@r8J zlC&F!7<{*@3vM@RnM1T}@Mr?g6l+4J5pifV6-}fN@dR5Mfnb9*qY`MC?CTJ<|4JCz z|CG28A1$;k9*?)dQqeSw37&vP6HEwL8lHwDps{8&A_kXDfW`p5u`AsmkeHaAt&Q8Y z>6PNBVEGejee-G-H-_hw${pONFO?-sgx{3_6YZ1iaYyBGVrckF1jQveMcGGt-!B_6 zw1Id^DKb{jAiiOZFv({ruMPD#mY4JIw9Kro4R5us4sS+yl#U%Nsoiq$4lw_?j%}Z} zXlo9!XIs3z?FuM*Hq*HCPp#ZE?*|RUh=4GH2q`zc%xwO za}5x0=&<3TzN_1nzGn5M?;Hza*A$qr3*#y^AMj=gB9M}h-4P=D zpwuY-w!3rXKkqx=nNE!b`0kq!mO*tG@>a|e%khuy8^yrqhS?9%sI;?_p2s9F;xWNM z{e3b}X{K%-QNx83A5wNgMpT)whm<|Sw`VnGmi0tD6F*WDr}GbF!7r+(mxFA_kg$>E zt>`);nmq$-lB>jtjyjstZZfIN4bu_|{69{2+m1Iqoz+CGGDDJZsr(H!$yzA#96r1v zmUN0rxm``VT)sD@II%zDNe~-pBob=j2Vg_*w$r&`53IJU=t}Y`*Vb2FjHxLkkm`Bw zg|qayy^Wij-#);?N$Jr@H&LU`>jZVDkki=hX7rB@2_+@@F!j}%$ zOTmktFL#z*Zqr8lGOg|fu@?LPV)t+#zkB0sAp7x#)QL`t+_`f> zA3}9L<*vQHL2;0cn5=0Ws>o{|y8JyTD^9ARC4Ia~IDtirlAKo%={EtAxsD-FeMlbPoXe>Ke0Itf?w)3k8kjuG7Zq-fH*GF$ z?b|^8-1hJ|6rh1$)Lnj)ss=O8^ABg1R#t3&8lmsRjw+j^7$=s`d3%`yF`c-XydUWv zCCE8)gJrKFQI+Zw2f4(%`0P+$l;ET9>%4V%33B1~u&0aH-{gd?B646!r`QFp*WC>~ zowQOZ+~T*lhQ-ptLOHesX{g*|3;UA~o*YFBEoRUQM$V@VldinbbN0&Z6T8P@x zJo3BkM8d+?{`qsgEIK9x2xtrWfqiO`S#h-}8?!Fxs<1(+j84rH_ejxWEMtt_>g7=~ zl14+%Q|u1E987?=A1TC7*^AH%xn_=vD3UBH4o(Q1;*I45{yOg{hmwKqs>%M|!eu@7 zYI$2O*=WlEA=-Lz)d#xYXpU+8^+o{vb9`%Fon8+Oaw|;;2Wa{WJDkxn5$PEILrP{v zTCPB#AvMGDkUX`Yw8s5%{RT5LaP!B*#y_SmbiIvyMC}oRdw;B`j%7@RFwoJHVn8st zW%w5Oae)!u=y~-SyAF%x{_5V=Z%*jqf+xth(_rU8Qc;0#JHs^mpZqRvU$IecRIPPw zZhU}8W7nV|aA;KJ*?Qg{L)#UY(Ygi^lw=cee}4WefD?{a%yKU(-OI;Yv^E`pQR%yhv*;- z2e}SwQ5ki8;!V<%x(&(-Y{cl=m=9dL+#)TsCP%Rgf+%dZ=pr+2_o+y_-^}T-JJ+Z} z1)dykVfSpa&@d%x#T8Y~SgQ7{wSQ!M5xo`RglS62IvK8>SoSl%i8n40`Cgl@ihv?O z)K~Vmw039dUV~+ezq@cuDF*Zn%k=-k6VHwY8CItdd`Zrll+^=R<@wB`yIWawnZ+w& zUcu>5iGcHdjq8Dw1=qmf656%T#D=Y4^(3=ike(mXbX!3fZ48t3d>N-+q8NCw^HkxWwX^5 zrIG0l$CBfF^uu5cs&o(CCVF}}13bI8>mG+*S9$LWI9#Hxkezd)>BNCBe|5MmZn7|H z$+iS?vNlc8{onxkjlj*`uxudv{5=QP%RE@}vjaywbthGn7T-HGjiu-jKc7tNN=n7K zeQmGC#pEyhRaJYPGW^8v$dN!lcD8w|^s0WlmjcaQwF1LIdw<;VBFSwj?>-ce9o5;k Ij?9ex7yj4=3;+NC diff --git a/mobile/android/base/resources/drawable-xhdpi/handle_start.png b/mobile/android/base/resources/drawable-xhdpi/handle_start.png index 9af76544812cde651e7e2d246f91bf8f37fed77b..c23fa492af35bc2bc9c458d6eb1d690cafc20f87 100644 GIT binary patch delta 2004 zcmZ`)dpHvcAD%liM6F^Ml*_3UV;Ie4Y#1>olSFi+h-P829NRP}Qm7AcLM|H)$=v3C zJ&G|UbaM$4o=N5w65(^s^YlF5Ki?m}-|uWjFO2sC@-MzO5JEg1}XCQ;StEmva*_)_pWMzC(@+F*xj8D)`=QGO+ROC zn|*g<91k2#$aA;`%G}6P+OXPq(UhQ!rNxkr>75)+4~cx;`Pfh<&bhZxl+(MirIR|G z9noZz`*m!B-1jmY{_Kl6L;SJ6*ggOipyb$6K->vUT;`5XtTgu$54Y_q|7G`bMsaMK zVVU}UAC#fqm}R3c>+k4G8wvy2B$@SZ7pz1eGqxBz&D($7n&F?@ymRwoBy2ZHPhYW=!Mck*s30lr9iWSm zS$acYi27txczjRVkjFtFsDHdu@Abn6s$Jg=hI%)>ax! zWzG%CaJ6a;CCCmEJOa%8WYRyx6CPJ0=>Tv4Z* z>~R*sO&f&PcXP1I-w7TI7gnB)gZaRtN^>5|Y=!x&(OAH)f4>p_k-O)o$lQ-j)At*$ zRA$J3{4E75v&I7rtDNYNyc`ACt)RBn(p>1mqReVzDaJs9SVM-^fabQ`aDimh1*U0U zWXtgRwi0$;(-GmhRs!e*3!cTNIP!}W3Xp#!6X>fQbIIRx_80EZBh$yf6>FJ4Hi%&$ zZ;U*EX6ON}pduUYb);;vtw93axE$x>gt6>AVXsoA3-Z7NPG7GEo(SQt z`BgE}r1Pc97K;^chCH?Oc%okR>XC!WySVFZOno!h<__$>kQ~@6;&dlXZ@%zx@Apd% zY@5C`yRmwECOE^mJ~?B9)9X3gc+a>KL3;?5&i3ipx~5{mxZXKlbet40NmXev+mAoc zP7oh+dYahP*fGy;Iz+$d8y$elx$l!O9x=^G*6YFKOObrsyqd#lID#{s%O|83Th0%W zZlt*7sYln{8fdJ|HmcrMZu5{WWx^v@4Tkyzh}-ajwa2j{$jIExYsY4qpN=!@TZRzu z0~Cx-*rbJ&Y%Q(OlE4XdwmHG~va|*c=t+xFbsBj%AGGPTMOE-*Nh53WJ=&w3apW{I z!CdMG6+N*Yv^@_Cc4{hR#)7M{nOOV55d8*!quGt_1?^YmdQa9!k9Uh6EQBf-nN-UP z)NQ}5*JoRNY;7oW*_l=)>-QD(hF^P#6#;WN!J8{#=#_8r>97l~@Cg-u^V3G|-SkuV zx5w^20lbghk5P$H-vesr_SDYESg*fO2gZ`3_C%#=o z8=Ly$4`O(^BF~Z9#$#JqhQ5q+5Bbvb&O=u-ot$Q`$m z{CbiEwNiX?@Ix_^yK^^0ctu`&?#E&BytDFQswYfS*&=9BIo>=4&Q^OaqI3=1LBc*q z_!b)F)0lGoQi{!x+h@db=cxel?I~?aWVKZ{mM1^ELl1x0BTx{=o&g&7EMauabJX9& zo}p*}>SWQf?GjV~LrHuI0GAYq{R{WS$Si39lmr+6eDC?c$SU6tc-9>#NU}FWEt7 z^W*jW51yWB>R5l>-~1%tqp#pu0v4+kv}C2Grj2=!+Pa zF&i=|saoX4S@UH?vzTRH16`|U zEt%3h&>$H(b_q2`oqiC=2rZucN=O7hUrtV3?%~*Y+fP9$fBP*(qt4vW#e{~1;k*-x z_5J&Wd0xs_Q<8pb7dr9d(yp4pLtzHy-Azz0kWa24>gf0SDH{c)Tq`-$XI78nQcq3J z9Nw^pskl-uGI6>#!oBDy46;s@KbHqU$H<87wari0PydsGe~bpe|81e4{7+f~K!$AV aw*#!Z*y(bzb!&S?4Z!1EupFC9%>M#lHmlqK delta 1918 zcmZ{lS6mVb1H}Oq_a2c^pSiOkpdq*?j*ROnQ8RI5id%DDi(!<8dQCnG6IbO*bLGe| zL#^nVmWkUm%}>eP+n@9L@;%;%bI!~E<(!u@rI@LxlIDc9l@wDJ0{{S$_IB1TM`?T{ zoCx^H%X9u)t6~UJu|UH0E+Q>1T4K=paJUT|ZG}dntT8B*g`R;83WK00fuR3~^#2uV z1o^4Jt&vEig`N!@gMcAXa5xHv(!(Gz`Y5=b0S1lGr=tY!5WfrN{{R5ME%w$HZV4mv ztc3^#8z}c?!D7)Cry+iDlTZ*89QN}3ACkr7&AYuSc!flmoQztkWh%}!O-4{vMUHBx zs_mkjqS@MWY};)6!ImaQW<%)O=eBRrVa@FE#Y{c!Imf@|Ox7pkmfq0!5Z!SRTU*Ub zUGaf8w;qvYh!kt8F9ep?yYdtm@M`aXi=w?yCGc+V9Exd)uNJD{)b5>+Qd;JlE}|Hr zK1gZ&$+EiGCU>Jd2T$ipZTf#=zng1~7JQAu8B}e(YcAV-89TinTP4hB3LnoBfk{fn zoMLhiH@X`zqVTfLf z7Tn1tZp!YHdbF#rU`YFZ|5T%Lt5I(vAu2W?q);I;0&!_-{Oo|R?Bx?My!i~DYL$!_b4lm~{hK-dr+#wWt@_Red z>3(8mi~tT^`s(fYMP1!jtm^vR?yE4;PKf?6SAqIr`}BiBn6_;owyXc^;G)-x@%#oZ znIo|$x8?@Rvi8ki_g@fD8v?m`5Y9qBt_iy*H`nOw5z@Zh?+S)|jQu-cO*~)Xvi!$@ z>lOR4{)3dC`C*cePdHG-^V$K3Qdwr3uN<+RAcZ3@+-5f~vNX@82a;vAzZCVTM9xcVvCVMTbvF{klIujj zvRraq4JSr`n3}6@Ik`%&yL@i<#WfZi*N=x;&ZtXw3>#`y#}UWAdoRrnUnLf|qKHGd z_i8cOwiBWGkKN@rm-DA-O$oFe!UK>^T)4U4^m1iEuKQ=!g;O4Hqpr{<9jW_OcwoE+ zM(I`b9aCCi!V5lU=GI2vla#R7)$v{?daOV+rdJ6@X(;OK8*w9;G!thByQlvecrBSQ zvn~_JrmhVCt{yeef3!4qjrYR|dbB@2hVslw@^Io6@Xz)A%^SHb)W=?v#HOedEY3Ydyj zW3zkCB@;vYYc=|(jEsevzA>=o0~B<(e&p$c`QMG5?Hz2-3rI#rJ^L=uJ}YHJBM%(e z#Tp+Sshh}i*V&mPdRr+Du~6G~Yc;M%b$GJ^XW!0^R{n4s-dD<`7lddRkfW= z2XgVdrVAru&Rpo~a?^2Ms!uk#vCCe{UJnHIQkdJVnNDxgS-t1AZolUQ@NOeiE7JUV z0)b^u&PpFP^rPpqm_be{YUhAboxH0kFs(yIjyx}IPW0#~Q3scf-)A&6RB? zqUPzXaf8`}U+5y3i6-9!_UTxUBZ(|kDKN(|toipK8rC4m9jaOCl4cbtF&${^v2D?x z-S;Pcd@G9^ERPD;<{rvTn`%&r&A>ame?myIx9}cT4pY}6u}x0l@5TiOvll+ACq{|3 zdZjLjPWdE_IQJDsHZmwTj83$b7z#&X=^uxJs|2V_-jAO+Kdw@}u zDy;B*s?3CQw!b=dy8fDHBE>c;L{CgyG&EpaLlq2L;q!;D;((`0-A<_$k!ZDOQQ&2v zu8$TcM9V-GEwVP!T0;Ei2yXrtA8l?q63-rwM# zS8SNYUm<*1>GmX-__y~wk32dp 200dp 156dp - 30dp - 44dp - 2dp + 47dp + 58dp + 11dp 50dp 6dp -11dip From bbbd463292eb3aee8a8912c09f2f2296b7fa6307 Mon Sep 17 00:00:00 2001 From: Margaret Leibovic Date: Thu, 25 Apr 2013 15:27:28 -0700 Subject: [PATCH 033/155] Bug 786999 - Remove ellipsis from "Site Settings..." menu item string. r=wesj --- mobile/android/base/locales/en-US/android_strings.dtd | 5 ++++- mobile/android/base/resources/menu/titlebar_contextmenu.xml | 2 +- mobile/android/base/strings.xml.in | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mobile/android/base/locales/en-US/android_strings.dtd b/mobile/android/base/locales/en-US/android_strings.dtd index 9786d9ebd88..5aed0eea651 100644 --- a/mobile/android/base/locales/en-US/android_strings.dtd +++ b/mobile/android/base/locales/en-US/android_strings.dtd @@ -172,6 +172,7 @@ size. --> + @@ -180,7 +181,9 @@ size. --> - + + diff --git a/mobile/android/base/resources/menu/titlebar_contextmenu.xml b/mobile/android/base/resources/menu/titlebar_contextmenu.xml index d0bab72bdd4..6daae1d6c02 100644 --- a/mobile/android/base/resources/menu/titlebar_contextmenu.xml +++ b/mobile/android/base/resources/menu/titlebar_contextmenu.xml @@ -21,7 +21,7 @@ android:title="@string/contextmenu_copyurl"/> + android:title="@string/contextmenu_site_settings" /> diff --git a/mobile/android/base/strings.xml.in b/mobile/android/base/strings.xml.in index 62fe95a9acb..177544a39e8 100644 --- a/mobile/android/base/strings.xml.in +++ b/mobile/android/base/strings.xml.in @@ -151,7 +151,7 @@ &tabs_private; &tabs_synced; - &site_settings_title2; + &site_settings_title3; &site_settings_cancel; &site_settings_clear; &site_settings_no_settings; @@ -175,6 +175,7 @@ &contextmenu_copyurl; &contextmenu_edit_bookmark; &contextmenu_subscribe; + &contextmenu_site_settings; &history_removed; From 7629e7975b34eb9b26fffc18b3d1dd06b35c51b4 Mon Sep 17 00:00:00 2001 From: Tanvi Vyas Date: Thu, 25 Apr 2013 15:40:42 -0700 Subject: [PATCH 034/155] Bug 855730 - Remove failing test so that we can re-enable the rest of the tests here. r=smaug --- content/base/test/Makefile.in | 4 +--- .../file_mixed_content_frameNavigation_secure.html | 11 +---------- .../test_mixed_content_blocker_frameNavigation.html | 6 ------ 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/content/base/test/Makefile.in b/content/base/test/Makefile.in index 5b8509046f3..7bdbcbd959b 100644 --- a/content/base/test/Makefile.in +++ b/content/base/test/Makefile.in @@ -599,6 +599,7 @@ MOCHITEST_FILES_C= \ file_mixed_content_main_bug803225.html \ file_mixed_content_main_bug803225_websocket_wsh.py \ bug803225_test_mailto.html \ + test_mixed_content_blocker_frameNavigation.html \ file_mixed_content_frameNavigation.html \ file_mixed_content_frameNavigation_innermost.html \ file_mixed_content_frameNavigation_grandchild.html \ @@ -664,9 +665,6 @@ MOCHITEST_FILES_PARTS = $(foreach s,A B C,MOCHITEST_FILES_$(s)) # test_XHR_timeout.js \ # file_XHR_timeout.sjs \ -# Disabled for frequent failures (bug 855730). -# test_mixed_content_blocker_frameNavigation.html \ - MOCHITEST_BROWSER_FILES = \ browser_bug593387.js \ $(NULL) diff --git a/content/base/test/file_mixed_content_frameNavigation_secure.html b/content/base/test/file_mixed_content_frameNavigation_secure.html index b56242e0c5b..29a5d946eb9 100644 --- a/content/base/test/file_mixed_content_frameNavigation_secure.html +++ b/content/base/test/file_mixed_content_frameNavigation_secure.html @@ -60,16 +60,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=840388 setTimeout(navigationStatus, TIMEOUT_INTERVAL, iframe_test1); - // Test 2: Navigate secure grandchild iframe to insecure grandchild iframe on a page that has at least one secure parent (in this example, both the parent and grandparent are https) - - var iframe_test2 = document.createElement("iframe"); - iframe_test2.src = "https://example.com/tests/content/base/test/file_mixed_content_frameNavigation_secure_grandchild.html"; - iframe_test2.onerror = function() { - parent.postMessage({"test": "securePage_navigate_grandchild", "msg": "got an onerror event when loading or navigating testing iframe"}, "http://mochi.test:8888"); - }; - testContent.appendChild(iframe_test2); - - // Test 3: Open an http page in a new tab from a link click with target=_blank. + // Test 2: Open an http page in a new tab from a link click with target=_blank. var iframe_test3 = document.createElement("iframe"); iframe_test3.src = "https://example.com/tests/content/base/test/file_mixed_content_frameNavigation_blankTarget.html"; iframe_test3.onerror = function() { diff --git a/content/base/test/test_mixed_content_blocker_frameNavigation.html b/content/base/test/test_mixed_content_blocker_frameNavigation.html index ad40cd1b78a..f35ad06d62f 100644 --- a/content/base/test/test_mixed_content_blocker_frameNavigation.html +++ b/content/base/test/test_mixed_content_blocker_frameNavigation.html @@ -25,7 +25,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=840388 var testsToRunSecure = { securePage_navigate_child: false, - securePage_navigate_grandchild: false, blankTarget: false, }; @@ -105,11 +104,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=840388 testsToRunSecure["securePage_navigate_child"] = true; break; - case "securePage_navigate_grandchild": - ok(blockActive == (event.data.msg == "navigating to insecure grandchild iframe blocked on secure page"), "navigated to insecure granchild iframe on secure page"); - testsToRunSecure["securePage_navigate_grandchild"] = true; - break; - case "blankTarget": ok((event.data.msg == "opened an http link with target=_blank from a secure page"), "couldn't open an http link in a new window from a secure page"); testsToRunSecure["blankTarget"] = true; From e84ca2109d7ca2bc83b0ac019a4a99ce9baba257 Mon Sep 17 00:00:00 2001 From: Luke Wagner Date: Thu, 25 Apr 2013 12:28:29 -0700 Subject: [PATCH 035/155] Bug 851627 - Make LifoAlloc::release run in O(1) (r=sstangl) --- js/src/ds/LifoAlloc.h | 44 ++++++++++++++++++------------------- js/src/frontend/Parser.cpp | 1 - js/src/frontend/Parser.h | 2 +- js/src/ion/IonAllocPolicy.h | 19 +++++----------- js/src/jsdbgapi.cpp | 19 ++++++++++------ js/src/vm/MatchPairs.h | 10 ++------- js/src/vm/RegExpObject.cpp | 2 +- 7 files changed, 44 insertions(+), 53 deletions(-) diff --git a/js/src/ds/LifoAlloc.h b/js/src/ds/LifoAlloc.h index 167a61c52a9..d2a8da9731b 100644 --- a/js/src/ds/LifoAlloc.h +++ b/js/src/ds/LifoAlloc.h @@ -307,31 +307,30 @@ class LifoAlloc return static_cast(alloc(sizeof(T) * count)); } - void *mark() { - markCount++; + class Mark { + BumpChunk *chunk; + void *markInChunk; + friend class LifoAlloc; + Mark(BumpChunk *chunk, void *markInChunk) : chunk(chunk), markInChunk(markInChunk) {} + public: + Mark() : chunk(NULL), markInChunk(NULL) {} + }; - return latest ? latest->mark() : NULL; + Mark mark() { + markCount++; + return latest ? Mark(latest, latest->mark()) : Mark(); } - void release(void *mark) { + void release(Mark mark) { markCount--; - - if (!mark) { + if (!mark.chunk) { latest = first; if (latest) latest->resetBump(); - return; + } else { + latest = mark.chunk; + latest->release(mark.markInChunk); } - - // Find the chunk that contains |mark|, and make sure we don't pass - // |latest| along the way -- we should be making the chain of active - // chunks shorter, not longer! - BumpChunk *container; - for (container = first; !container->contains(mark); container = container->next()) - JS_ASSERT(container != latest); - - latest = container; - latest->release(mark); } void releaseAll() { @@ -381,18 +380,19 @@ class LifoAlloc class LifoAllocScope { - LifoAlloc *lifoAlloc; - void *mark; - bool shouldRelease; + LifoAlloc *lifoAlloc; + LifoAlloc::Mark mark; + bool shouldRelease; MOZ_DECL_USE_GUARD_OBJECT_NOTIFIER public: explicit LifoAllocScope(LifoAlloc *lifoAlloc MOZ_GUARD_OBJECT_NOTIFIER_PARAM) - : lifoAlloc(lifoAlloc), shouldRelease(true) + : lifoAlloc(lifoAlloc), + mark(lifoAlloc->mark()), + shouldRelease(true) { MOZ_GUARD_OBJECT_NOTIFIER_INIT; - mark = lifoAlloc->mark(); } ~LifoAllocScope() { diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index fb26403bf06..2be9a2e9837 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -384,7 +384,6 @@ Parser::Parser(JSContext *cx, const CompileOptions &options, : AutoGCRooter(cx, PARSER), context(cx), tokenStream(cx, options, chars, length, thisForCtor()), - tempPoolMark(NULL), traceListHead(NULL), pc(NULL), sct(NULL), diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 22b006981d5..f5f7a086a7f 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -263,7 +263,7 @@ struct Parser : private AutoGCRooter, public StrictModeGetter { JSContext *const context; /* FIXME Bug 551291: use AutoGCRooter::context? */ TokenStream tokenStream; - void *tempPoolMark; /* initial JSContext.tempLifoAlloc mark */ + LifoAlloc::Mark tempPoolMark; /* list of parsed objects for GC tracing */ ObjectBox *traceListHead; diff --git a/js/src/ion/IonAllocPolicy.h b/js/src/ion/IonAllocPolicy.h index f604a5005b4..7d53294cb22 100644 --- a/js/src/ion/IonAllocPolicy.h +++ b/js/src/ion/IonAllocPolicy.h @@ -20,34 +20,27 @@ namespace ion { class TempAllocator { - LifoAlloc *lifoAlloc_; - void *mark_; + LifoAllocScope lifoScope_; // Linked list of GCThings rooted by this allocator. CompilerRootNode *rootList_; public: TempAllocator(LifoAlloc *lifoAlloc) - : lifoAlloc_(lifoAlloc), - mark_(lifoAlloc->mark()), + : lifoScope_(lifoAlloc), rootList_(NULL) { } - ~TempAllocator() - { - lifoAlloc_->release(mark_); - } - void *allocateInfallible(size_t bytes) { - void *p = lifoAlloc_->allocInfallible(bytes); + void *p = lifoScope_.alloc().allocInfallible(bytes); JS_ASSERT(p); return p; } void *allocate(size_t bytes) { - void *p = lifoAlloc_->alloc(bytes); + void *p = lifoScope_.alloc().alloc(bytes); if (!ensureBallast()) return NULL; return p; @@ -55,7 +48,7 @@ class TempAllocator LifoAlloc *lifoAlloc() { - return lifoAlloc_; + return &lifoScope_.alloc(); } CompilerRootNode *&rootList() @@ -66,7 +59,7 @@ class TempAllocator bool ensureBallast() { // Most infallible Ion allocations are small, so we use a ballast of // ~16K for now. - return lifoAlloc_->ensureUnusedApproximate(16 * 1024); + return lifoScope_.alloc().ensureUnusedApproximate(16 * 1024); } }; diff --git a/js/src/jsdbgapi.cpp b/js/src/jsdbgapi.cpp index cb40bc8ab14..dffdfc6f6bb 100644 --- a/js/src/jsdbgapi.cpp +++ b/js/src/jsdbgapi.cpp @@ -475,22 +475,27 @@ JS_FunctionHasLocalNames(JSContext *cx, JSFunction *fun) } extern JS_PUBLIC_API(uintptr_t *) -JS_GetFunctionLocalNameArray(JSContext *cx, JSFunction *fun, void **markp) +JS_GetFunctionLocalNameArray(JSContext *cx, JSFunction *fun, void **memp) { RootedScript script(cx, fun->nonLazyScript()); BindingVector bindings(cx); if (!FillBindingVector(script, &bindings)) return NULL; - /* Munge data into the API this method implements. Avert your eyes! */ - *markp = cx->tempLifoAlloc().mark(); + LifoAlloc &lifo = cx->tempLifoAlloc(); - uintptr_t *names = cx->tempLifoAlloc().newArray(bindings.length()); - if (!names) { + // Store the LifoAlloc::Mark right before the allocation. + LifoAlloc::Mark mark = lifo.mark(); + void *mem = lifo.alloc(sizeof(LifoAlloc::Mark) + bindings.length() * sizeof(uintptr_t)); + if (!mem) { js_ReportOutOfMemory(cx); return NULL; } + *memp = mem; + *reinterpret_cast(mem) = mark; + // Munge data into the API this method implements. Avert your eyes! + uintptr_t *names = reinterpret_cast((char*)mem + sizeof(LifoAlloc::Mark)); for (size_t i = 0; i < bindings.length(); i++) names[i] = reinterpret_cast(bindings[i].name()); @@ -510,9 +515,9 @@ JS_AtomKey(JSAtom *atom) } extern JS_PUBLIC_API(void) -JS_ReleaseFunctionLocalNameArray(JSContext *cx, void *mark) +JS_ReleaseFunctionLocalNameArray(JSContext *cx, void *mem) { - cx->tempLifoAlloc().release(mark); + cx->tempLifoAlloc().release(*reinterpret_cast(mem)); } JS_PUBLIC_API(JSScript *) diff --git a/js/src/vm/MatchPairs.h b/js/src/vm/MatchPairs.h index 1018d7d67b3..fa80519682d 100644 --- a/js/src/vm/MatchPairs.h +++ b/js/src/vm/MatchPairs.h @@ -98,20 +98,14 @@ class MatchPairs /* MatchPairs allocated into temporary storage, removed when out of scope. */ class ScopedMatchPairs : public MatchPairs { - LifoAlloc *lifoAlloc_; - void *mark_; /* Saved original position in bump allocator. */ + LifoAllocScope lifoScope_; public: /* Constructs an implicit LifoAllocScope. */ ScopedMatchPairs(LifoAlloc *lifoAlloc) - : lifoAlloc_(lifoAlloc), - mark_(lifoAlloc->mark()) + : lifoScope_(lifoAlloc) { } - ~ScopedMatchPairs() { - lifoAlloc_->release(mark_); - } - const MatchPair &operator[](size_t i) const { return pair(i); } protected: diff --git a/js/src/vm/RegExpObject.cpp b/js/src/vm/RegExpObject.cpp index 232c4e8328e..cc672da76f0 100644 --- a/js/src/vm/RegExpObject.cpp +++ b/js/src/vm/RegExpObject.cpp @@ -169,7 +169,7 @@ ScopedMatchPairs::allocOrExpandArray(size_t pairCount) } JS_ASSERT(!pairs_); - pairs_ = (MatchPair *)lifoAlloc_->alloc(sizeof(MatchPair) * pairCount); + pairs_ = (MatchPair *)lifoScope_.alloc().alloc(sizeof(MatchPair) * pairCount); if (!pairs_) return false; From 8ba747eda2916c219fb7dabfc4489f35e075003b Mon Sep 17 00:00:00 2001 From: Seth Fowler Date: Thu, 25 Apr 2013 15:58:20 -0700 Subject: [PATCH 036/155] Bug 859377 (Part 1) - Add imgIContainer::GetFrameIndex. r=joe sr=bz --HG-- extra : rebase_source : e81992f8bead31b273f4afb4fb589849ec1c5218 --- image/public/imgIContainer.idl | 16 +++++++++++++++- image/src/FrozenImage.cpp | 7 +++++++ image/src/FrozenImage.h | 1 + image/src/ImageWrapper.cpp | 6 ++++++ image/src/RasterImage.cpp | 9 +++++++++ image/src/VectorImage.cpp | 9 +++++++++ 6 files changed, 47 insertions(+), 1 deletion(-) diff --git a/image/public/imgIContainer.idl b/image/public/imgIContainer.idl index 30921cf737b..6cb7fc7145f 100644 --- a/image/public/imgIContainer.idl +++ b/image/public/imgIContainer.idl @@ -57,7 +57,7 @@ native nsSize(nsSize); * * Internally, imgIContainer also manages animation of images. */ -[scriptable, builtinclass, uuid(55531bcd-7d4a-4da0-ab87-7c64c5ae5e12)] +[scriptable, builtinclass, uuid(e385f907-9a59-419b-8e15-e2a96d8ce044)] interface imgIContainer : nsISupports { /** @@ -279,4 +279,18 @@ interface imgIContainer : nsISupports /* Methods to control animation */ void resetAnimation(); + + /* + * Returns an index for the requested animation frame (either FRAME_FIRST or + * FRAME_CURRENT). + * + * The units of the index aren't specified, and may vary between different + * types of images. What you can rely on is that on all occasions when + * getFrameIndex(FRAME_CURRENT) returns a certain value, + * draw(..FRAME_CURRENT..) will draw the same frame. The same holds for + * FRAME_FIRST as well. + * + * @param aWhichFrame Frame specifier of the FRAME_* variety. + */ + [notxpcom] float getFrameIndex(in uint32_t aWhichFrame); }; diff --git a/image/src/FrozenImage.cpp b/image/src/FrozenImage.cpp index 333b7b88e00..7ef22fe95ba 100644 --- a/image/src/FrozenImage.cpp +++ b/image/src/FrozenImage.cpp @@ -111,5 +111,12 @@ FrozenImage::ResetAnimation() return NS_OK; } +NS_IMETHODIMP_(float) +FrozenImage::GetFrameIndex(uint32_t aWhichFrame) +{ + MOZ_ASSERT(aWhichFrame <= FRAME_MAX_VALUE, "Invalid argument"); + return 0; +} + } // namespace image } // namespace mozilla diff --git a/image/src/FrozenImage.h b/image/src/FrozenImage.h index 65428ce7a3c..7013a8099c9 100644 --- a/image/src/FrozenImage.h +++ b/image/src/FrozenImage.h @@ -53,6 +53,7 @@ public: NS_IMETHOD GetAnimationMode(uint16_t* aAnimationMode) MOZ_OVERRIDE; NS_IMETHOD SetAnimationMode(uint16_t aAnimationMode) MOZ_OVERRIDE; NS_IMETHOD ResetAnimation() MOZ_OVERRIDE; + NS_IMETHOD_(float) GetFrameIndex(uint32_t aWhichFrame) MOZ_OVERRIDE; protected: FrozenImage(Image* aImage) : ImageWrapper(aImage) { } diff --git a/image/src/ImageWrapper.cpp b/image/src/ImageWrapper.cpp index d67e684d9d4..710c70b9cb2 100644 --- a/image/src/ImageWrapper.cpp +++ b/image/src/ImageWrapper.cpp @@ -273,5 +273,11 @@ ImageWrapper::ResetAnimation() return mInnerImage->ResetAnimation(); } +NS_IMETHODIMP_(float) +ImageWrapper::GetFrameIndex(uint32_t aWhichFrame) +{ + return mInnerImage->GetFrameIndex(aWhichFrame); +} + } // namespace image } // namespace mozilla diff --git a/image/src/RasterImage.cpp b/image/src/RasterImage.cpp index 141743de29c..ecdad8c31d2 100644 --- a/image/src/RasterImage.cpp +++ b/image/src/RasterImage.cpp @@ -1594,6 +1594,15 @@ RasterImage::ResetAnimation() return NS_OK; } +NS_IMETHODIMP_(float) +RasterImage::GetFrameIndex(uint32_t aWhichFrame) +{ + MOZ_ASSERT(aWhichFrame <= FRAME_MAX_VALUE, "Invalid argument"); + return (aWhichFrame == FRAME_FIRST || !mAnim) + ? 0.0f + : mAnim->currentAnimationFrameIndex; +} + void RasterImage::SetLoopCount(int32_t aLoopCount) { diff --git a/image/src/VectorImage.cpp b/image/src/VectorImage.cpp index ac1cba6288d..6b99ff2d1ec 100644 --- a/image/src/VectorImage.cpp +++ b/image/src/VectorImage.cpp @@ -755,6 +755,15 @@ VectorImage::ResetAnimation() return NS_OK; } +NS_IMETHODIMP_(float) +VectorImage::GetFrameIndex(uint32_t aWhichFrame) +{ + MOZ_ASSERT(aWhichFrame <= FRAME_MAX_VALUE, "Invalid argument"); + return aWhichFrame == FRAME_FIRST + ? 0.0f + : mSVGDocumentWrapper->GetCurrentTime(); +} + //------------------------------------------------------------------------------ // nsIRequestObserver methods From 0a7a4dd52beb8503e87aa784df7fc826c755596a Mon Sep 17 00:00:00 2001 From: Seth Fowler Date: Thu, 25 Apr 2013 15:58:27 -0700 Subject: [PATCH 037/155] Bug 859377 (Part 2) - Make SVGImageContext more flexible. r=dholbert --HG-- extra : rebase_source : 79a4380691426c128f334ba066167a5c5b8ee801 --- layout/svg/SVGImageContext.h | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/layout/svg/SVGImageContext.h b/layout/svg/SVGImageContext.h index 872dd3b94b0..a0f4d5f32d7 100644 --- a/layout/svg/SVGImageContext.h +++ b/layout/svg/SVGImageContext.h @@ -13,7 +13,7 @@ namespace mozilla { // SVG image-specific rendering context. For imgIContainer::Draw. // Used to pass information about overridden attributes from an SVG // element to the image's internal SVG document when it's drawn. -class MOZ_STACK_CLASS SVGImageContext +class SVGImageContext { public: SVGImageContext(SVGPreserveAspectRatio aPreserveAspectRatio) @@ -24,6 +24,14 @@ public: return mPreserveAspectRatio; } + bool operator==(const SVGImageContext& aOther) const { + return mPreserveAspectRatio == aOther.mPreserveAspectRatio; + } + + bool operator!=(const SVGImageContext& aOther) const { + return !(*this == aOther); + } + private: const SVGPreserveAspectRatio mPreserveAspectRatio; }; From 05a976db1b727c66400618e77c7da84bcbb391a2 Mon Sep 17 00:00:00 2001 From: Seth Fowler Date: Thu, 25 Apr 2013 15:58:32 -0700 Subject: [PATCH 038/155] Bug 859377 (Part 3) - Make ClippedImage cache temporary surfaces. r=joe --HG-- extra : rebase_source : 060615904e1b416f84b4d6ecf6329841896f13da --- image/src/ClippedImage.cpp | 109 +++++++++++++++++++++++++++++++------ image/src/ClippedImage.h | 7 ++- 2 files changed, 98 insertions(+), 18 deletions(-) diff --git a/image/src/ClippedImage.cpp b/image/src/ClippedImage.cpp index 267ec46297d..3f066d00a19 100644 --- a/image/src/ClippedImage.cpp +++ b/image/src/ClippedImage.cpp @@ -6,6 +6,7 @@ #include "gfxDrawable.h" #include "gfxPlatform.h" #include "gfxUtils.h" +#include "mozilla/dom/SVGSVGElement.h" #include "ClippedImage.h" @@ -15,6 +16,48 @@ using mozilla::layers::ImageContainer; namespace mozilla { namespace image { +class ClippedImageCachedSurface +{ +public: + ClippedImageCachedSurface(gfxASurface* aSurface, + const nsIntSize& aViewportSize, + const SVGImageContext* aSVGContext, + float aFrame, + uint32_t aFlags) + : mSurface(aSurface) + , mViewportSize(aViewportSize) + , mFrame(aFrame) + , mFlags(aFlags) + { + MOZ_ASSERT(mSurface, "Must have a valid surface"); + if (aSVGContext) { + mSVGContext.construct(*aSVGContext); + } + } + + bool Matches(const nsIntSize& aViewportSize, + const SVGImageContext* aSVGContext, + float aFrame, + uint32_t aFlags) + { + bool matchesSVGContext = (!aSVGContext && mSVGContext.empty()) || + *aSVGContext == mSVGContext.ref(); + return mViewportSize == aViewportSize && + matchesSVGContext && + mFrame == aFrame && + mFlags == aFlags; + } + + gfxASurface* Surface() { return mSurface; } + +private: + nsRefPtr mSurface; + const nsIntSize mViewportSize; + Maybe mSVGContext; + const float mFrame; + const uint32_t mFlags; +}; + class DrawSingleTileCallback : public gfxDrawingCallback { public: @@ -64,6 +107,9 @@ ClippedImage::ClippedImage(Image* aImage, MOZ_ASSERT(aImage != nullptr, "ClippedImage requires an existing Image"); } +ClippedImage::~ClippedImage() +{ } + bool ClippedImage::ShouldClip() { @@ -175,25 +221,41 @@ ClippedImage::GetFrameInternal(const nsIntSize& aViewportSize, return InnerImage()->GetFrame(aWhichFrame, aFlags, _retval); } - // Create a surface to draw into. - gfxImageSurface::gfxImageFormat format = gfxASurface::ImageFormatARGB32; - nsRefPtr surface = gfxPlatform::GetPlatform() - ->CreateOffscreenSurface(gfxIntSize(mClip.width, mClip.height), - gfxImageSurface::ContentFromFormat(format)); - // Create our callback. - nsRefPtr drawTileCallback = - new DrawSingleTileCallback(this, mClip, aViewportSize, aSVGContext, aWhichFrame, aFlags); - nsRefPtr drawable = - new gfxCallbackDrawable(drawTileCallback, mClip.Size()); + float frameToDraw = InnerImage()->GetFrameIndex(aWhichFrame); + if (!mCachedSurface || !mCachedSurface->Matches(aViewportSize, + aSVGContext, + frameToDraw, + aFlags)) { + // Create a surface to draw into. + gfxImageSurface::gfxImageFormat format = gfxASurface::ImageFormatARGB32; + nsRefPtr surface = gfxPlatform::GetPlatform() + ->CreateOffscreenSurface(gfxIntSize(mClip.width, mClip.height), + gfxImageSurface::ContentFromFormat(format)); - // Actually draw. The callback will end up invoking DrawSingleTile. - nsRefPtr ctx = new gfxContext(surface); - gfxRect imageRect(0, 0, mClip.width, mClip.height); - gfxUtils::DrawPixelSnapped(ctx, drawable, gfxMatrix(), - imageRect, imageRect, imageRect, imageRect, - gfxASurface::ImageFormatARGB32, gfxPattern::FILTER_FAST); + // Create our callback. + nsRefPtr drawTileCallback = + new DrawSingleTileCallback(this, mClip, aViewportSize, aSVGContext, aWhichFrame, aFlags); + nsRefPtr drawable = + new gfxCallbackDrawable(drawTileCallback, mClip.Size()); - *_retval = surface.forget().get(); + // Actually draw. The callback will end up invoking DrawSingleTile. + nsRefPtr ctx = new gfxContext(surface); + gfxRect imageRect(0, 0, mClip.width, mClip.height); + gfxUtils::DrawPixelSnapped(ctx, drawable, gfxMatrix(), + imageRect, imageRect, imageRect, imageRect, + format, gfxPattern::FILTER_FAST); + + // Cache the resulting surface. + mCachedSurface = new ClippedImageCachedSurface(surface, + aViewportSize, + aSVGContext, + frameToDraw, + aFlags); + } + + MOZ_ASSERT(mCachedSurface, "Should have a cached surface now"); + *_retval = mCachedSurface->Surface(); + NS_ADDREF(*_retval); return NS_OK; } @@ -206,6 +268,10 @@ ClippedImage::GetImageContainer(LayerManager* aManager, ImageContainer** _retval // actually benefit from GetImageContainer, it would be a good idea to fix // that method for performance reasons. + if (!ShouldClip()) { + return InnerImage()->GetImageContainer(aManager, _retval); + } + *_retval = nullptr; return NS_OK; } @@ -330,5 +396,14 @@ ClippedImage::DrawSingleTile(gfxContext* aContext, viewportSize, aSVGContext, aWhichFrame, aFlags); } +NS_IMETHODIMP +ClippedImage::RequestDiscard() +{ + // We're very aggressive about discarding. + mCachedSurface = nullptr; + + return InnerImage()->RequestDiscard(); +} + } // namespace image } // namespace mozilla diff --git a/image/src/ClippedImage.h b/image/src/ClippedImage.h index fd286507018..74fb12e5fc3 100644 --- a/image/src/ClippedImage.h +++ b/image/src/ClippedImage.h @@ -11,6 +11,7 @@ namespace mozilla { namespace image { +class ClippedImageCachedSurface; class DrawSingleTileCallback; /** @@ -25,7 +26,7 @@ class ClippedImage : public ImageWrapper public: NS_DECL_ISUPPORTS - virtual ~ClippedImage() { } + virtual ~ClippedImage(); virtual nsIntRect FrameRect(uint32_t aWhichFrame) MOZ_OVERRIDE; @@ -47,6 +48,7 @@ public: const SVGImageContext* aSVGContext, uint32_t aWhichFrame, uint32_t aFlags) MOZ_OVERRIDE; + NS_IMETHOD RequestDiscard() MOZ_OVERRIDE; protected: ClippedImage(Image* aImage, nsIntRect aClip); @@ -74,6 +76,9 @@ private: uint32_t aWhichFrame, uint32_t aFlags); + // If we are forced to draw a temporary surface, we cache it here. + nsAutoPtr mCachedSurface; + nsIntRect mClip; // The region to clip to. Maybe mShouldClip; // Memoized ShouldClip() if present. From 7a5392b28d703e9fe3394b117ff5b267e564109d Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:05 -0400 Subject: [PATCH 039/155] Bug 861493. When passing arguments to an Xray for a WebIDL constructor, make sure to do the argument unwrapping before entering the content compartment. r=bholley,waldo There are several changes here: 1) Adds some MutableThis methods to Optional, Nullable, and dictionaries to effectively allow doing a const_cast without knowing the actual type being templated over. I needed this because I do not in fact know that type in the relevant code. I'm open to suggestions for a better name for this method. 2) Adds some operator& to RootedJSValue to make it look more like a JS::Value, and in particular so I can JS_WrapValue the thing in it. 3) Adds a Slot() method to NonNullLazyRootedObject, just like NonNull has. 4) Adds an operator& to LazyRootedObject to make it look more like JSObject* so I can JS_WrapObject the thing in it. 5) Implements the actual rewrapping of the arguments into the content compartment. 6) Fixes a small preexisting bug in which we didn't look at named constructors in getTypesFromDescriptor (this was causing my tests to not compile). 7) Changes Xrays to not enter the content compartment when calling a WebIDL constructor. 8) Adds some friend API to report things as not being functions. --- dom/bindings/BindingDeclarations.h | 15 +++ dom/bindings/BindingUtils.h | 11 ++ dom/bindings/Codegen.py | 126 +++++++++++++++++- dom/bindings/Configuration.py | 1 + dom/bindings/Nullable.h | 4 + dom/bindings/test/TestBindingHeader.h | 12 ++ dom/bindings/test/TestCodeGen.webidl | 18 ++- dom/tests/mochitest/chrome/Makefile.in | 1 + .../chrome/test_sandbox_bindings.xul | 8 ++ .../chrome/test_xray_event_constructor.xul | 35 +++++ js/src/jsfriendapi.cpp | 6 + js/src/jsfriendapi.h | 3 + js/xpconnect/wrappers/XrayWrapper.cpp | 81 ++++++----- 13 files changed, 286 insertions(+), 35 deletions(-) create mode 100644 dom/tests/mochitest/chrome/test_xray_event_constructor.xul diff --git a/dom/bindings/BindingDeclarations.h b/dom/bindings/BindingDeclarations.h index 3f373b0737c..f222de7d384 100644 --- a/dom/bindings/BindingDeclarations.h +++ b/dom/bindings/BindingDeclarations.h @@ -265,6 +265,11 @@ public: return mImpl.ref(); } + Optional& AsMutable() const + { + return *const_cast(this); + } + // If we ever decide to add conversion operators for optional arrays // like the ones Nullable has, we'll need to ensure that Maybe<> has // the boolean before the actual data. @@ -379,6 +384,16 @@ public: return mValue; } + JS::Value* operator&() + { + return &mValue; + } + + const JS::Value* operator&() const + { + return &mValue; + } + private: // Don't allow copy-construction of these objects, because it'll do the wrong // thing with our flag mCx. diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index 23e4e0ce77a..38dc0fe4a24 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -1431,6 +1431,11 @@ public: MOZ_ASSERT(!empty() && ref(), "Can not alias null."); return *ref(); } + + JSObject** Slot() { // To make us look like a NonNull + // Assert if we're empty, on purpose + return ref().address(); + } }; class LazyRootedObject : public Maybe @@ -1439,6 +1444,12 @@ public: operator JSObject*() const { return empty() ? (JSObject*) nullptr : ref(); } + + JSObject** operator&() + { + // Assert if we're empty, on purpose + return ref().address(); + } }; // A struct that has the same layout as an nsDependentString but much diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index eaedb1a1700..41e74555573 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -1080,7 +1080,7 @@ class CGClassConstructor(CGAbstractStaticMethod): name = self._ctor.identifier.name nativeName = MakeNativeName(self.descriptor.binaryNames.get(name, name)) callGenerator = CGMethodCall(nativeName, True, self.descriptor, - self._ctor) + self._ctor, isConstructor=True) return preamble + callGenerator.define(); class CGClassConstructHookHolder(CGGeneric): @@ -4031,6 +4031,93 @@ class MethodNotCreatorError(Exception): def __init__(self, typename): self.typename = typename +# A counter for making sure that when we're wrapping up things in +# nested sequences we don't use the same variable name to iterate over +# different sequences. +sequenceWrapLevel = 0 + +def wrapTypeIntoCurrentCompartment(type, value): + """ + Take the thing named by "value" and if it contains "any", + "object", or spidermonkey-interface types inside return a CGThing + that will wrap them into the current compartment. + """ + if type.isAny(): + assert not type.nullable() + return CGGeneric("if (!JS_WrapValue(cx, &%s)) {\n" + " return false;\n" + "}" % value) + + if type.isObject(): + if not type.nullable(): + value = "%s.Slot()" % value + else: + value = "&%s" % value + return CGGeneric("if (!JS_WrapObject(cx, %s)) {\n" + " return false;\n" + "}" % value) + + if type.isSpiderMonkeyInterface(): + raise TypeError("Can't handle wrapping of spidermonkey interfaces in " + "constructor arguments yet") + + if type.isSequence(): + if type.nullable(): + type = type.inner + value = "%s.AsMutable().Value()" % value + global sequenceWrapLevel + index = "indexName%d" % sequenceWrapLevel + sequenceWrapLevel += 1 + wrapElement = wrapTypeIntoCurrentCompartment(type.inner, + "%s[%s]" % (value, index)) + sequenceWrapLevel -= 1 + if not wrapElement: + return None + return CGWrapper(CGIndenter(wrapElement), + pre=("for (uint32_t %s = 0; %s < %s.Length(); ++%s) {\n" % + (index, index, value, index)), + post="\n}") + + if type.isDictionary(): + assert not type.nullable() + value = "%s.AsMutable()" % value + myDict = type.inner + memberWraps = [] + while myDict: + for member in myDict.members: + memberWrap = wrapArgIntoCurrentCompartment( + member, + "%s.%s" % (value, CGDictionary.makeMemberName(member.identifier.name))) + if memberWrap: + memberWraps.append(memberWrap) + myDict = myDict.parent + return CGList(memberWraps, "\n") if len(memberWraps) != 0 else None + + if type.isUnion(): + raise TypeError("Can't handle wrapping of unions in constructor " + "arguments yet") + + if (type.isString() or type.isPrimitive() or type.isEnum() or + type.isGeckoInterface() or type.isCallback()): + # All of these don't need wrapping + return None + + raise TypeError("Unknown type; we don't know how to wrap it in constructor " + "arguments: %s" % type) + +def wrapArgIntoCurrentCompartment(arg, value): + """ + As wrapTypeIntoCurrentCompartment but handles things being optional + """ + origValue = value + isOptional = arg.optional and not arg.defaultValue + if isOptional: + value = value + ".AsMutable().Value()" + wrap = wrapTypeIntoCurrentCompartment(arg.type, value) + if wrap and isOptional: + wrap = CGIfWrapper(wrap, "%s.WasPassed()" % origValue) + return wrap + class CGPerSignatureCall(CGThing): """ This class handles the guts of generating code for a particular @@ -4056,7 +4143,7 @@ class CGPerSignatureCall(CGThing): def __init__(self, returnType, arguments, nativeMethodName, static, descriptor, idlNode, argConversionStartsAt=0, getter=False, - setter=False): + setter=False, isConstructor=False): assert idlNode.isMethod() == (not getter and not setter) assert idlNode.isAttr() == (getter or setter) @@ -4117,6 +4204,30 @@ if (global.Failed()) { lenientFloatCode=lenientFloatCode) for i in range(argConversionStartsAt, self.argCount)]) + if isConstructor: + # If we're called via an xray, we need to enter the underlying + # object's compartment and then wrap up all of our arguments into + # that compartment as needed. This is all happening after we've + # already done the conversions from JS values to WebIDL (C++) + # values, so we only need to worry about cases where there are 'any' + # or 'object' types, or other things that we represent as actual + # JSAPI types, present. Effectively, we're emulating a + # CrossCompartmentWrapper, but working with the C++ types, not the + # original list of JS::Values. + cgThings.append(CGGeneric("Maybe ac;")) + xraySteps = [ + CGGeneric("obj = js::CheckedUnwrap(obj);\n" + "if (!obj) {\n" + " return false;\n" + "}\n" + "ac.construct(cx, obj);") ] + xraySteps.extend( + wrapArgIntoCurrentCompartment(arg, argname) + for (arg, argname) in self.getArguments()) + cgThings.append( + CGIfWrapper(CGList(xraySteps, "\n"), + "xpc::WrapperFactory::IsXrayWrapper(obj)")) + cgThings.append(CGCallGenerator( self.getErrorReport() if self.isFallible() else None, self.getArguments(), argsPre, returnType, @@ -4221,7 +4332,8 @@ class CGMethodCall(CGThing): A class to generate selection of a method signature from a set of signatures and generation of a call to that signature. """ - def __init__(self, nativeMethodName, static, descriptor, method): + def __init__(self, nativeMethodName, static, descriptor, method, + isConstructor=False): CGThing.__init__(self) methodName = '"%s.%s"' % (descriptor.interface.identifier.name, method.identifier.name) @@ -4238,7 +4350,9 @@ class CGMethodCall(CGThing): def getPerSignatureCall(signature, argConversionStartsAt=0): return CGPerSignatureCall(signature[0], signature[1], nativeMethodName, static, descriptor, - method, argConversionStartsAt) + method, + argConversionStartsAt=argConversionStartsAt, + isConstructor=isConstructor) signatures = method.signatures() @@ -7086,6 +7200,10 @@ class CGDictionary(CGThing): " NS_ENSURE_TRUE(cx, false);\n" " return Init(cx, json.ref());\n" " }\n" if not self.workers else "") + + " ${selfName}& AsMutable() const\n" + " {\n" + " return *const_cast<${selfName}*>(this);\n" + " }\n" "\n" + "\n".join(memberDecls) + "\n" "private:\n" diff --git a/dom/bindings/Configuration.py b/dom/bindings/Configuration.py index 4ecd958dc98..f2bae117c11 100644 --- a/dom/bindings/Configuration.py +++ b/dom/bindings/Configuration.py @@ -475,6 +475,7 @@ def getTypesFromDescriptor(descriptor): members = [m for m in descriptor.interface.members] if descriptor.interface.ctor(): members.append(descriptor.interface.ctor()) + members.extend(descriptor.interface.namedConstructors) signatures = [s for m in members if m.isMethod() for s in m.signatures()] types = [] for s in signatures: diff --git a/dom/bindings/Nullable.h b/dom/bindings/Nullable.h index 5fb57392941..e265cbf1d78 100644 --- a/dom/bindings/Nullable.h +++ b/dom/bindings/Nullable.h @@ -64,6 +64,10 @@ public: return mIsNull; } + Nullable& AsMutable() const { + return *const_cast(this); + } + // Make it possible to use a const Nullable of an array type with other // array types. template diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h index 2bd2c5658ae..f936e49e2fe 100644 --- a/dom/bindings/test/TestBindingHeader.h +++ b/dom/bindings/test/TestBindingHeader.h @@ -132,6 +132,18 @@ public: static already_AddRefed Test(const GlobalObject&, const nsAString&, ErrorResult&); + static + already_AddRefed Test2(const GlobalObject&, + JSContext*, + const DictForConstructor&, + JS::Value, + JSObject&, + JSObject*, + const Sequence&, + const Optional&, + const Optional >&, + const Optional&, + ErrorResult&); // Integer types int8_t ReadonlyByte(); diff --git a/dom/bindings/test/TestCodeGen.webidl b/dom/bindings/test/TestCodeGen.webidl index da4191b9480..e894d70188b 100644 --- a/dom/bindings/test/TestCodeGen.webidl +++ b/dom/bindings/test/TestCodeGen.webidl @@ -103,7 +103,10 @@ interface OnlyForUseInConstructor { Constructor(long arg1, IndirectlyImplementedInterface iface), // Constructor(long arg1, long arg2, (TestInterface or OnlyForUseInConstructor) arg3), NamedConstructor=Test, - NamedConstructor=Test(DOMString str) + NamedConstructor=Test(DOMString str), + NamedConstructor=Test2(DictForConstructor dict, any any1, object obj1, + object? obj2, sequence seq, optional any any2, + optional object obj3, optional object? obj4) ] interface TestInterface { // Integer types @@ -631,6 +634,7 @@ dictionary ParentDict : GrandparentDict { long c = 5; TestInterface someInterface; TestExternalInterface someExternalInterface; + any parentAny; }; dictionary DictContainingDict { @@ -642,6 +646,18 @@ dictionary DictContainingSequence { sequence ourSequence2; }; +dictionary DictForConstructor { + Dict dict; + DictContainingDict dict2; + sequence seq1; + sequence>? seq2; + sequence?> seq3; + // No support for sequences of "any" or "object" as return values yet. + object obj1; + object? obj2; + any any1 = null; +}; + interface TestIndexedGetterInterface { getter long item(unsigned long idx); readonly attribute unsigned long length; diff --git a/dom/tests/mochitest/chrome/Makefile.in b/dom/tests/mochitest/chrome/Makefile.in index 4bdb0f44b43..7e4bf785ba1 100644 --- a/dom/tests/mochitest/chrome/Makefile.in +++ b/dom/tests/mochitest/chrome/Makefile.in @@ -62,6 +62,7 @@ MOCHITEST_CHROME_FILES = \ test_queryCaretRect.html \ queryCaretRectWin.html \ queryCaretRectUnix.html \ + test_xray_event_constructor.xul \ $(NULL) ifeq (WINNT,$(OS_ARCH)) diff --git a/dom/tests/mochitest/chrome/test_sandbox_bindings.xul b/dom/tests/mochitest/chrome/test_sandbox_bindings.xul index 09ef60d2a33..fdbbb0edf60 100644 --- a/dom/tests/mochitest/chrome/test_sandbox_bindings.xul +++ b/dom/tests/mochitest/chrome/test_sandbox_bindings.xul @@ -233,6 +233,14 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=741267 ok(false, "Should be able to return NodeFilter from a sandbox " + e); } + try { + var eventCtor = Components.utils.evalInSandbox("Event", sandbox); + var e = new eventCtor("test", { bubbles: true }); + is(e.bubbles, true, "Dictionary argument should work"); + } catch (e) { + ok(false, "Should be able to construct my event " + e); + } + SimpleTest.finish(); } diff --git a/dom/tests/mochitest/chrome/test_xray_event_constructor.xul b/dom/tests/mochitest/chrome/test_xray_event_constructor.xul new file mode 100644 index 00000000000..f60dc3be95a --- /dev/null +++ b/dom/tests/mochitest/chrome/test_xray_event_constructor.xul @@ -0,0 +1,35 @@ + + + + + + + diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index 990ffe8cb3d..f31fe5fe8c8 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -1057,3 +1057,9 @@ js_DefineOwnProperty(JSContext *cx, JSObject *objArg, jsid idArg, return js_DefineOwnProperty(cx, HandleObject(obj), id, descriptor, bp); } + +JS_FRIEND_API(JSBool) +js_ReportIsNotFunction(JSContext *cx, const JS::Value& v) +{ + return ReportIsNotFunction(cx, v); +} diff --git a/js/src/jsfriendapi.h b/js/src/jsfriendapi.h index 2f9b5381ed0..71c5f9fcc56 100644 --- a/js/src/jsfriendapi.h +++ b/js/src/jsfriendapi.h @@ -1454,4 +1454,7 @@ extern JS_FRIEND_API(JSBool) js_DefineOwnProperty(JSContext *cx, JSObject *objArg, jsid idArg, const js::PropertyDescriptor& descriptor, JSBool *bp); +extern JS_FRIEND_API(JSBool) +js_ReportIsNotFunction(JSContext *cx, const JS::Value& v); + #endif /* jsfriendapi_h___ */ diff --git a/js/xpconnect/wrappers/XrayWrapper.cpp b/js/xpconnect/wrappers/XrayWrapper.cpp index 0203b57a474..5f809b2d28c 100644 --- a/js/xpconnect/wrappers/XrayWrapper.cpp +++ b/js/xpconnect/wrappers/XrayWrapper.cpp @@ -146,11 +146,13 @@ public: HandleObject wrapper, HandleObject holder, HandleId id, JSPropertyDescriptor *desc, unsigned flags); - static bool call(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args) + static bool call(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance) { MOZ_NOT_REACHED("Call trap currently implemented only for XPCWNs"); } - static bool construct(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args) + static bool construct(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance) { MOZ_NOT_REACHED("Call trap currently implemented only for XPCWNs"); } @@ -198,8 +200,10 @@ public: Handle existingDesc, bool *defined); static bool enumerateNames(JSContext *cx, HandleObject wrapper, unsigned flags, AutoIdVector &props); - static bool call(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args); - static bool construct(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args); + static bool call(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance); + static bool construct(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance); static bool isResolving(JSContext *cx, JSObject *holder, jsid id); @@ -242,8 +246,10 @@ public: Handle existingDesc, bool *defined); static bool enumerateNames(JSContext *cx, HandleObject wrapper, unsigned flags, AutoIdVector &props); - static bool call(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args); - static bool construct(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args); + static bool call(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance); + static bool construct(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance); static bool isResolving(JSContext *cx, JSObject *holder, jsid id) { @@ -1128,7 +1134,8 @@ XPCWrappedNativeXrayTraits::createHolder(JSContext *cx, JSObject *wrapper) bool XPCWrappedNativeXrayTraits::call(JSContext *cx, HandleObject wrapper, - const JS::CallArgs &args) + const JS::CallArgs &args, + js::Wrapper& baseInstance) { // Run the resolve hook of the wrapped native. XPCWrappedNative *wn = getWN(wrapper); @@ -1153,7 +1160,8 @@ XPCWrappedNativeXrayTraits::call(JSContext *cx, HandleObject wrapper, bool XPCWrappedNativeXrayTraits::construct(JSContext *cx, HandleObject wrapper, - const JS::CallArgs &args) + const JS::CallArgs &args, + js::Wrapper& baseInstance) { // Run the resolve hook of the wrapped native. XPCWrappedNative *wn = getWN(wrapper); @@ -1237,42 +1245,55 @@ DOMXrayTraits::enumerateNames(JSContext *cx, HandleObject wrapper, unsigned flag } bool -DOMXrayTraits::call(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args) +DOMXrayTraits::call(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance) { RootedObject obj(cx, getTargetObject(wrapper)); - { - JSAutoCompartment ac(cx, obj); - RootedValue thisv(cx, args.thisv()); - if (!JS_WrapValue(cx, thisv.address())) + js::Class* clasp = js::GetObjectClass(obj); + // What we have is either a WebIDL interface object, a WebIDL prototype + // object, or a WebIDL instance object. WebIDL prototype objects never have + // a clasp->call. WebIDL interface objects we want to invoke on the xray + // compartment. WebIDL instance objects either don't have a clasp->call or + // are using "legacycaller", which basically means plug-ins. We want to + // call those on the content compartment. + if (clasp->flags & JSCLASS_IS_DOMIFACEANDPROTOJSCLASS) { + if (!clasp->call) { + js_ReportIsNotFunction(cx, JS::ObjectValue(*wrapper)); return false; - args.setThis(thisv); - for (size_t i = 0; i < args.length(); ++i) { - if (!JS_WrapValue(cx, &args[i])) - return false; } - if (!Call(cx, thisv, obj, args.length(), args.array(), args.rval().address())) + // call it on the Xray compartment + if (!clasp->call(cx, args.length(), args.base())) + return false; + } else { + // This is only reached for WebIDL instance objects, and in practice + // only for plugins. Just call them on the content compartment. + if (!baseInstance.call(cx, wrapper, args)) return false; } return JS_WrapValue(cx, args.rval().address()); } bool -DOMXrayTraits::construct(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args) +DOMXrayTraits::construct(JSContext *cx, HandleObject wrapper, + const JS::CallArgs &args, js::Wrapper& baseInstance) { RootedObject obj(cx, getTargetObject(wrapper)); MOZ_ASSERT(mozilla::dom::HasConstructor(obj)); - RootedObject newObj(cx); - { - JSAutoCompartment ac(cx, obj); - for (size_t i = 0; i < args.length(); ++i) { - if (!JS_WrapValue(cx, &args[i])) - return false; + js::Class* clasp = js::GetObjectClass(obj); + // See comments in DOMXrayTraits::call() explaining what's going on here. + if (clasp->flags & JSCLASS_IS_DOMIFACEANDPROTOJSCLASS) { + if (!clasp->construct) { + js_ReportIsNotFunction(cx, JS::ObjectValue(*wrapper)); + return false; } - newObj = JS_New(cx, obj, args.length(), args.array()); + if (!clasp->construct(cx, args.length(), args.base())) + return false; + } else { + if (!baseInstance.construct(cx, wrapper, args)) + return false; } - if (!newObj || !JS_WrapObject(cx, newObj.address())) + if (!args.rval().isObject() || !JS_WrapValue(cx, args.rval().address())) return false; - args.rval().setObject(*newObj); return true; } @@ -1854,7 +1875,7 @@ bool XrayWrapper::call(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args) { assertEnteredPolicy(cx, wrapper, JSID_VOID); - return Traits::call(cx, wrapper, args); + return Traits::call(cx, wrapper, args, Base::singleton); } template @@ -1862,7 +1883,7 @@ bool XrayWrapper::construct(JSContext *cx, HandleObject wrapper, const JS::CallArgs &args) { assertEnteredPolicy(cx, wrapper, JSID_VOID); - return Traits::construct(cx, wrapper, args); + return Traits::construct(cx, wrapper, args, Base::singleton); } /* From 9ba2beac5ca8d63680e75c900480ba07525cfbd7 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:06 -0400 Subject: [PATCH 040/155] Bug 766583 part 1. Stop declaring dictionaries as const on the stack in bindings code. r=smaug --- dom/bindings/BindingUtils.h | 9 +++++++++ dom/bindings/Codegen.py | 21 +++++++++++---------- dom/bindings/test/TestBindingHeader.h | 8 ++++++++ 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index 38dc0fe4a24..36966f27483 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -1757,6 +1757,15 @@ struct JSBindingFinalized } }; +// Helpers for creating a const version of a type. +template +const T& Constify(T& arg) +{ + return arg; +} + +// Reparent the wrapper of aObj to whatever its native now thinks its +// parent should be. nsresult ReparentWrapper(JSContext* aCx, JS::HandleObject aObj); diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 41e74555573..cdba95842e6 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -3208,16 +3208,9 @@ for (uint32_t i = 0; i < length; ++i) { typeName = CGDictionary.makeDictionaryName(type.inner, descriptorProvider.workers) actualTypeName = typeName - selfRef = "${declName}" declType = CGGeneric(actualTypeName) - # If we're a member of something else, the const - # will come from the Optional or our container. - if not isMember: - declType = CGWrapper(declType, pre="const ") - selfRef = "const_cast<%s&>(%s)" % (typeName, selfRef) - # We do manual default value handling here, because we # actually do want a jsval, and we only handle null anyway # NOTE: if isNullOrUndefined or isDefinitelyObject are true, @@ -3240,9 +3233,9 @@ for (uint32_t i = 0; i < length; ++i) { else: template = "" - template += ("if (!%s.Init(cx, %s)) {\n" + template += ("if (!${declName}.Init(cx, %s)) {\n" "%s\n" - "}" % (selfRef, val, exceptionCodeIndented.define())) + "}" % (val, exceptionCodeIndented.define())) return (template, declType, None, False) @@ -3993,7 +3986,15 @@ class CGCallGenerator(CGThing): # This is a workaround for a bug in Apple's clang. if a.type.isObject() and not a.type.nullable() and not a.optional: name = "(JSObject&)" + name - args.append(CGGeneric(name)) + arg = CGGeneric(name) + # Now constify the things that need it + def needsConst(a): + if a.type.isDictionary(): + return True + return False + if needsConst(a): + arg = CGWrapper(arg, pre="Constify(", post=")") + args.append(arg) # Return values that go in outparams go here if resultOutParam: diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h index f936e49e2fe..42c6ceb1f3f 100644 --- a/dom/bindings/test/TestBindingHeader.h +++ b/dom/bindings/test/TestBindingHeader.h @@ -698,6 +698,14 @@ private: void PassOptionalNullableString(Optional&) MOZ_DELETE; void PassOptionalNullableStringWithDefaultValue(nsAString&) MOZ_DELETE; void PassVariadicString(Sequence&) MOZ_DELETE; + + // Make sure dictionary arguments are always const + void PassDictionary(JSContext*, Dict&) MOZ_DELETE; + void PassOtherDictionary(GrandparentDict&) MOZ_DELETE; + void PassSequenceOfDictionaries(JSContext*, Sequence&) MOZ_DELETE; + void PassDictionaryOrLong(JSContext*, Dict&) MOZ_DELETE; + void PassDictContainingDict(JSContext*, DictContainingDict&) MOZ_DELETE; + void PassDictContainingSequence(DictContainingSequence&) MOZ_DELETE; }; class TestIndexedGetterInterface : public nsISupports, From b10373cda6f7f086e08610d63a6d2441d71c9234 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:06 -0400 Subject: [PATCH 041/155] Bug 766583 part 2. Stop declaring sequences as const on the stack in bindings code. r=smaug --- dom/bindings/Codegen.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index cdba95842e6..bc34c29862c 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -2518,14 +2518,9 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None, sequenceType = typeName.define() if nullable: typeName = CGTemplatedType("Nullable", typeName) - arrayRef = "const_cast& >(${declName}).SetValue()" + arrayRef = "${declName}.SetValue()" else: arrayRef = "${declName}" - # If we're optional or a member, the const will come from the Optional - # or whatever we're a member of. - mutableTypeName = typeName - if not (isOptional or isMember or isCallbackReturnValue): - typeName = CGWrapper(typeName, pre="const ") # NOTE: Keep this in sync with variadic conversions as needed templateBody = ("""JSObject* seq = &${val}.toObject();\n @@ -2537,7 +2532,7 @@ uint32_t length; if (!JS_GetArrayLength(cx, seq, &length)) { %s } -%s &arr = const_cast< %s& >(%s); +%s &arr = %s; if (!arr.SetCapacity(length)) { JS_ReportOutOfMemory(cx); %s @@ -2551,7 +2546,6 @@ for (uint32_t i = 0; i < length; ++i) { """ % (CGIndenter(CGGeneric(notSequence)).define(), exceptionCodeIndented.define(), sequenceType, - sequenceType, arrayRef, exceptionCodeIndented.define(), CGIndenter(exceptionCodeIndented).define(), @@ -2572,7 +2566,7 @@ for (uint32_t i = 0; i < length; ++i) { templateBody += "\n}" templateBody = wrapObjectTemplate(templateBody, type, - "const_cast< %s & >(${declName}).SetNull()" % mutableTypeName.define()) + "${declName}.SetNull()") return (templateBody, typeName, None, isOptional) if type.isUnion(): @@ -3991,6 +3985,8 @@ class CGCallGenerator(CGThing): def needsConst(a): if a.type.isDictionary(): return True + if a.type.isSequence(): + return True return False if needsConst(a): arg = CGWrapper(arg, pre="Constify(", post=")") From a4e95d314bdd1d09d02b6e6a9078b7ec25afcdde Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:06 -0400 Subject: [PATCH 042/155] Bug 766583 part 3. Stop declaring nullable things as const on the stack in bindings code. r=smaug --- dom/bindings/Codegen.py | 18 +++++++----------- dom/bindings/test/TestBindingHeader.h | 3 +++ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index bc34c29862c..f719eab4b27 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -3026,7 +3026,7 @@ for (uint32_t i = 0; i < length; ++i) { if type.nullable(): declType = CGTemplatedType("Nullable", declType) declType = declType.define() - enumLoc = "const_cast<%s&>(${declName}).SetValue()" % declType + enumLoc = "${declName}.SetValue()" else: enumLoc = "${declName}" declType = declType.define() @@ -3061,7 +3061,7 @@ for (uint32_t i = 0; i < length; ++i) { "enumLoc" : enumLoc, }) - setNull = "const_cast<%s&>(${declName}).SetNull();" % declType + setNull = "${declName}.SetNull();" if type.nullable(): template = CGIfElseWrapper("${val}.isNullOrUndefined()", @@ -3078,9 +3078,6 @@ for (uint32_t i = 0; i < length; ++i) { ("%s = %sValues::%s" % (enumLoc, enumName, getEnumValueName(defaultValue.value)))) - if type.nullable() and not isOptional: - # isOptional will handle the const bits itself - declType = "const " + declType return (template, CGGeneric(declType), None, isOptional) if type.isCallback(): @@ -3254,20 +3251,17 @@ for (uint32_t i = 0; i < length; ++i) { if type.nullable(): declType = CGGeneric("Nullable<" + typeName + ">") - mutableType = declType.define() + "&" - if not isOptional and not isMember: - declType = CGWrapper(declType, pre="const ") - writeLoc = ("const_cast< %s >(${declName}).SetValue()" % mutableType) + writeLoc = "${declName}.SetValue()" readLoc = "${declName}.Value()" nullCondition = "${val}.isNullOrUndefined()" if defaultValue is not None and isinstance(defaultValue, IDLNullValue): nullCondition = "!(${haveValue}) || " + nullCondition template = ( "if (%s) {\n" - " const_cast< %s >(${declName}).SetNull();\n" + " ${declName}.SetNull();\n" "} else if (!ValueToPrimitive<%s, %s>(cx, ${val}, &%s)) {\n" "%s\n" - "}" % (nullCondition, mutableType, typeName, conversionBehavior, + "}" % (nullCondition, typeName, conversionBehavior, writeLoc, exceptionCodeIndented.define())) else: assert(defaultValue is None or @@ -3987,6 +3981,8 @@ class CGCallGenerator(CGThing): return True if a.type.isSequence(): return True + if a.type.nullable(): + return True return False if needsConst(a): arg = CGWrapper(arg, pre="Constify(", post=")") diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h index 42c6ceb1f3f..91f587665cd 100644 --- a/dom/bindings/test/TestBindingHeader.h +++ b/dom/bindings/test/TestBindingHeader.h @@ -706,6 +706,9 @@ private: void PassDictionaryOrLong(JSContext*, Dict&) MOZ_DELETE; void PassDictContainingDict(JSContext*, DictContainingDict&) MOZ_DELETE; void PassDictContainingSequence(DictContainingSequence&) MOZ_DELETE; + + // Make sure various nullable things are always const + void PassNullableEnum(Nullable&) MOZ_DELETE; }; class TestIndexedGetterInterface : public nsISupports, From 3d72fdf114a52ee235ef3a7e1d88d2f694947301 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:06 -0400 Subject: [PATCH 043/155] Bug 766583 part 4. Stop declaring strings as const on the stack in bindings code. r=smaug --- dom/bindings/Codegen.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index f719eab4b27..4bd4f1cb5d3 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -3012,9 +3012,9 @@ for (uint32_t i = 0; i < length; ++i) { return ( "%s\n" - "const_cast<%s&>(${declName}) = &${holderName};" % - (getConversionCode("${holderName}"), declType), - CGGeneric("const " + declType), CGGeneric("FakeDependentString"), + "${declName} = &${holderName};" % + getConversionCode("${holderName}"), + CGGeneric(declType), CGGeneric("FakeDependentString"), # No need to deal with Optional here; we have handled it already False) @@ -3983,6 +3983,8 @@ class CGCallGenerator(CGThing): return True if a.type.nullable(): return True + if a.type.isString(): + return True return False if needsConst(a): arg = CGWrapper(arg, pre="Constify(", post=")") From 080775af23cbb3f64ee0fe3dc90bd7b207392c27 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:06 -0400 Subject: [PATCH 044/155] Bug 766583 part 5. Stop declaring optional arguments as const on the stack in bindings code. r=smaug --- dom/bindings/Codegen.py | 35 +++++++++++++++-------------------- 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 4bd4f1cb5d3..4e01dd4b6dd 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -2913,15 +2913,15 @@ for (uint32_t i = 0; i < length; ++i) { constructInternal = "ref" if type.nullable(): if isOptional: - declType = "const Optional<" + name + "*>" + declType = "Optional<" + name + "*>" else: declType = name + "*" else: if isOptional: - declType = "const Optional<" + name + ">" + declType = "Optional<" + name + ">" # We don't need a holder in this case holderType = None - constructLoc = "(const_cast& >(${declName}))" + constructLoc = "${declName}" constructMethod = "Construct" constructInternal = "Value" else: @@ -2936,9 +2936,8 @@ for (uint32_t i = 0; i < length; ++i) { nullableTarget = "" if type.nullable(): if isOptional: - mutableDecl = "(const_cast& >(${declName}))" - template += "%s.Construct();\n" % mutableDecl - nullableTarget = "%s.Value()" % mutableDecl + template += "${declName}.Construct();\n" + nullableTarget = "${declName}.Value()" else: nullableTarget = "${declName}" template += "%s = ${holderName}.addr();" % nullableTarget @@ -3331,11 +3330,8 @@ def instantiateJSToNativeConversionTemplate(templateTuple, replacements, originalHolderName = replacements["holderName"] if holderType is not None: if dealWithOptional: - replacements["holderName"] = ( - "const_cast< %s & >(%s.Value())" % - (holderType.define(), originalHolderName)) - mutableHolderType = CGTemplatedType("Optional", holderType) - holderType = CGWrapper(mutableHolderType, pre="const ") + replacements["holderName"] = "%s.Value()" % originalHolderName + holderType = CGTemplatedType("Optional", holderType) result.append( CGList([holderType, CGGeneric(" "), CGGeneric(originalHolderName), @@ -3344,11 +3340,8 @@ def instantiateJSToNativeConversionTemplate(templateTuple, replacements, originalDeclName = replacements["declName"] if declType is not None: if dealWithOptional: - replacements["declName"] = ( - "const_cast< %s & >(%s.Value())" % - (declType.define(), originalDeclName)) - mutableDeclType = CGTemplatedType("Optional", declType) - declType = CGWrapper(mutableDeclType, pre="const ") + replacements["declName"] = "%s.Value()" % originalDeclName + declType = CGTemplatedType("Optional", declType) result.append( CGList([declType, CGGeneric(" "), CGGeneric(originalDeclName), @@ -3361,12 +3354,10 @@ def instantiateJSToNativeConversionTemplate(templateTuple, replacements, if argcAndIndex is not None: if dealWithOptional: declConstruct = CGIndenter( - CGGeneric("const_cast< %s &>(%s).Construct();" % - (mutableDeclType.define(), originalDeclName))) + CGGeneric("%s.Construct();" % originalDeclName)) if holderType is not None: holderConstruct = CGIndenter( - CGGeneric("const_cast< %s &>(%s).Construct();" % - (mutableHolderType.define(), originalHolderName))) + CGGeneric("%s.Construct();" % originalHolderName)) else: holderConstruct = None else: @@ -3985,6 +3976,10 @@ class CGCallGenerator(CGThing): return True if a.type.isString(): return True + if a.optional and not a.defaultValue: + # If a.defaultValue, then it's not going to use an Optional, + # so doesn't need to be const just due to being optional. + return True return False if needsConst(a): arg = CGWrapper(arg, pre="Constify(", post=")") From aa284f1a66ba85cd8b8f3e13ab9ccde222200439 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:07 -0400 Subject: [PATCH 045/155] Bug 766583 part 6. Stop declaring unions as const on the stack in bindings code. r=smaug --- dom/bindings/Codegen.py | 16 +++++++--------- dom/bindings/test/TestBindingHeader.h | 8 ++++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 4e01dd4b6dd..6a3aa6a7e7b 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -2717,11 +2717,6 @@ for (uint32_t i = 0; i < length; ++i) { argumentTypeName = typeName + "Argument" if nullable: typeName = "Nullable<" + typeName + " >" - if isOptional: - nonConstDecl = "const_cast& >(${declName})" - else: - nonConstDecl = "const_cast<" + typeName + "& >(${declName})" - typeName = "const " + typeName def handleNull(templateBody, setToNullVar, extraConditionForNull=""): null = CGGeneric("if (%s${val}.isNullOrUndefined()) {\n" @@ -2736,16 +2731,16 @@ for (uint32_t i = 0; i < length; ++i) { declType = CGGeneric(typeName) holderType = CGGeneric(argumentTypeName) if isOptional: - mutableDecl = nonConstDecl + ".Value()" - declType = CGTemplatedType("Optional", declType, isConst=True) + mutableDecl = "${declName}.Value()" + declType = CGTemplatedType("Optional", declType) holderType = CGTemplatedType("Maybe", holderType) - constructDecl = CGGeneric(nonConstDecl + ".Construct();") + constructDecl = CGGeneric("${declName}.Construct();") if nullable: constructHolder = CGGeneric("${holderName}.construct(%s.SetValue());" % mutableDecl) else: constructHolder = CGGeneric("${holderName}.construct(${declName}.Value());") else: - mutableDecl = nonConstDecl + mutableDecl = "${declName}" constructDecl = None if nullable: holderType = CGTemplatedType("Maybe", holderType) @@ -3980,6 +3975,8 @@ class CGCallGenerator(CGThing): # If a.defaultValue, then it's not going to use an Optional, # so doesn't need to be const just due to being optional. return True + if a.type.isUnion(): + return True return False if needsConst(a): arg = CGWrapper(arg, pre="Constify(", post=")") @@ -5603,6 +5600,7 @@ class CGUnionConversionStruct(CGThing): return string.Template(""" class ${structName}Argument { public: + // Argument needs to be a const ref because that's all Maybe<> allows ${structName}Argument(const ${structName}& aUnion) : mUnion(const_cast<${structName}&>(aUnion)) { } diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h index 91f587665cd..bb4e729faeb 100644 --- a/dom/bindings/test/TestBindingHeader.h +++ b/dom/bindings/test/TestBindingHeader.h @@ -709,6 +709,14 @@ private: // Make sure various nullable things are always const void PassNullableEnum(Nullable&) MOZ_DELETE; + + // Make sure unions are always const + void PassUnion(JSContext*, ObjectOrLong& arg) MOZ_DELETE; + void PassUnionWithNullable(JSContext*, ObjectOrNullOrLong& arg) MOZ_DELETE; + void PassNullableUnion(JSContext*, Nullable&) MOZ_DELETE; + void PassOptionalUnion(JSContext*, Optional&) MOZ_DELETE; + void PassOptionalNullableUnion(JSContext*, Optional >&) MOZ_DELETE; + void PassOptionalNullableUnionWithDefaultValue(JSContext*, Nullable&) MOZ_DELETE; }; class TestIndexedGetterInterface : public nsISupports, From 1684007f9e9abd0d5003c9da2d839a7ee1dc45b8 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 19:03:07 -0400 Subject: [PATCH 046/155] Bug 766583 part 7. Stop declaring variadic arguments as const on the stack in bindings code. r=smaug --- dom/bindings/Codegen.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 6a3aa6a7e7b..d39010092c6 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -3468,15 +3468,14 @@ class CGArgumentConverter(CGThing): replacer["elemType"] = elementDeclType.define() # NOTE: Keep this in sync with sequence conversions as needed - variadicConversion = string.Template("""const ${seqType} ${declName}; + variadicConversion = string.Template("""${seqType} ${declName}; if (${argc} > ${index}) { - ${seqType}& arr = const_cast< ${seqType}& >(${declName}); - if (!arr.SetCapacity(${argc} - ${index})) { + if (!${declName}.SetCapacity(${argc} - ${index})) { JS_ReportOutOfMemory(cx); return false; } for (uint32_t variadicArg = ${index}; variadicArg < ${argc}; ++variadicArg) { - ${elemType}& slot = *arr.AppendElement(); + ${elemType}& slot = *${declName}.AppendElement(); """).substitute(replacer) val = string.Template("${argv}[variadicArg]").substitute(replacer) @@ -3974,6 +3973,7 @@ class CGCallGenerator(CGThing): if a.optional and not a.defaultValue: # If a.defaultValue, then it's not going to use an Optional, # so doesn't need to be const just due to being optional. + # This also covers variadic arguments. return True if a.type.isUnion(): return True From 27ca95544bcbaab0f2d40fb45bbe2cdcf3bef454 Mon Sep 17 00:00:00 2001 From: Chris Lord Date: Thu, 25 Apr 2013 18:47:08 +0100 Subject: [PATCH 047/155] Bug 858969 - Refactor dynamic toolbar so page is offset and not overlapped. r=kats,nrc Refactor the dynamic toolbar code so that the ownership of various properties is clearer, and the page is offset by the toolbar instead of being overlapped. This fixes problems with the scroll origin of the page not corresponding to the visible origin on the screen. --- gfx/layers/Compositor.h | 6 + gfx/layers/ipc/CompositorParent.cpp | 13 +- gfx/layers/ipc/CompositorParent.h | 2 +- gfx/layers/opengl/CompositorOGL.cpp | 3 + gfx/layers/opengl/CompositorOGL.h | 6 + mobile/android/base/BrowserApp.java | 309 ++++++------------ mobile/android/base/BrowserToolbar.java | 76 +---- mobile/android/base/BrowserToolbarLayout.java | 18 +- mobile/android/base/GeckoApp.java | 2 + mobile/android/base/GeckoEvent.java | 8 +- mobile/android/base/Makefile.in | 1 + mobile/android/base/Tab.java | 9 + mobile/android/base/TextSelection.java | 22 +- mobile/android/base/TextSelectionHandle.java | 3 +- mobile/android/base/gfx/GeckoLayerClient.java | 257 ++++++++------- .../base/gfx/ImmutableViewportMetrics.java | 170 ++++++---- .../base/gfx/JavaPanZoomController.java | 36 +- mobile/android/base/gfx/Layer.java | 8 +- .../base/gfx/LayerMarginsAnimator.java | 186 +++++++++++ mobile/android/base/gfx/LayerRenderer.java | 52 ++- mobile/android/base/gfx/LayerView.java | 7 + .../android/base/gfx/NinePatchTileLayer.java | 4 +- mobile/android/base/gfx/PanZoomTarget.java | 2 + mobile/android/base/gfx/ScrollbarLayer.java | 1 + mobile/android/base/gfx/ViewTransform.java | 4 + mobile/android/chrome/content/browser.js | 10 +- widget/android/AndroidBridge.cpp | 5 +- widget/android/AndroidBridge.h | 2 +- widget/android/AndroidJavaWrappers.cpp | 25 +- widget/android/AndroidJavaWrappers.h | 6 +- 30 files changed, 692 insertions(+), 561 deletions(-) create mode 100644 mobile/android/base/gfx/LayerMarginsAnimator.java diff --git a/gfx/layers/Compositor.h b/gfx/layers/Compositor.h index 8172b8528ef..109ae6d556b 100644 --- a/gfx/layers/Compositor.h +++ b/gfx/layers/Compositor.h @@ -252,6 +252,12 @@ public: */ virtual void SetDestinationSurfaceSize(const gfx::IntSize& aSize) = 0; + /** + * Declare an offset to use when rendering layers. This will be ignored when + * rendering to a target instead of the screen. + */ + virtual void SetScreenRenderOffset(const gfx::Point& aOffset) = 0; + /** * Tell the compositor to actually draw a quad. What to do draw and how it is * drawn is specified by aEffectChain. aRect is the quad to draw, in user space. diff --git a/gfx/layers/ipc/CompositorParent.cpp b/gfx/layers/ipc/CompositorParent.cpp index c8999265261..203ca539083 100644 --- a/gfx/layers/ipc/CompositorParent.cpp +++ b/gfx/layers/ipc/CompositorParent.cpp @@ -934,10 +934,15 @@ CompositorParent::TransformScrollableLayer(Layer* aLayer, const gfx3DMatrix& aRo displayPortDevPixels.y += scrollOffsetDevPixels.y; gfx::Margin fixedLayerMargins(0, 0, 0, 0); + float offsetX = 0, offsetY = 0; SyncViewportInfo(displayPortDevPixels, 1/rootScaleX, mLayersUpdated, - mScrollOffset, mXScale, mYScale, fixedLayerMargins); + mScrollOffset, mXScale, mYScale, fixedLayerMargins, + offsetX, offsetY); mLayersUpdated = false; + // Apply the render offset + mLayerManager->GetCompositor()->SetScreenRenderOffset(gfx::Point(offsetX, offsetY)); + // Handle transformations for asynchronous panning and zooming. We determine the // zoom used by Gecko from the transformation set on the root layer, and we // determine the scroll offset used by Gecko from the frame metrics of the @@ -1091,11 +1096,13 @@ void CompositorParent::SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, - gfx::Margin& aFixedLayerMargins) + gfx::Margin& aFixedLayerMargins, float& aOffsetX, + float& aOffsetY) { #ifdef MOZ_WIDGET_ANDROID AndroidBridge::Bridge()->SyncViewportInfo(aDisplayPort, aDisplayResolution, aLayersUpdated, - aScrollOffset, aScaleX, aScaleY, aFixedLayerMargins); + aScrollOffset, aScaleX, aScaleY, aFixedLayerMargins, + aOffsetX, aOffsetY); #endif } diff --git a/gfx/layers/ipc/CompositorParent.h b/gfx/layers/ipc/CompositorParent.h index 45ceff1e24a..1bb4f3cbcd8 100644 --- a/gfx/layers/ipc/CompositorParent.h +++ b/gfx/layers/ipc/CompositorParent.h @@ -180,7 +180,7 @@ protected: virtual void SetPageRect(const gfx::Rect& aCssPageRect); virtual void SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, - gfx::Margin& aFixedLayerMargins); + gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); void SetEGLSurfaceSize(int width, int height); private: diff --git a/gfx/layers/opengl/CompositorOGL.cpp b/gfx/layers/opengl/CompositorOGL.cpp index 082001c4944..90435f9627d 100644 --- a/gfx/layers/opengl/CompositorOGL.cpp +++ b/gfx/layers/opengl/CompositorOGL.cpp @@ -621,6 +621,9 @@ CompositorOGL::PrepareViewport(const gfx::IntSize& aSize, viewMatrix.Translate(-gfxPoint(1.0, -1.0)); viewMatrix.Scale(2.0f / float(aSize.width), 2.0f / float(aSize.height)); viewMatrix.Scale(1.0f, -1.0f); + if (!mTarget) { + viewMatrix.Translate(gfxPoint(mRenderOffset.x, mRenderOffset.y)); + } viewMatrix = aWorldTransform * viewMatrix; diff --git a/gfx/layers/opengl/CompositorOGL.h b/gfx/layers/opengl/CompositorOGL.h index 5959d57354f..7bc2ea883e9 100644 --- a/gfx/layers/opengl/CompositorOGL.h +++ b/gfx/layers/opengl/CompositorOGL.h @@ -90,6 +90,10 @@ public: */ virtual void SetDestinationSurfaceSize(const gfx::IntSize& aSize) MOZ_OVERRIDE; + virtual void SetScreenRenderOffset(const gfx::Point& aOffset) MOZ_OVERRIDE { + mRenderOffset = aOffset; + } + virtual void MakeCurrent(MakeCurrentFlags aFlags = 0) MOZ_OVERRIDE { if (mDestroyed) { NS_WARNING("Call on destroyed layer manager"); @@ -141,6 +145,8 @@ private: /** The size of the surface we are rendering to */ nsIntSize mSurfaceSize; + gfx::Point mRenderOffset; + /** Helper-class used by Initialize **/ class ReadDrawFPSPref MOZ_FINAL : public nsRunnable { public: diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index b8ebb4d259b..8edaf9419a7 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -8,6 +8,7 @@ package org.mozilla.gecko; import org.mozilla.gecko.db.BrowserContract.Combined; import org.mozilla.gecko.db.BrowserDB; import org.mozilla.gecko.gfx.BitmapUtils; +import org.mozilla.gecko.gfx.GeckoLayerClient; import org.mozilla.gecko.gfx.ImmutableViewportMetrics; import org.mozilla.gecko.gfx.LayerView; import org.mozilla.gecko.gfx.PanZoomController; @@ -66,6 +67,7 @@ abstract public class BrowserApp extends GeckoApp implements TabsPanel.TabsLayoutChangeListener, PropertyAnimator.PropertyAnimationListener, View.OnKeyListener, + GeckoLayerClient.OnMetricsChangedListener, AboutHome.UriLoadListener, AboutHome.LoadCompleteListener { private static final String LOGTAG = "GeckoBrowserApp"; @@ -113,35 +115,6 @@ abstract public class BrowserApp extends GeckoApp // We'll ask for feedback after the user launches the app this many times. private static final int FEEDBACK_LAUNCH_COUNT = 15; - // Variables used for scrolling the toolbar on/off the page; - - // A drag has to move this amount multiplied by the height of the toolbar - // before the toolbar will appear or disappear. - private static final float TOOLBAR_MOVEMENT_THRESHOLD = 0.3f; - - // Whether the dynamic toolbar pref is enabled. - private boolean mDynamicToolbarEnabled = false; - - // The last recorded touch event from onInterceptTouchEvent. These are - // not updated until the movement threshold has been exceeded. - private float mLastTouchX = 0.0f; - private float mLastTouchY = 0.0f; - - // Because we can only scroll by integer amounts, we store the fractional - // amounts to be applied here. - private float mToolbarSubpixelAccumulation = 0.0f; - - // Used by onInterceptTouchEvent to lock the toolbar into an off or on - // position. - private boolean mToolbarLocked = false; - - // Whether the toolbar movement threshold has been passed by the current - // drag. - private boolean mToolbarThresholdPassed = false; - - // Toggled when the tabs tray is made visible to disable toolbar movement. - private boolean mToolbarPinned = false; - // Stored value of the toolbar height, so we know when it's changed. private int mToolbarHeight = 0; @@ -166,7 +139,7 @@ abstract public class BrowserApp extends GeckoApp if (isDynamicToolbarEnabled()) { // Show the toolbar. - mBrowserToolbar.animateVisibility(true); + mLayerView.getLayerMarginsAnimator().showMargins(false); } } else { hideAboutHome(); @@ -195,7 +168,7 @@ abstract public class BrowserApp extends GeckoApp if (isDynamicToolbarEnabled()) { // Show the toolbar. - mBrowserToolbar.animateVisibility(true); + mLayerView.getLayerMarginsAnimator().showMargins(false); } } break; @@ -228,134 +201,6 @@ abstract public class BrowserApp extends GeckoApp updateAboutHomeTopSites(); } - @Override - public boolean onInterceptTouchEvent(View view, MotionEvent event) { - if (!isDynamicToolbarEnabled() || mToolbarPinned) { - return super.onInterceptTouchEvent(view, event); - } - - // Don't let the toolbar scroll at all if the page is shorter than - // the screen height. - ImmutableViewportMetrics metrics = - mLayerView.getLayerClient().getViewportMetrics(); - if (metrics.getPageHeight() < metrics.getHeight()) { - return super.onInterceptTouchEvent(view, event); - } - - int action = event.getActionMasked(); - int pointerCount = event.getPointerCount(); - - // Whenever there are no pointers left on the screen, tell the page - // to clamp the viewport on fixed layer margin changes. This lets the - // toolbar scrolling off the top of the page make the page scroll up - // if it'd cause the page to go into overscroll, but only when there - // are no pointers held down. - mLayerView.getLayerClient().setClampOnFixedLayerMarginsChange( - pointerCount == 0 || action == MotionEvent.ACTION_CANCEL || - action == MotionEvent.ACTION_UP); - - View toolbarView = mBrowserToolbar.getLayout(); - if (action == MotionEvent.ACTION_DOWN || - action == MotionEvent.ACTION_POINTER_DOWN) { - if (pointerCount == 1) { - mToolbarLocked = mToolbarThresholdPassed = false; - mToolbarSubpixelAccumulation = 0.0f; - mLastTouchX = event.getX(); - mLastTouchY = event.getY(); - return super.onInterceptTouchEvent(view, event); - } - - // Animate the toolbar to the fully on/off position. - mBrowserToolbar.animateVisibility( - toolbarView.getScrollY() > toolbarView.getHeight() / 2 ? - false : true); - } - - // If more than one pointer has been tracked, or we've locked the - // toolbar movement, let the event pass through and be handled by the - // PanZoomController for zooming. - if (pointerCount > 1 || mToolbarLocked) { - return super.onInterceptTouchEvent(view, event); - } - - // If a pointer has been lifted so that there's only one pointer left, - // unlock the toolbar and track that remaining pointer. - if (pointerCount == 1 && action == MotionEvent.ACTION_POINTER_UP) { - mLastTouchY = event.getY(1 - event.getActionIndex()); - return super.onInterceptTouchEvent(view, event); - } - - // Handle scrolling the toolbar - float eventX = event.getX(); - float eventY = event.getY(); - float deltaX = mLastTouchX - eventX; - float deltaY = mLastTouchY - eventY; - int toolbarY = toolbarView.getScrollY(); - int toolbarHeight = toolbarView.getHeight(); - - // Check if we've passed the toolbar movement threshold - if (!mToolbarThresholdPassed) { - float threshold = toolbarHeight * TOOLBAR_MOVEMENT_THRESHOLD; - if (Math.abs(deltaY) > threshold) { - mToolbarThresholdPassed = true; - // If we're scrolling downwards and the toolbar was hidden - // when we started scrolling, lock it. - if (deltaY > 0 && toolbarY == toolbarHeight) { - mToolbarLocked = true; - return super.onInterceptTouchEvent(view, event); - } - } else if (Math.abs(deltaX) > threshold) { - // Any horizontal scrolling past the threshold should - // initiate toolbar lock. - mToolbarLocked = true; - mToolbarThresholdPassed = true; - return super.onInterceptTouchEvent(view, event); - } else { - // The threshold hasn't been passed. We don't want to update - // the stored last touch position, so return here. - return super.onInterceptTouchEvent(view, event); - } - } else if (action == MotionEvent.ACTION_MOVE) { - // Cancel any ongoing animation before we start moving the toolbar. - mBrowserToolbar.cancelVisibilityAnimation(); - - // Move the toolbar by the amount the touch event has moved, - // clamping to fully visible or fully hidden. - - // Don't let the toolbar scroll off the top if it's just exposing - // overscroll area. - float toolbarMaxY = Math.min(toolbarHeight, - Math.max(0, toolbarHeight - (metrics.pageRectTop - - metrics.viewportRectTop))); - - float newToolbarYf = Math.max(0, Math.min(toolbarMaxY, - toolbarY + deltaY + mToolbarSubpixelAccumulation)); - int newToolbarY = Math.round(newToolbarYf); - mToolbarSubpixelAccumulation = (newToolbarYf - newToolbarY); - - toolbarView.scrollTo(0, newToolbarY); - - // Reset tracking when the toolbar is fully visible or hidden. - if (newToolbarY == 0 || newToolbarY == toolbarHeight) { - mLastTouchY = eventY; - } - } else if (action == MotionEvent.ACTION_UP || - action == MotionEvent.ACTION_CANCEL) { - // Animate the toolbar to fully on or off, depending on how much - // of it is hidden and the current swipe velocity. - PanZoomController pzc = mLayerView.getPanZoomController(); - float yVelocity = (pzc == null ? 0.0f : pzc.getVelocityVector().y); - mBrowserToolbar.animateVisibilityWithVelocityBias( - toolbarY > toolbarHeight / 2 ? false : true, yVelocity); - } - - // Update the last recorded position. - mLastTouchX = eventX; - mLastTouchY = eventY; - - return super.onInterceptTouchEvent(view, event); - } - @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // Global onKey handler. This is called if the focused UI doesn't @@ -372,15 +217,19 @@ abstract public class BrowserApp extends GeckoApp // Toggle/focus the address bar on gamepad-y button. if (mBrowserToolbar.isVisible()) { if (isDynamicToolbarEnabled() && !mAboutHome.getUserVisibleHint()) { - mBrowserToolbar.animateVisibility(false); - mLayerView.requestFocus(); + if (mLayerView != null) { + mLayerView.getLayerMarginsAnimator().hideMargins(false); + mLayerView.requestFocus(); + } } else { // Just focus the address bar when about:home is visible // or when the dynamic toolbar isn't enabled. mBrowserToolbar.requestFocusFromTouch(); } } else { - mBrowserToolbar.animateVisibility(true); + if (mLayerView != null) { + mLayerView.getLayerMarginsAnimator().showMargins(false); + } mBrowserToolbar.requestFocusFromTouch(); } return true; @@ -499,10 +348,9 @@ abstract public class BrowserApp extends GeckoApp public boolean onInterceptMotionEvent(View view, MotionEvent event) { // If we get a gamepad panning MotionEvent while the focus is not on the layerview, // put the focus on the layerview and carry on - LayerView layerView = mLayerView; - if (layerView != null && !layerView.hasFocus() && GamepadUtils.isPanningControl(event)) { + if (mLayerView != null && !mLayerView.hasFocus() && GamepadUtils.isPanningControl(event)) { if (mAboutHome.getUserVisibleHint()) { - layerView.requestFocus(); + mLayerView.requestFocus(); } else { mAboutHome.requestFocus(); } @@ -595,18 +443,23 @@ abstract public class BrowserApp extends GeckoApp private void setDynamicToolbarEnabled(boolean enabled) { if (enabled) { + if (mLayerView != null) { + mLayerView.getLayerClient().setOnMetricsChangedListener(this); + } setToolbarMargin(0); } else { // Immediately show the toolbar when disabling the dynamic // toolbar. + if (mLayerView != null) { + mLayerView.getLayerClient().setOnMetricsChangedListener(null); + } mAboutHome.setPadding(0, 0, 0, 0); - mBrowserToolbar.cancelVisibilityAnimation(); - mBrowserToolbar.getLayout().scrollTo(0, 0); + if (mBrowserToolbar != null) { + mBrowserToolbar.getLayout().scrollTo(0, 0); + } } - // Refresh the margins to reset the padding on the spacer and - // make sure that Gecko is in sync. - ((BrowserToolbarLayout)mBrowserToolbar.getLayout()).refreshMargins(); + refreshToolbarHeight(); } private boolean isDynamicToolbarEnabled() { @@ -671,12 +524,6 @@ abstract public class BrowserApp extends GeckoApp mBrowserToolbar.updateBackButton(false); mBrowserToolbar.updateForwardButton(false); - // Reset mToolbarHeight before setting margins so we force the - // Viewport:FixedMarginsChanged message to be sent again now that - // Gecko has loaded. - mToolbarHeight = 0; - ((BrowserToolbarLayout)mBrowserToolbar.getLayout()).refreshMargins(); - mDoorHangerPopup.setAnchor(mBrowserToolbar.mFavicon); if (isExternalURL || mRestoreMode != RESTORE_NONE) { @@ -695,6 +542,13 @@ abstract public class BrowserApp extends GeckoApp } } + // Listen to margin changes to position the toolbar correctly + if (isDynamicToolbarEnabled()) { + refreshToolbarHeight(); + mLayerView.getLayerMarginsAnimator().showMargins(true); + mLayerView.getLayerClient().setOnMetricsChangedListener(this); + } + // Intercept key events for gamepad shortcuts mLayerView.setOnKeyListener(this); } @@ -709,7 +563,41 @@ abstract public class BrowserApp extends GeckoApp mGeckoLayout.requestLayout(); } - public void setToolbarHeight(int aHeight, int aVisibleHeight) { + @Override + public void onMetricsChanged(ImmutableViewportMetrics aMetrics) { + if (mAboutHome.getUserVisibleHint() || mBrowserToolbar == null) { + return; + } + + final View toolbarLayout = mBrowserToolbar.getLayout(); + final int marginTop = Math.round(aMetrics.marginTop); + ThreadUtils.postToUiThread(new Runnable() { + public void run() { + toolbarLayout.scrollTo(0, toolbarLayout.getHeight() - marginTop); + } + }); + } + + @Override + public void onPanZoomStopped() { + if (!isDynamicToolbarEnabled() || mAboutHome.getUserVisibleHint()) { + return; + } + + ImmutableViewportMetrics metrics = mLayerView.getViewportMetrics(); + if (metrics.marginTop >= mToolbarHeight / 2) { + mLayerView.getLayerMarginsAnimator().showMargins(false); + } else { + mLayerView.getLayerMarginsAnimator().hideMargins(false); + } + } + + public void refreshToolbarHeight() { + int height = 0; + if (mBrowserToolbar != null) { + height = mBrowserToolbar.getLayout().getHeight(); + } + if (!isDynamicToolbarEnabled() || mAboutHome.getUserVisibleHint()) { // Use aVisibleHeight here so that when the dynamic toolbar is // enabled, the padding will animate with the toolbar becoming @@ -718,40 +606,19 @@ abstract public class BrowserApp extends GeckoApp // When the dynamic toolbar is enabled, set the padding on the // about:home widget directly - this is to avoid resizing the // LayerView, which can cause visible artifacts. - mAboutHome.setPadding(0, aVisibleHeight, 0, 0); + mAboutHome.setPadding(0, height, 0, 0); } else { - setToolbarMargin(aVisibleHeight); + setToolbarMargin(height); + height = 0; } - aHeight = aVisibleHeight = 0; } else { setToolbarMargin(0); } - // Update the Gecko-side global for fixed viewport margins. - if (aHeight != mToolbarHeight) { - mToolbarHeight = aHeight; - - // In the current UI, this is the only place we have need of - // viewport margins (to stop the toolbar from obscuring fixed-pos - // content). - GeckoAppShell.sendEventToGecko( - GeckoEvent.createBroadcastEvent("Viewport:FixedMarginsChanged", - "{ \"top\" : " + aHeight + ", \"right\" : 0, \"bottom\" : 0, \"left\" : 0 }")); - } - - if (mLayerView != null) { - mLayerView.getLayerClient().setFixedLayerMargins(0, aVisibleHeight, 0, 0); - - // Force a redraw when the view isn't moving and the toolbar is - // fully visible or fully hidden. This is to make sure that the - // Gecko-side fixed viewport margins are in sync when the view and - // bar aren't animating. - PointF velocityVector = mLayerView.getPanZoomController().getVelocityVector(); - if ((aVisibleHeight == 0 || aVisibleHeight == aHeight) && - FloatUtils.fuzzyEquals(velocityVector.x, 0.0f) && - FloatUtils.fuzzyEquals(velocityVector.y, 0.0f)) { - mLayerView.getLayerClient().forceRedraw(); - } + if (mLayerView != null && height != mToolbarHeight) { + mToolbarHeight = height; + mLayerView.getLayerMarginsAnimator().setMaxMargins(0, height, 0, 0); + mLayerView.getLayerMarginsAnimator().showMargins(true); } } @@ -1103,11 +970,13 @@ abstract public class BrowserApp extends GeckoApp // If the tabs layout is animating onto the screen, pin the dynamic // toolbar. - if (width > 0 && height > 0) { - mToolbarPinned = true; - mBrowserToolbar.animateVisibility(true); - } else { - mToolbarPinned = false; + if (mLayerView != null && isDynamicToolbarEnabled()) { + if (width > 0 && height > 0) { + mLayerView.getLayerMarginsAnimator().showMargins(false); + mLayerView.getLayerMarginsAnimator().setMarginsPinned(true); + } else { + mLayerView.getLayerMarginsAnimator().setMarginsPinned(false); + } } mMainLayoutAnimator.start(); @@ -1209,6 +1078,15 @@ abstract public class BrowserApp extends GeckoApp return; } + // Refresh toolbar height to possibly restore the toolbar padding + refreshToolbarHeight(); + + // Show the toolbar before hiding about:home so the + // onMetricsChanged callback still works. + if (isDynamicToolbarEnabled() && mLayerView != null) { + mLayerView.getLayerMarginsAnimator().showMargins(true); + } + // We use commitAllowingStateLoss() instead of commit() here to avoid an // IllegalStateException. showAboutHome() and hideAboutHome() are // executed inside of tab's onChange() callback. Since that callback can @@ -1222,9 +1100,6 @@ abstract public class BrowserApp extends GeckoApp mAboutHome.setUserVisibleHint(true); mBrowserToolbar.setNextFocusDownId(R.id.abouthome_content); - - // Refresh margins to possibly restore the toolbar padding - ((BrowserToolbarLayout)mBrowserToolbar.getLayout()).refreshMargins(); } private void hideAboutHome() { @@ -1239,8 +1114,8 @@ abstract public class BrowserApp extends GeckoApp mBrowserToolbar.setShadowVisibility(true); mBrowserToolbar.setNextFocusDownId(R.id.layer_view); - // Refresh margins to possibly restore the toolbar padding - ((BrowserToolbarLayout)mBrowserToolbar.getLayout()).refreshMargins(); + // Refresh toolbar height to possibly restore the toolbar padding + refreshToolbarHeight(); } private class HideTabsTouchListener implements TouchEventInterceptor { @@ -1463,8 +1338,8 @@ abstract public class BrowserApp extends GeckoApp if (!mBrowserToolbar.openOptionsMenu()) super.openOptionsMenu(); - if (isDynamicToolbarEnabled()) - mBrowserToolbar.animateVisibility(true); + if (isDynamicToolbarEnabled() && mLayerView != null) + mLayerView.getLayerMarginsAnimator().showMargins(false); } @Override diff --git a/mobile/android/base/BrowserToolbar.java b/mobile/android/base/BrowserToolbar.java index fc3f8114b1b..8529e534c28 100644 --- a/mobile/android/base/BrowserToolbar.java +++ b/mobile/android/base/BrowserToolbar.java @@ -114,20 +114,11 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, private PropertyAnimator mVisibilityAnimator; - private enum ToolbarVisibility { - VISIBLE, - HIDDEN, - INCONSISTENT - }; - private ToolbarVisibility mVisibility; - private static final int TABS_CONTRACTED = 1; private static final int TABS_EXPANDED = 2; private static final int FORWARD_ANIMATION_DURATION = 450; - private static final int VISIBILITY_ANIMATION_DURATION = 250; - public BrowserToolbar(BrowserApp activity) { // BrowserToolbar is attached to BrowserApp only. mActivity = activity; @@ -138,8 +129,6 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, mAnimateSiteSecurity = true; mAnimatingEntry = false; - - mVisibility = ToolbarVisibility.INCONSISTENT; } public void from(LinearLayout layout) { @@ -505,71 +494,8 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, } } - private boolean canToolbarHide() { - // Forbid the toolbar from hiding if hiding the toolbar would cause - // the page to go into overscroll. - LayerView layerView = GeckoApp.mAppContext.getLayerView(); - if (layerView != null) { - ImmutableViewportMetrics metrics = layerView.getViewportMetrics(); - return (metrics.getPageHeight() >= metrics.getHeight()); - } - return false; - } - - public void animateVisibility(boolean show) { - // Do nothing if there's a delayed animation pending that does the - // same thing and this request also has a delay. - if (mVisibility != ToolbarVisibility.INCONSISTENT && - show == isVisible()) { - return; - } - - cancelVisibilityAnimation(); - mVisibility = show ? ToolbarVisibility.VISIBLE : ToolbarVisibility.HIDDEN; - - mVisibilityAnimator = new PropertyAnimator(VISIBILITY_ANIMATION_DURATION); - mVisibilityAnimator.attach(mLayout, PropertyAnimator.Property.SCROLL_Y, - show ? 0 : mLayout.getHeight()); - - // Only start the animation if we're showing the toolbar, or it's ok - // to hide it. - if (mVisibility == ToolbarVisibility.VISIBLE || - canToolbarHide()) { - mVisibilityAnimator.start(); - } - } - - /** - * Animate the visibility of the toolbar, but take into account the - * velocity of what's moving underneath the toolbar. If that velocity - * is greater than the default animation velocity, it will determine - * the direction of the toolbar animation. Velocity is specified in - * pixels per 1/60 seconds (a 60Hz frame). - */ - public void animateVisibilityWithVelocityBias(boolean show, float velocity) { - // Work out the default animation velocity. This assumes a linear - // animation which is incorrect, but the animation is short enough that - // there's very little difference. - float defaultVelocity = - mLayout.getHeight() / ((VISIBILITY_ANIMATION_DURATION / 1000.0f) * 60); - - if (Math.abs(velocity) > defaultVelocity) { - show = (velocity > 0) ? false : true; - } - - animateVisibility(show); - } - - public void cancelVisibilityAnimation() { - if (mVisibilityAnimator != null) { - mVisibility = ToolbarVisibility.INCONSISTENT; - mVisibilityAnimator.stop(false); - mVisibilityAnimator = null; - } - } - public boolean isVisible() { - return mVisibility == ToolbarVisibility.VISIBLE; + return mLayout.getScrollY() == 0; } public void setNextFocusDownId(int nextId) { diff --git a/mobile/android/base/BrowserToolbarLayout.java b/mobile/android/base/BrowserToolbarLayout.java index 468271b78c5..d2d54985d7f 100644 --- a/mobile/android/base/BrowserToolbarLayout.java +++ b/mobile/android/base/BrowserToolbarLayout.java @@ -28,15 +28,6 @@ public class BrowserToolbarLayout extends LinearLayout { return super.onTouchEvent(event); } - @Override - protected void onScrollChanged(int l, int t, int oldl, int oldt) { - super.onScrollChanged(l, t, oldl, oldt); - - if (t != oldt) { - refreshMargins(); - } - } - @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); @@ -44,19 +35,14 @@ public class BrowserToolbarLayout extends LinearLayout { if (h != oldh) { // Post this to happen outside of onSizeChanged, as this may cause // a layout change and relayouts within a layout change don't work. + final int height = h; post(new Runnable() { @Override public void run() { - refreshMargins(); + ((BrowserApp)GeckoApp.mAppContext).refreshToolbarHeight(); } }); } } - - public void refreshMargins() { - int height = getHeight(); - int visibleHeight = height - getScrollY(); - ((BrowserApp)GeckoApp.mAppContext).setToolbarHeight(height, visibleHeight); - } } diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index de738d3d140..f63fb78717a 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -767,10 +767,12 @@ abstract public class GeckoApp if (tab == null) return; tab.setZoomConstraints(new ZoomConstraints(message)); + tab.setIsRTL(message.getBoolean("isRTL")); // Sync up the layer view and the tab if the tab is currently displayed. LayerView layerView = mLayerView; if (layerView != null && Tabs.getInstance().isSelectedTab(tab)) { layerView.setZoomConstraints(tab.getZoomConstraints()); + layerView.setIsRTL(tab.getIsRTL()); } } else if (event.equals("Session:StatePurged")) { onStatePurged(); diff --git a/mobile/android/base/GeckoEvent.java b/mobile/android/base/GeckoEvent.java index 4dff62ec190..ef6e0b7c470 100644 --- a/mobile/android/base/GeckoEvent.java +++ b/mobile/android/base/GeckoEvent.java @@ -590,10 +590,10 @@ public class GeckoEvent { sb.append("{ \"x\" : ").append(metrics.viewportRectLeft) .append(", \"y\" : ").append(metrics.viewportRectTop) .append(", \"zoom\" : ").append(metrics.zoomFactor) - .append(", \"fixedMarginLeft\" : ").append(metrics.fixedLayerMarginLeft) - .append(", \"fixedMarginTop\" : ").append(metrics.fixedLayerMarginTop) - .append(", \"fixedMarginRight\" : ").append(metrics.fixedLayerMarginRight) - .append(", \"fixedMarginBottom\" : ").append(metrics.fixedLayerMarginBottom) + .append(", \"fixedMarginLeft\" : ").append(metrics.marginLeft) + .append(", \"fixedMarginTop\" : ").append(metrics.marginTop) + .append(", \"fixedMarginRight\" : ").append(metrics.marginRight) + .append(", \"fixedMarginBottom\" : ").append(metrics.marginBottom) .append(", \"displayPort\" :").append(displayPort.toJSON()) .append('}'); event.mCharactersExtra = sb.toString(); diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index 9843fe00f59..2308b09fb8b 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -191,6 +191,7 @@ FENNEC_JAVA_FILES = \ gfx/IntSize.java \ gfx/JavaPanZoomController.java \ gfx/Layer.java \ + gfx/LayerMarginsAnimator.java \ gfx/LayerRenderer.java \ gfx/LayerView.java \ gfx/PluginLayer.java \ diff --git a/mobile/android/base/Tab.java b/mobile/android/base/Tab.java index 98ace2a72c5..7899bae0f2f 100644 --- a/mobile/android/base/Tab.java +++ b/mobile/android/base/Tab.java @@ -56,6 +56,7 @@ public class Tab { private String mContentType; private boolean mHasTouchListeners; private ZoomConstraints mZoomConstraints; + private boolean mIsRTL; private ArrayList mPluginViews; private HashMap mPluginLayers; private int mBackgroundColor; @@ -295,6 +296,14 @@ public class Tab { return mZoomConstraints; } + public void setIsRTL(boolean aIsRTL) { + mIsRTL = aIsRTL; + } + + public boolean getIsRTL() { + return mIsRTL; + } + public void setHasTouchListeners(boolean aValue) { mHasTouchListeners = aValue; } diff --git a/mobile/android/base/TextSelection.java b/mobile/android/base/TextSelection.java index 10223f8e5dc..fc74b5c6798 100644 --- a/mobile/android/base/TextSelection.java +++ b/mobile/android/base/TextSelection.java @@ -122,21 +122,25 @@ class TextSelection extends Layer implements GeckoEventListener { // cache the relevant values from the context and bail out if they are the same. we do this // because this draw function gets called a lot (once per compositor frame) and we want to // avoid doing a lot of extra work in cases where it's not needed. - if (FloatUtils.fuzzyEquals(mViewLeft, context.viewport.left) - && FloatUtils.fuzzyEquals(mViewTop, context.viewport.top) - && FloatUtils.fuzzyEquals(mViewZoom, context.zoomFactor)) { + final float viewLeft = context.viewport.left - context.offset.x; + final float viewTop = context.viewport.top - context.offset.y; + final float viewZoom = context.zoomFactor; + + if (FloatUtils.fuzzyEquals(mViewLeft, viewLeft) + && FloatUtils.fuzzyEquals(mViewTop, viewTop) + && FloatUtils.fuzzyEquals(mViewZoom, viewZoom)) { return; } - mViewLeft = context.viewport.left; - mViewTop = context.viewport.top; - mViewZoom = context.zoomFactor; + mViewLeft = viewLeft; + mViewTop = viewTop; + mViewZoom = viewZoom; mActivity.runOnUiThread(new Runnable() { @Override public void run() { - mStartHandle.repositionWithViewport(context.viewport.left, context.viewport.top, context.zoomFactor); - mMiddleHandle.repositionWithViewport(context.viewport.left, context.viewport.top, context.zoomFactor); - mEndHandle.repositionWithViewport(context.viewport.left, context.viewport.top, context.zoomFactor); + mStartHandle.repositionWithViewport(viewLeft, viewTop, viewZoom); + mMiddleHandle.repositionWithViewport(viewLeft, viewTop, viewZoom); + mEndHandle.repositionWithViewport(viewLeft, viewTop, viewZoom); } }); } diff --git a/mobile/android/base/TextSelectionHandle.java b/mobile/android/base/TextSelectionHandle.java index 40acf29441d..f8f3696d385 100644 --- a/mobile/android/base/TextSelectionHandle.java +++ b/mobile/android/base/TextSelectionHandle.java @@ -155,7 +155,8 @@ class TextSelectionHandle extends ImageView implements View.OnTouchListener { } ImmutableViewportMetrics metrics = layerView.getViewportMetrics(); - repositionWithViewport(metrics.viewportRectLeft, metrics.viewportRectTop, metrics.zoomFactor); + PointF offset = metrics.getMarginOffset(); + repositionWithViewport(metrics.viewportRectLeft - offset.x, metrics.viewportRectTop - offset.y, metrics.zoomFactor); } void repositionWithViewport(float x, float y, float zoom) { diff --git a/mobile/android/base/gfx/GeckoLayerClient.java b/mobile/android/base/gfx/GeckoLayerClient.java index b9f9aed7da2..0018d1ea338 100644 --- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -83,16 +83,16 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget * that because mViewportMetrics might get reassigned in between reading the different * fields. */ private volatile ImmutableViewportMetrics mViewportMetrics; + private OnMetricsChangedListener mViewportChangeListener; private ZoomConstraints mZoomConstraints; private boolean mGeckoIsReady; private final PanZoomController mPanZoomController; + private final LayerMarginsAnimator mMarginsAnimator; private LayerView mView; - private boolean mClampOnMarginChange; - public GeckoLayerClient(Context context, LayerView view, EventDispatcher eventDispatcher) { // we can fill these in with dummy values because they are always written // to before being read @@ -108,7 +108,6 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget mProgressiveUpdateDisplayPort = new DisplayPortMetrics(); mLastProgressiveUpdateWasLowPrecision = false; mProgressiveUpdateWasInDanger = false; - mClampOnMarginChange = true; mForceRedraw = true; DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); @@ -117,6 +116,7 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget mZoomConstraints = new ZoomConstraints(false); mPanZoomController = PanZoomController.Factory.create(this, view, eventDispatcher); + mMarginsAnimator = new LayerMarginsAnimator(this); mView = view; mView.setListener(this); } @@ -206,6 +206,10 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget return mPanZoomController; } + LayerMarginsAnimator getLayerMarginsAnimator() { + return mMarginsAnimator; + } + /* Informs Gecko that the screen size has changed. */ private void sendResizeEventIfNecessary(boolean force) { DisplayMetrics metrics = mContext.getResources().getDisplayMetrics(); @@ -259,50 +263,49 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget }); } - private void adjustFixedLayerMarginsForOverscroll(ImmutableViewportMetrics metrics, RectF adjustedMargins) { - // When the page is in overscroll, we want that to 'eat into' the fixed - // margin on that side of the viewport. This is because overscroll - // equates to extra visible area and we use the fixed margins to stop - // fixed position elements from being obscured by chrome. - // When we're overscrolled, we also want to make sure that the fixed - // content on the non-overscroll side isn't obscured by the edge of the - // window, so when adjusting one side of a margin, we apply the opposite - // adjustment to the other side of the margin. - adjustedMargins.left = metrics.fixedLayerMarginLeft; - adjustedMargins.top = metrics.fixedLayerMarginTop; - adjustedMargins.right = metrics.fixedLayerMarginRight; - adjustedMargins.bottom = metrics.fixedLayerMarginBottom; + /** + * Derives content document fixed position margins/fixed layer margins from + * the view margins in the given metrics object. + */ + private void getFixedMargins(ImmutableViewportMetrics metrics, RectF fixedMargins) { + fixedMargins.left = 0; + fixedMargins.top = 0; + fixedMargins.right = 0; + fixedMargins.bottom = 0; // The maximum margins are determined by the scrollable area of the page. float maxMarginWidth = Math.max(0, metrics.getPageWidth() - metrics.getWidthWithoutMargins()); float maxMarginHeight = Math.max(0, metrics.getPageHeight() - metrics.getHeightWithoutMargins()); - // Adjust for left overscroll - float leftOverscroll = metrics.pageRectLeft - metrics.viewportRectLeft; - if (leftOverscroll > 0) { - adjustedMargins.left = FloatUtils.clamp(adjustedMargins.left - leftOverscroll, 0, maxMarginWidth); - adjustedMargins.right = FloatUtils.clamp(adjustedMargins.right + leftOverscroll, 0, maxMarginWidth - adjustedMargins.left); + PointF offset = metrics.getMarginOffset(); + RectF overscroll = metrics.getOverscroll(); + if (offset.x >= 0) { + fixedMargins.right = Math.max(0, Math.min(offset.x - overscroll.right, maxMarginWidth)); + } else { + fixedMargins.left = Math.max(0, Math.min(-offset.x - overscroll.left, maxMarginWidth)); + } + if (offset.y >= 0) { + fixedMargins.bottom = Math.max(0, Math.min(offset.y - overscroll.bottom, maxMarginHeight)); + } else { + fixedMargins.top = Math.max(0, Math.min(-offset.y - overscroll.top, maxMarginHeight)); } - // Adjust for right overscroll - float rightOverscroll = metrics.viewportRectRight - metrics.pageRectRight; - if (rightOverscroll > 0) { - adjustedMargins.right = FloatUtils.clamp(adjustedMargins.right - rightOverscroll, 0, maxMarginWidth); - adjustedMargins.left = FloatUtils.clamp(adjustedMargins.left + rightOverscroll, 0, maxMarginWidth - adjustedMargins.right); + // Adjust for overscroll. If we're overscrolled on one side, add that + // distance to the margins of the other side (limiting to the maximum + // margin size calculated above). + if (overscroll.left > 0) { + fixedMargins.right = Math.min(maxMarginWidth - fixedMargins.left, + fixedMargins.right + overscroll.left); + } else if (overscroll.right > 0) { + fixedMargins.left = Math.min(maxMarginWidth - fixedMargins.right, + fixedMargins.left + overscroll.right); } - - // Adjust for top overscroll - float topOverscroll = metrics.pageRectTop - metrics.viewportRectTop; - if (topOverscroll > 0) { - adjustedMargins.top = FloatUtils.clamp(adjustedMargins.top - topOverscroll, 0, maxMarginHeight); - adjustedMargins.bottom = FloatUtils.clamp(adjustedMargins.bottom + topOverscroll, 0, maxMarginHeight - adjustedMargins.top); - } - - // Adjust for bottom overscroll - float bottomOverscroll = metrics.viewportRectBottom - metrics.pageRectBottom; - if (bottomOverscroll > 0) { - adjustedMargins.bottom = FloatUtils.clamp(adjustedMargins.bottom - bottomOverscroll, 0, maxMarginHeight); - adjustedMargins.top = FloatUtils.clamp(adjustedMargins.top + bottomOverscroll, 0, maxMarginHeight - adjustedMargins.bottom); + if (overscroll.top > 0) { + fixedMargins.bottom = Math.min(maxMarginHeight - fixedMargins.top, + fixedMargins.bottom + overscroll.top); + } else if (overscroll.bottom > 0) { + fixedMargins.top = Math.min(maxMarginHeight - fixedMargins.bottom, + fixedMargins.top + overscroll.bottom); } } @@ -310,11 +313,10 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget ImmutableViewportMetrics metrics = getViewportMetrics(); ImmutableViewportMetrics clampedMetrics = metrics.clamp(); - RectF fixedLayerMargins = new RectF(); - adjustFixedLayerMarginsForOverscroll(metrics, fixedLayerMargins); - clampedMetrics = clampedMetrics.setFixedLayerMargins( - fixedLayerMargins.left, fixedLayerMargins.top, - fixedLayerMargins.right, fixedLayerMargins.bottom); + RectF margins = new RectF(); + getFixedMargins(metrics, margins); + clampedMetrics = clampedMetrics.setMargins( + margins.left, margins.top, margins.right, margins.bottom); if (displayPort == null) { displayPort = DisplayPortCalculator.calculate(metrics, mPanZoomController.getVelocityVector()); @@ -386,21 +388,6 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget } }); - // If we're meant to be scrolled to the top, take into account - // the current fixed layer margins and offset the local viewport - // accordingly. - // XXX We should also do this for the left on an ltr document, and - // the right on an rtl document, but we don't currently have - // a way of determining the text direction from Java. - // This also applies to setFirstPaintViewport. - if (type == ViewportMessageType.UPDATE - && FloatUtils.fuzzyEquals(newMetrics.viewportRectTop, - newMetrics.pageRectTop) - && oldMetrics.fixedLayerMarginTop > 0) { - newMetrics = newMetrics.setViewportOrigin(newMetrics.viewportRectLeft, - newMetrics.pageRectTop - oldMetrics.fixedLayerMarginTop); - } - setViewportMetrics(newMetrics, type == ViewportMessageType.UPDATE); mDisplayPort = DisplayPortCalculator.calculate(getViewportMetrics(), null); } @@ -423,58 +410,6 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget } } - /** - * Sets margins on fixed-position layers, to be used when compositing. - * Must be called on the UI thread! - */ - public synchronized void setFixedLayerMargins(float left, float top, float right, float bottom) { - ImmutableViewportMetrics oldMetrics = getViewportMetrics(); - ImmutableViewportMetrics newMetrics = oldMetrics.setFixedLayerMargins(left, top, right, bottom); - - if (mClampOnMarginChange) { - // Only clamp on decreased margins - boolean changed = false; - float viewportRectLeft = oldMetrics.viewportRectLeft; - float viewportRectTop = oldMetrics.viewportRectTop; - - // Clamp the x-axis if the page was over-scrolled into the margin - // area. - if (oldMetrics.fixedLayerMarginLeft > left && - viewportRectLeft < oldMetrics.pageRectLeft - left) { - viewportRectLeft = oldMetrics.pageRectLeft - left; - changed = true; - } else if (oldMetrics.fixedLayerMarginRight > right && - oldMetrics.viewportRectRight > oldMetrics.pageRectRight + right) { - viewportRectLeft = oldMetrics.pageRectRight + right - oldMetrics.getWidth(); - changed = true; - } - - // Do the same for the y-axis. - if (oldMetrics.fixedLayerMarginTop > top && - viewportRectTop < oldMetrics.pageRectTop - top) { - viewportRectTop = oldMetrics.pageRectTop - top; - changed = true; - } else if (oldMetrics.fixedLayerMarginBottom > bottom && - oldMetrics.viewportRectBottom > oldMetrics.pageRectBottom + bottom) { - viewportRectTop = oldMetrics.pageRectBottom + bottom - oldMetrics.getHeight(); - changed = true; - } - - // Set the new metrics, if they're different. - if (changed) { - newMetrics = newMetrics.setViewportOrigin(viewportRectLeft, viewportRectTop); - } - } - - mViewportMetrics = newMetrics; - mView.requestRender(); - setShadowVisibility(); - } - - public void setClampOnFixedLayerMarginsChange(boolean aClamp) { - mClampOnMarginChange = aClamp; - } - // This is called on the Gecko thread to determine if we're still interested // in the update of this display-port to continue. We can return true here // to abort the current update and continue with any subsequent ones. This @@ -580,6 +515,11 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget mZoomConstraints = constraints; } + void setIsRTL(boolean aIsRTL) { + ImmutableViewportMetrics newMetrics = getViewportMetrics().setIsRTL(aIsRTL); + setViewportMetrics(newMetrics, false); + } + /** This function is invoked by Gecko via JNI; be careful when modifying signature. * The compositor invokes this function just before compositing a frame where the document * is different from the document composited on the last frame. In these cases, the viewport @@ -593,11 +533,14 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget synchronized (this) { ImmutableViewportMetrics currentMetrics = getViewportMetrics(); + Tab tab = Tabs.getInstance().getSelectedTab(); + final ImmutableViewportMetrics newMetrics = currentMetrics .setViewportOrigin(offsetX, offsetY) .setZoomFactor(zoom) .setPageRect(new RectF(pageLeft, pageTop, pageRight, pageBottom), - new RectF(cssPageLeft, cssPageTop, cssPageRight, cssPageBottom)); + new RectF(cssPageLeft, cssPageTop, cssPageRight, cssPageBottom)) + .setIsRTL(tab.getIsRTL()); // Since we have switched to displaying a different document, we need to update any // viewport-related state we have lying around. This includes mGeckoViewport and // mViewportMetrics. Usually this information is updated via handleViewportMessage @@ -609,17 +552,8 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget } }); - // If we're meant to be scrolled to the top, take into account any - // margin set on the pan zoom controller. - if (FloatUtils.fuzzyEquals(offsetY, pageTop) - && newMetrics.fixedLayerMarginTop > 0) { - setViewportMetrics(newMetrics.setViewportOrigin(offsetX, - -newMetrics.fixedLayerMarginTop)); - } else { - setViewportMetrics(newMetrics); - } + setViewportMetrics(newMetrics); - Tab tab = Tabs.getInstance().getSelectedTab(); mView.setBackgroundColor(tab.getBackgroundColor()); setZoomConstraints(tab.getZoomConstraints()); @@ -683,13 +617,23 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget mCurrentViewTransform.scale = mFrameMetrics.zoomFactor; // Adjust the fixed layer margins so that overscroll subtracts from them. - adjustFixedLayerMarginsForOverscroll(mFrameMetrics, mCurrentViewTransformMargins); + getFixedMargins(mFrameMetrics, mCurrentViewTransformMargins); mCurrentViewTransform.fixedLayerMarginLeft = mCurrentViewTransformMargins.left; mCurrentViewTransform.fixedLayerMarginTop = mCurrentViewTransformMargins.top; mCurrentViewTransform.fixedLayerMarginRight = mCurrentViewTransformMargins.right; mCurrentViewTransform.fixedLayerMarginBottom = mCurrentViewTransformMargins.bottom; - mRootLayer.setPositionAndResolution(x, y, x + width, y + height, resolution); + // Offset the view transform so that it renders in the correct place. + PointF offset = mFrameMetrics.getMarginOffset(); + mCurrentViewTransform.offsetX = offset.x; + mCurrentViewTransform.offsetY = offset.y; + + mRootLayer.setPositionAndResolution( + Math.round(x + mCurrentViewTransform.offsetX), + Math.round(y + mCurrentViewTransform.offsetY), + Math.round(x + width + mCurrentViewTransform.offsetX), + Math.round(y + height + mCurrentViewTransform.offsetY), + resolution); if (layersUpdated && mRecordDrawTimes) { // If we got a layers update, that means a draw finished. Check to see if the area drawn matches @@ -818,9 +762,20 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget // ever be updated is in GeckoLayerClient.setFixedLayerMargins; both of these assign to // mViewportMetrics directly. metrics = metrics.setViewportSize(mViewportMetrics.getWidth(), mViewportMetrics.getHeight()); - metrics = metrics.setFixedLayerMarginsFrom(mViewportMetrics); + metrics = metrics.setMarginsFrom(mViewportMetrics); mViewportMetrics = metrics; + viewportMetricsChanged(notifyGecko); + } + + /* + * You must hold the monitor while calling this. + */ + private void viewportMetricsChanged(boolean notifyGecko) { + if (mViewportChangeListener != null) { + mViewportChangeListener.onMetricsChanged(mViewportMetrics); + } + mView.requestRender(); if (notifyGecko && mGeckoIsReady) { geometryChanged(); @@ -828,6 +783,48 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget setShadowVisibility(); } + /* + * Updates the viewport metrics, overriding the viewport size and margins + * which are normally retained when calling setViewportMetrics. + * You must hold the monitor while calling this. + */ + void forceViewportMetrics(ImmutableViewportMetrics metrics, boolean notifyGecko, boolean forceRedraw) { + if (forceRedraw) { + mForceRedraw = true; + } + mViewportMetrics = metrics; + viewportMetricsChanged(notifyGecko); + } + + /** Implementation of PanZoomTarget + * Scroll the viewport by a certain amount. This will take viewport margins + * and margin animation into account. If margins are currently animating, + * this will just go ahead and modify the viewport origin, otherwise the + * delta will be applied to the margins and the remainder will be applied to + * the viewport origin. + * + * You must hold the monitor while calling this. + */ + @Override + public void scrollBy(float dx, float dy) { + // Set mViewportMetrics manually so the margin changes take. + mViewportMetrics = mMarginsAnimator.scrollBy(mViewportMetrics, dx, dy); + viewportMetricsChanged(true); + } + + /** Implementation of PanZoomTarget */ + @Override + public void panZoomStopped() { + if (mViewportChangeListener != null) { + mViewportChangeListener.onPanZoomStopped(); + } + } + + public interface OnMetricsChangedListener { + public void onMetricsChanged(ImmutableViewportMetrics viewport); + public void onPanZoomStopped(); + } + private void setShadowVisibility() { ThreadUtils.postToUiThread(new Runnable() { @Override @@ -836,7 +833,7 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget return; } ImmutableViewportMetrics m = mViewportMetrics; - BrowserApp.mBrowserToolbar.setShadowVisibility(m.viewportRectTop >= m.pageRectTop - m.fixedLayerMarginTop); + BrowserApp.mBrowserToolbar.setShadowVisibility(m.viewportRectTop >= m.pageRectTop); } }); } @@ -877,12 +874,14 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget ImmutableViewportMetrics viewportMetrics = mViewportMetrics; PointF origin = viewportMetrics.getOrigin(); + PointF offset = viewportMetrics.getMarginOffset(); + origin.offset(-offset.x, -offset.y); float zoom = viewportMetrics.zoomFactor; ImmutableViewportMetrics geckoViewport = mGeckoViewport; PointF geckoOrigin = geckoViewport.getOrigin(); float geckoZoom = geckoViewport.zoomFactor; - // viewPoint + origin gives the coordinate in device pixels from the top-left corner of the page. + // viewPoint + origin - offset gives the coordinate in device pixels from the top-left corner of the page. // Divided by zoom, this gives us the coordinate in CSS pixels from the top-left corner of the page. // geckoOrigin / geckoZoom is where Gecko thinks it is (scrollTo position) in CSS pixels from // the top-left corner of the page. Subtracting the two gives us the offset of the viewPoint from @@ -894,6 +893,10 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget return layerPoint; } + public void setOnMetricsChangedListener(OnMetricsChangedListener listener) { + mViewportChangeListener = listener; + } + /** Used by robocop for testing purposes. Not for production use! */ public void setDrawListener(DrawListener listener) { mDrawListener = listener; diff --git a/mobile/android/base/gfx/ImmutableViewportMetrics.java b/mobile/android/base/gfx/ImmutableViewportMetrics.java index 33e28eaf435..1b1c25a7320 100644 --- a/mobile/android/base/gfx/ImmutableViewportMetrics.java +++ b/mobile/android/base/gfx/ImmutableViewportMetrics.java @@ -32,21 +32,26 @@ public class ImmutableViewportMetrics { public final float viewportRectTop; public final float viewportRectRight; public final float viewportRectBottom; - public final float fixedLayerMarginLeft; - public final float fixedLayerMarginTop; - public final float fixedLayerMarginRight; - public final float fixedLayerMarginBottom; + public final float marginLeft; + public final float marginTop; + public final float marginRight; + public final float marginBottom; public final float zoomFactor; + public final boolean isRTL; public ImmutableViewportMetrics(DisplayMetrics metrics) { viewportRectLeft = pageRectLeft = cssPageRectLeft = 0; viewportRectTop = pageRectTop = cssPageRectTop = 0; viewportRectRight = pageRectRight = cssPageRectRight = metrics.widthPixels; viewportRectBottom = pageRectBottom = cssPageRectBottom = metrics.heightPixels; - fixedLayerMarginLeft = fixedLayerMarginTop = fixedLayerMarginRight = fixedLayerMarginBottom = 0; + marginLeft = marginTop = marginRight = marginBottom = 0; zoomFactor = 1.0f; + isRTL = false; } + /** This constructor is used by native code in AndroidJavaWrappers.cpp, be + * careful when modifying the signature. + */ private ImmutableViewportMetrics(float aPageRectLeft, float aPageRectTop, float aPageRectRight, float aPageRectBottom, float aCssPageRectLeft, float aCssPageRectTop, float aCssPageRectRight, float aCssPageRectBottom, @@ -57,16 +62,16 @@ public class ImmutableViewportMetrics { aPageRectRight, aPageRectBottom, aCssPageRectLeft, aCssPageRectTop, aCssPageRectRight, aCssPageRectBottom, aViewportRectLeft, aViewportRectTop, aViewportRectRight, - aViewportRectBottom, 0.0f, 0.0f, 0.0f, 0.0f, aZoomFactor); + aViewportRectBottom, 0.0f, 0.0f, 0.0f, 0.0f, aZoomFactor, false); } private ImmutableViewportMetrics(float aPageRectLeft, float aPageRectTop, float aPageRectRight, float aPageRectBottom, float aCssPageRectLeft, float aCssPageRectTop, float aCssPageRectRight, float aCssPageRectBottom, float aViewportRectLeft, float aViewportRectTop, float aViewportRectRight, - float aViewportRectBottom, float aFixedLayerMarginLeft, - float aFixedLayerMarginTop, float aFixedLayerMarginRight, - float aFixedLayerMarginBottom, float aZoomFactor) + float aViewportRectBottom, float aMarginLeft, + float aMarginTop, float aMarginRight, + float aMarginBottom, float aZoomFactor, boolean aIsRTL) { pageRectLeft = aPageRectLeft; pageRectTop = aPageRectTop; @@ -80,11 +85,12 @@ public class ImmutableViewportMetrics { viewportRectTop = aViewportRectTop; viewportRectRight = aViewportRectRight; viewportRectBottom = aViewportRectBottom; - fixedLayerMarginLeft = aFixedLayerMarginLeft; - fixedLayerMarginTop = aFixedLayerMarginTop; - fixedLayerMarginRight = aFixedLayerMarginRight; - fixedLayerMarginBottom = aFixedLayerMarginBottom; + marginLeft = aMarginLeft; + marginTop = aMarginTop; + marginRight = aMarginRight; + marginBottom = aMarginBottom; zoomFactor = aZoomFactor; + isRTL = aIsRTL; } public float getWidth() { @@ -96,17 +102,24 @@ public class ImmutableViewportMetrics { } public float getWidthWithoutMargins() { - return viewportRectRight - viewportRectLeft - fixedLayerMarginLeft - fixedLayerMarginRight; + return viewportRectRight - viewportRectLeft - marginLeft - marginRight; } public float getHeightWithoutMargins() { - return viewportRectBottom - viewportRectTop - fixedLayerMarginTop - fixedLayerMarginBottom; + return viewportRectBottom - viewportRectTop - marginTop - marginBottom; } public PointF getOrigin() { return new PointF(viewportRectLeft, viewportRectTop); } + public PointF getMarginOffset() { + if (isRTL) { + return new PointF(marginLeft - marginRight, marginTop); + } + return new PointF(marginLeft, marginTop); + } + public FloatSize getSize() { return new FloatSize(viewportRectRight - viewportRectLeft, viewportRectBottom - viewportRectTop); } @@ -130,14 +143,29 @@ public class ImmutableViewportMetrics { return pageRectRight - pageRectLeft; } + public float getPageWidthWithMargins() { + return (pageRectRight - pageRectLeft) + marginLeft + marginRight; + } + public float getPageHeight() { return pageRectBottom - pageRectTop; } + public float getPageHeightWithMargins() { + return (pageRectBottom - pageRectTop) + marginTop + marginBottom; + } + public RectF getCssPageRect() { return new RectF(cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom); } + public RectF getOverscroll() { + return new RectF(Math.max(0, pageRectLeft - viewportRectLeft), + Math.max(0, pageRectTop - viewportRectTop), + Math.max(0, viewportRectRight - pageRectRight), + Math.max(0, viewportRectBottom - pageRectBottom)); + } + /* * Returns the viewport metrics that represent a linear transition between "this" and "to" at * time "t", which is on the scale [0, 1). This function interpolates all values stored in @@ -157,11 +185,12 @@ public class ImmutableViewportMetrics { FloatUtils.interpolate(viewportRectTop, to.viewportRectTop, t), FloatUtils.interpolate(viewportRectRight, to.viewportRectRight, t), FloatUtils.interpolate(viewportRectBottom, to.viewportRectBottom, t), - FloatUtils.interpolate(fixedLayerMarginLeft, to.fixedLayerMarginLeft, t), - FloatUtils.interpolate(fixedLayerMarginTop, to.fixedLayerMarginTop, t), - FloatUtils.interpolate(fixedLayerMarginRight, to.fixedLayerMarginRight, t), - FloatUtils.interpolate(fixedLayerMarginBottom, to.fixedLayerMarginBottom, t), - FloatUtils.interpolate(zoomFactor, to.zoomFactor, t)); + FloatUtils.interpolate(marginLeft, to.marginLeft, t), + FloatUtils.interpolate(marginTop, to.marginTop, t), + FloatUtils.interpolate(marginRight, to.marginRight, t), + FloatUtils.interpolate(marginBottom, to.marginBottom, t), + FloatUtils.interpolate(zoomFactor, to.zoomFactor, t), + t >= 0.5 ? to.isRTL : isRTL); } public ImmutableViewportMetrics setViewportSize(float width, float height) { @@ -173,8 +202,8 @@ public class ImmutableViewportMetrics { pageRectLeft, pageRectTop, pageRectRight, pageRectBottom, cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom, viewportRectLeft, viewportRectTop, viewportRectLeft + width, viewportRectTop + height, - fixedLayerMarginLeft, fixedLayerMarginTop, fixedLayerMarginRight, fixedLayerMarginBottom, - zoomFactor); + marginLeft, marginTop, marginRight, marginBottom, + zoomFactor, isRTL); } public ImmutableViewportMetrics setViewportOrigin(float newOriginX, float newOriginY) { @@ -182,8 +211,8 @@ public class ImmutableViewportMetrics { pageRectLeft, pageRectTop, pageRectRight, pageRectBottom, cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom, newOriginX, newOriginY, newOriginX + getWidth(), newOriginY + getHeight(), - fixedLayerMarginLeft, fixedLayerMarginTop, fixedLayerMarginRight, fixedLayerMarginBottom, - zoomFactor); + marginLeft, marginTop, marginRight, marginBottom, + zoomFactor, isRTL); } public ImmutableViewportMetrics setZoomFactor(float newZoomFactor) { @@ -191,28 +220,39 @@ public class ImmutableViewportMetrics { pageRectLeft, pageRectTop, pageRectRight, pageRectBottom, cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom, viewportRectLeft, viewportRectTop, viewportRectRight, viewportRectBottom, - fixedLayerMarginLeft, fixedLayerMarginTop, fixedLayerMarginRight, fixedLayerMarginBottom, - newZoomFactor); + marginLeft, marginTop, marginRight, marginBottom, + newZoomFactor, isRTL); } public ImmutableViewportMetrics offsetViewportBy(float dx, float dy) { return setViewportOrigin(viewportRectLeft + dx, viewportRectTop + dy); } + public ImmutableViewportMetrics offsetViewportByAndClamp(float dx, float dy) { + if (isRTL) { + return setViewportOrigin( + Math.min(pageRectRight - getWidthWithoutMargins(), Math.max(viewportRectLeft + dx, pageRectLeft)), + Math.max(pageRectTop, Math.min(viewportRectTop + dy, pageRectBottom - getHeightWithoutMargins()))); + } + return setViewportOrigin( + Math.max(pageRectLeft, Math.min(viewportRectLeft + dx, pageRectRight - getWidthWithoutMargins())), + Math.max(pageRectTop, Math.min(viewportRectTop + dy, pageRectBottom - getHeightWithoutMargins()))); + } + public ImmutableViewportMetrics setPageRect(RectF pageRect, RectF cssPageRect) { return new ImmutableViewportMetrics( pageRect.left, pageRect.top, pageRect.right, pageRect.bottom, cssPageRect.left, cssPageRect.top, cssPageRect.right, cssPageRect.bottom, viewportRectLeft, viewportRectTop, viewportRectRight, viewportRectBottom, - fixedLayerMarginLeft, fixedLayerMarginTop, fixedLayerMarginRight, fixedLayerMarginBottom, - zoomFactor); + marginLeft, marginTop, marginRight, marginBottom, + zoomFactor, isRTL); } - public ImmutableViewportMetrics setFixedLayerMargins(float left, float top, float right, float bottom) { - if (FloatUtils.fuzzyEquals(left, fixedLayerMarginLeft) - && FloatUtils.fuzzyEquals(top, fixedLayerMarginTop) - && FloatUtils.fuzzyEquals(right, fixedLayerMarginRight) - && FloatUtils.fuzzyEquals(bottom, fixedLayerMarginBottom)) { + public ImmutableViewportMetrics setMargins(float left, float top, float right, float bottom) { + if (FloatUtils.fuzzyEquals(left, marginLeft) + && FloatUtils.fuzzyEquals(top, marginTop) + && FloatUtils.fuzzyEquals(right, marginRight) + && FloatUtils.fuzzyEquals(bottom, marginBottom)) { return this; } @@ -220,14 +260,26 @@ public class ImmutableViewportMetrics { pageRectLeft, pageRectTop, pageRectRight, pageRectBottom, cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom, viewportRectLeft, viewportRectTop, viewportRectRight, viewportRectBottom, - left, top, right, bottom, zoomFactor); + left, top, right, bottom, zoomFactor, isRTL); } - public ImmutableViewportMetrics setFixedLayerMarginsFrom(ImmutableViewportMetrics fromMetrics) { - return setFixedLayerMargins(fromMetrics.fixedLayerMarginLeft, - fromMetrics.fixedLayerMarginTop, - fromMetrics.fixedLayerMarginRight, - fromMetrics.fixedLayerMarginBottom); + public ImmutableViewportMetrics setMarginsFrom(ImmutableViewportMetrics fromMetrics) { + return setMargins(fromMetrics.marginLeft, + fromMetrics.marginTop, + fromMetrics.marginRight, + fromMetrics.marginBottom); + } + + public ImmutableViewportMetrics setIsRTL(boolean aIsRTL) { + if (isRTL == aIsRTL) { + return this; + } + + return new ImmutableViewportMetrics( + pageRectLeft, pageRectTop, pageRectRight, pageRectBottom, + cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom, + viewportRectLeft, viewportRectTop, viewportRectRight, viewportRectBottom, + marginLeft, marginTop, marginRight, marginBottom, zoomFactor, aIsRTL); } /* This will set the zoom factor and re-scale page-size and viewport offset @@ -251,32 +303,33 @@ public class ImmutableViewportMetrics { newPageRectLeft, newPageRectTop, newPageRectRight, newPageRectBottom, cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom, origin.x, origin.y, origin.x + getWidth(), origin.y + getHeight(), - fixedLayerMarginLeft, fixedLayerMarginTop, fixedLayerMarginRight, fixedLayerMarginBottom, - newZoomFactor); + marginLeft, marginTop, marginRight, marginBottom, + newZoomFactor, isRTL); } /** Clamps the viewport to remain within the page rect. */ private ImmutableViewportMetrics clamp(float marginLeft, float marginTop, float marginRight, float marginBottom) { RectF newViewport = getViewport(); + PointF offset = getMarginOffset(); // The viewport bounds ought to never exceed the page bounds. - if (newViewport.right > pageRectRight + marginRight) - newViewport.offset((pageRectRight + marginRight) - newViewport.right, 0); - if (newViewport.left < pageRectLeft - marginLeft) - newViewport.offset((pageRectLeft - marginLeft) - newViewport.left, 0); + if (newViewport.right > pageRectRight + marginLeft + marginRight) + newViewport.offset((pageRectRight + marginLeft + marginRight) - newViewport.right, 0); + if (newViewport.left < pageRectLeft) + newViewport.offset(pageRectLeft - newViewport.left, 0); - if (newViewport.bottom > pageRectBottom + marginBottom) - newViewport.offset(0, (pageRectBottom + marginBottom) - newViewport.bottom); - if (newViewport.top < pageRectTop - marginTop) - newViewport.offset(0, (pageRectTop - marginTop) - newViewport.top); + if (newViewport.bottom > pageRectBottom + marginTop + marginBottom) + newViewport.offset(0, (pageRectBottom + marginTop + marginBottom) - newViewport.bottom); + if (newViewport.top < pageRectTop) + newViewport.offset(0, pageRectTop - newViewport.top); return new ImmutableViewportMetrics( pageRectLeft, pageRectTop, pageRectRight, pageRectBottom, cssPageRectLeft, cssPageRectTop, cssPageRectRight, cssPageRectBottom, newViewport.left, newViewport.top, newViewport.right, newViewport.bottom, - fixedLayerMarginLeft, fixedLayerMarginTop, fixedLayerMarginRight, fixedLayerMarginBottom, - zoomFactor); + marginLeft, marginTop, marginRight, marginBottom, + zoomFactor, isRTL); } public ImmutableViewportMetrics clamp() { @@ -284,8 +337,8 @@ public class ImmutableViewportMetrics { } public ImmutableViewportMetrics clampWithMargins() { - return clamp(fixedLayerMarginLeft, fixedLayerMarginTop, - fixedLayerMarginRight, fixedLayerMarginBottom); + return clamp(marginLeft, marginTop, + marginRight, marginBottom); } public boolean fuzzyEquals(ImmutableViewportMetrics other) { @@ -293,9 +346,8 @@ public class ImmutableViewportMetrics { // of the cssPageRectXXX values and the zoomFactor, except with more rounding // error. Checking those is both inefficient and can lead to false negatives. // - // This doesn't return false if the fixed layer margins differ as none - // of the users of this function are interested in the margins in that - // way. + // This doesn't return false if the margins differ as none of the users + // of this function are interested in the margins in that way. return FloatUtils.fuzzyEquals(cssPageRectLeft, other.cssPageRectLeft) && FloatUtils.fuzzyEquals(cssPageRectTop, other.cssPageRectTop) && FloatUtils.fuzzyEquals(cssPageRectRight, other.cssPageRectRight) @@ -313,8 +365,8 @@ public class ImmutableViewportMetrics { + viewportRectRight + "," + viewportRectBottom + ") p=(" + pageRectLeft + "," + pageRectTop + "," + pageRectRight + "," + pageRectBottom + ") c=(" + cssPageRectLeft + "," + cssPageRectTop + "," + cssPageRectRight + "," - + cssPageRectBottom + ") m=(" + fixedLayerMarginLeft + "," - + fixedLayerMarginTop + "," + fixedLayerMarginRight + "," - + fixedLayerMarginBottom + ") z=" + zoomFactor; + + cssPageRectBottom + ") m=(" + marginLeft + "," + + marginTop + "," + marginRight + "," + + marginBottom + ") z=" + zoomFactor + ", rtl=" + isRTL; } } diff --git a/mobile/android/base/gfx/JavaPanZoomController.java b/mobile/android/base/gfx/JavaPanZoomController.java index 4198ee44428..aff04fa047a 100644 --- a/mobile/android/base/gfx/JavaPanZoomController.java +++ b/mobile/android/base/gfx/JavaPanZoomController.java @@ -197,6 +197,11 @@ class JavaPanZoomController if (state != mState) { GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent("PanZoom:StateChange", state.toString())); mState = state; + + // Let the target know we've finished with it (for now) + if (state == PanZoomState.NOTHING) { + mTarget.panZoomStopped(); + } } } @@ -706,8 +711,7 @@ class JavaPanZoomController } private void scrollBy(float dx, float dy) { - ImmutableViewportMetrics scrolled = getMetrics().offsetViewportBy(dx, dy); - mTarget.setViewportMetrics(scrolled); + mTarget.scrollBy(dx, dy); } private void fling() { @@ -998,8 +1002,8 @@ class JavaPanZoomController // Ensure minZoomFactor keeps the page at least as big as the viewport. if (pageRect.width() > 0) { float pageWidth = pageRect.width() + - viewportMetrics.fixedLayerMarginLeft + - viewportMetrics.fixedLayerMarginRight; + viewportMetrics.marginLeft + + viewportMetrics.marginRight; float scaleFactor = viewport.width() / pageWidth; minZoomFactor = Math.max(minZoomFactor, zoomFactor * scaleFactor); if (viewport.width() > pageWidth) @@ -1007,8 +1011,8 @@ class JavaPanZoomController } if (pageRect.height() > 0) { float pageHeight = pageRect.height() + - viewportMetrics.fixedLayerMarginTop + - viewportMetrics.fixedLayerMarginBottom; + viewportMetrics.marginTop + + viewportMetrics.marginBottom; float scaleFactor = viewport.height() / pageHeight; minZoomFactor = Math.max(minZoomFactor, zoomFactor * scaleFactor); if (viewport.height() > pageHeight) @@ -1043,15 +1047,9 @@ class JavaPanZoomController @Override protected float getViewportLength() { return getMetrics().getWidth(); } @Override - protected float getPageStart() { - ImmutableViewportMetrics metrics = getMetrics(); - return metrics.pageRectLeft - metrics.fixedLayerMarginLeft; - } + protected float getPageStart() { return getMetrics().pageRectLeft; } @Override - protected float getPageLength() { - ImmutableViewportMetrics metrics = getMetrics(); - return metrics.getPageWidth() + metrics.fixedLayerMarginLeft + metrics.fixedLayerMarginRight; - } + protected float getPageLength() { return getMetrics().getPageWidthWithMargins(); } } private class AxisY extends Axis { @@ -1061,15 +1059,9 @@ class JavaPanZoomController @Override protected float getViewportLength() { return getMetrics().getHeight(); } @Override - protected float getPageStart() { - ImmutableViewportMetrics metrics = getMetrics(); - return metrics.pageRectTop - metrics.fixedLayerMarginTop; - } + protected float getPageStart() { return getMetrics().pageRectTop; } @Override - protected float getPageLength() { - ImmutableViewportMetrics metrics = getMetrics(); - return metrics.getPageHeight() + metrics.fixedLayerMarginTop + metrics.fixedLayerMarginBottom; - } + protected float getPageLength() { return getMetrics().getPageHeightWithMargins(); } } /* diff --git a/mobile/android/base/gfx/Layer.java b/mobile/android/base/gfx/Layer.java index 1229abeeed2..cae7377d7a2 100644 --- a/mobile/android/base/gfx/Layer.java +++ b/mobile/android/base/gfx/Layer.java @@ -7,6 +7,7 @@ package org.mozilla.gecko.gfx; import org.mozilla.gecko.util.FloatUtils; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; @@ -176,15 +177,17 @@ public abstract class Layer { public final RectF viewport; public final RectF pageRect; public final float zoomFactor; + public final PointF offset; public final int positionHandle; public final int textureHandle; public final FloatBuffer coordBuffer; - public RenderContext(RectF aViewport, RectF aPageRect, float aZoomFactor, + public RenderContext(RectF aViewport, RectF aPageRect, float aZoomFactor, PointF aOffset, int aPositionHandle, int aTextureHandle, FloatBuffer aCoordBuffer) { viewport = aViewport; pageRect = aPageRect; zoomFactor = aZoomFactor; + offset = aOffset; positionHandle = aPositionHandle; textureHandle = aTextureHandle; coordBuffer = aCoordBuffer; @@ -196,7 +199,8 @@ public abstract class Layer { } return RectUtils.fuzzyEquals(viewport, other.viewport) && RectUtils.fuzzyEquals(pageRect, other.pageRect) - && FloatUtils.fuzzyEquals(zoomFactor, other.zoomFactor); + && FloatUtils.fuzzyEquals(zoomFactor, other.zoomFactor) + && FloatUtils.fuzzyEquals(offset, other.offset); } } } diff --git a/mobile/android/base/gfx/LayerMarginsAnimator.java b/mobile/android/base/gfx/LayerMarginsAnimator.java new file mode 100644 index 00000000000..45f2c8f03d0 --- /dev/null +++ b/mobile/android/base/gfx/LayerMarginsAnimator.java @@ -0,0 +1,186 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * 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/. */ + +package org.mozilla.gecko.gfx; + +import org.mozilla.gecko.GeckoAppShell; +import org.mozilla.gecko.GeckoEvent; +import org.mozilla.gecko.util.FloatUtils; + +import android.graphics.PointF; +import android.graphics.RectF; +import android.os.SystemClock; +import android.util.Log; +import android.view.animation.DecelerateInterpolator; + +import java.util.Timer; +import java.util.TimerTask; + +public class LayerMarginsAnimator { + private static final String LOGTAG = "GeckoLayerMarginsAnimator"; + private static final float MS_PER_FRAME = 1000.0f / 60.0f; + private static final long MARGIN_ANIMATION_DURATION = 250; + + /* This rect stores the maximum value margins can grow to when scrolling */ + private final RectF mMaxMargins; + /* If this boolean is true, scroll changes will not affect margins */ + private boolean mMarginsPinned; + /* The timer that handles showing/hiding margins */ + private Timer mAnimationTimer; + /* This interpolator is used for the above mentioned animation */ + private final DecelerateInterpolator mInterpolator; + /* The GeckoLayerClient whose margins will be animated */ + private final GeckoLayerClient mTarget; + + public LayerMarginsAnimator(GeckoLayerClient aTarget) { + // Assign member variables from parameters + mTarget = aTarget; + + // Create other member variables + mMaxMargins = new RectF(); + mInterpolator = new DecelerateInterpolator(); + } + + /** + * Sets the maximum values for margins to grow to, in pixels. + */ + public synchronized void setMaxMargins(float left, float top, float right, float bottom) { + mMaxMargins.set(left, top, right, bottom); + + // Update the Gecko-side global for fixed viewport margins. + GeckoAppShell.sendEventToGecko( + GeckoEvent.createBroadcastEvent("Viewport:FixedMarginsChanged", + "{ \"top\" : " + top + ", \"right\" : " + right + + ", \"bottom\" : " + bottom + ", \"left\" : " + left + " }")); + } + + private void animateMargins(final float left, final float top, final float right, final float bottom, boolean immediately) { + if (mAnimationTimer != null) { + mAnimationTimer.cancel(); + mAnimationTimer = null; + } + + if (immediately) { + ImmutableViewportMetrics newMetrics = mTarget.getViewportMetrics().setMargins(left, top, right, bottom); + mTarget.forceViewportMetrics(newMetrics, true, true); + return; + } + + ImmutableViewportMetrics metrics = mTarget.getViewportMetrics(); + + final long startTime = SystemClock.uptimeMillis(); + final float startLeft = metrics.marginLeft; + final float startTop = metrics.marginTop; + final float startRight = metrics.marginRight; + final float startBottom = metrics.marginBottom; + + mAnimationTimer = new Timer("Margin Animation Timer"); + mAnimationTimer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + float progress = mInterpolator.getInterpolation( + Math.min(1.0f, (SystemClock.uptimeMillis() - startTime) + / (float)MARGIN_ANIMATION_DURATION)); + + synchronized(mTarget.getLock()) { + ImmutableViewportMetrics oldMetrics = mTarget.getViewportMetrics(); + ImmutableViewportMetrics newMetrics = oldMetrics.setMargins( + FloatUtils.interpolate(startLeft, left, progress), + FloatUtils.interpolate(startTop, top, progress), + FloatUtils.interpolate(startRight, right, progress), + FloatUtils.interpolate(startBottom, bottom, progress)); + PointF oldOffset = oldMetrics.getMarginOffset(); + PointF newOffset = newMetrics.getMarginOffset(); + newMetrics = + newMetrics.offsetViewportByAndClamp(newOffset.x - oldOffset.x, + newOffset.y - oldOffset.y); + + if (progress >= 1.0f) { + if (mAnimationTimer != null) { + mAnimationTimer.cancel(); + mAnimationTimer = null; + } + + // Force a redraw and update Gecko + mTarget.forceViewportMetrics(newMetrics, true, true); + } else { + mTarget.forceViewportMetrics(newMetrics, false, false); + } + } + } + }, 0, (int)MS_PER_FRAME); + } + + /** + * Exposes the margin area by growing the margin components of the current + * metrics to the values set in setMaxMargins. + */ + public synchronized void showMargins(boolean immediately) { + animateMargins(mMaxMargins.left, mMaxMargins.top, mMaxMargins.right, mMaxMargins.bottom, immediately); + } + + public synchronized void hideMargins(boolean immediately) { + animateMargins(0, 0, 0, 0, immediately); + } + + public void setMarginsPinned(boolean pin) { + mMarginsPinned = pin; + } + + /* + * Taking maximum margins into account, offsets the margins and then the + * viewport origin and returns the modified metrics. + */ + ImmutableViewportMetrics scrollBy(ImmutableViewportMetrics aMetrics, float aDx, float aDy) { + // Make sure to cancel any margin animations when scrolling begins + if (mAnimationTimer != null) { + mAnimationTimer.cancel(); + mAnimationTimer = null; + } + + float newMarginLeft = aMetrics.marginLeft; + float newMarginTop = aMetrics.marginTop; + float newMarginRight = aMetrics.marginRight; + float newMarginBottom = aMetrics.marginBottom; + + // Only alter margins if the toolbar isn't pinned + if (!mMarginsPinned) { + RectF overscroll = aMetrics.getOverscroll(); + if (aDx >= 0) { + // Scrolling right. + float marginDx = Math.max(0, aDx - overscroll.left); + newMarginLeft = aMetrics.marginLeft - Math.min(marginDx, aMetrics.marginLeft); + newMarginRight = aMetrics.marginRight + Math.min(marginDx, mMaxMargins.right - aMetrics.marginRight); + + aDx -= aMetrics.marginLeft - newMarginLeft; + } else { + // Scrolling left. + float marginDx = Math.max(0, -aDx - overscroll.right); + newMarginLeft = aMetrics.marginLeft + Math.min(marginDx, mMaxMargins.left - aMetrics.marginLeft); + newMarginRight = aMetrics.marginRight - Math.min(marginDx, aMetrics.marginRight); + + aDx -= aMetrics.marginLeft - newMarginLeft; + } + + if (aDy >= 0) { + // Scrolling down. + float marginDy = Math.max(0, aDy - overscroll.top); + newMarginTop = aMetrics.marginTop - Math.min(marginDy, aMetrics.marginTop); + newMarginBottom = aMetrics.marginBottom + Math.min(marginDy, mMaxMargins.bottom - aMetrics.marginBottom); + + aDy -= aMetrics.marginTop - newMarginTop; + } else { + // Scrolling up. + float marginDy = Math.max(0, -aDy - overscroll.bottom); + newMarginTop = aMetrics.marginTop + Math.min(marginDy, mMaxMargins.top - aMetrics.marginTop); + newMarginBottom = aMetrics.marginBottom - Math.min(marginDy, aMetrics.marginBottom); + + aDy -= aMetrics.marginTop - newMarginTop; + } + } + + return aMetrics.setMargins(newMarginLeft, newMarginTop, newMarginRight, newMarginBottom).offsetViewportBy(aDx, aDy); + } +} diff --git a/mobile/android/base/gfx/LayerRenderer.java b/mobile/android/base/gfx/LayerRenderer.java index a31d9846ff3..2e17c2fdbc1 100644 --- a/mobile/android/base/gfx/LayerRenderer.java +++ b/mobile/android/base/gfx/LayerRenderer.java @@ -19,6 +19,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Point; +import android.graphics.PointF; import android.graphics.Rect; import android.graphics.RectF; import android.opengl.GLES20; @@ -277,21 +278,23 @@ public class LayerRenderer implements Tabs.OnTabsChangedListener { return pixelBuffer; } - private RenderContext createScreenContext(ImmutableViewportMetrics metrics) { + private RenderContext createScreenContext(ImmutableViewportMetrics metrics, PointF offset) { RectF viewport = new RectF(0.0f, 0.0f, metrics.getWidth(), metrics.getHeight()); - RectF pageRect = new RectF(metrics.getPageRect()); - return createContext(viewport, pageRect, 1.0f); + RectF pageRect = metrics.getPageRect(); + + return createContext(viewport, pageRect, 1.0f, offset); } - private RenderContext createPageContext(ImmutableViewportMetrics metrics) { - Rect viewport = RectUtils.round(metrics.getViewport()); + private RenderContext createPageContext(ImmutableViewportMetrics metrics, PointF offset) { + RectF viewport = metrics.getViewport(); RectF pageRect = metrics.getPageRect(); float zoomFactor = metrics.zoomFactor; - return createContext(new RectF(viewport), pageRect, zoomFactor); + + return createContext(new RectF(RectUtils.round(viewport)), pageRect, zoomFactor, offset); } - private RenderContext createContext(RectF viewport, RectF pageRect, float zoomFactor) { - return new RenderContext(viewport, pageRect, zoomFactor, mPositionHandle, mTextureHandle, + private RenderContext createContext(RectF viewport, RectF pageRect, float zoomFactor, PointF offset) { + return new RenderContext(viewport, pageRect, zoomFactor, offset, mPositionHandle, mTextureHandle, mCoordBuffer); } @@ -410,17 +413,27 @@ public class LayerRenderer implements Tabs.OnTabsChangedListener { private boolean mUpdated; private final Rect mPageRect; private final Rect mAbsolutePageRect; + private final PointF mRenderOffset; public Frame(ImmutableViewportMetrics metrics) { mFrameMetrics = metrics; - mPageContext = createPageContext(metrics); - mScreenContext = createScreenContext(metrics); - Point origin = PointUtils.round(mFrameMetrics.getOrigin()); - Rect pageRect = RectUtils.round(mFrameMetrics.getPageRect()); - mAbsolutePageRect = new Rect(pageRect); + // Work out the offset due to margins + Layer rootLayer = mView.getLayerClient().getRoot(); + mRenderOffset = mFrameMetrics.getMarginOffset(); + float scaleDiff = mFrameMetrics.zoomFactor / rootLayer.getResolution(); + mRenderOffset.set(mRenderOffset.x * scaleDiff, + mRenderOffset.y * scaleDiff); + + mPageContext = createPageContext(metrics, mRenderOffset); + mScreenContext = createScreenContext(metrics, mRenderOffset); + + RectF pageRect = mFrameMetrics.getPageRect(); + mAbsolutePageRect = RectUtils.round(pageRect); + + PointF origin = mFrameMetrics.getOrigin(); pageRect.offset(-origin.x, -origin.y); - mPageRect = pageRect; + mPageRect = RectUtils.round(pageRect); } private void setScissorRect() { @@ -438,8 +451,11 @@ public class LayerRenderer implements Tabs.OnTabsChangedListener { int right = Math.min(screenSize.width, rect.right); int bottom = Math.min(screenSize.height, rect.bottom); - return new Rect(left, screenSize.height - bottom, right, - (screenSize.height - bottom) + (bottom - top)); + Rect scissorRect = new Rect(left, screenSize.height - bottom, right, + (screenSize.height - bottom) + (bottom - top)); + scissorRect.offset(Math.round(-mRenderOffset.x), Math.round(-mRenderOffset.y)); + + return scissorRect; } /** This function is invoked via JNI; be careful when modifying signature. */ @@ -544,7 +560,9 @@ public class LayerRenderer implements Tabs.OnTabsChangedListener { GLES20.glDisable(GLES20.GL_SCISSOR_TEST); // Draw the drop shadow, if we need to. - if (!new RectF(mAbsolutePageRect).contains(mFrameMetrics.getViewport())) + RectF offsetAbsPageRect = new RectF(mAbsolutePageRect); + offsetAbsPageRect.offset(mRenderOffset.x, mRenderOffset.y); + if (!offsetAbsPageRect.contains(mFrameMetrics.getViewport())) mShadowLayer.draw(mPageContext); } diff --git a/mobile/android/base/gfx/LayerView.java b/mobile/android/base/gfx/LayerView.java index 380c2edc220..1bc84abcf84 100644 --- a/mobile/android/base/gfx/LayerView.java +++ b/mobile/android/base/gfx/LayerView.java @@ -47,6 +47,7 @@ public class LayerView extends FrameLayout { private GeckoLayerClient mLayerClient; private PanZoomController mPanZoomController; + private LayerMarginsAnimator mMarginsAnimator; private GLController mGLController; private InputConnectionHandler mInputConnectionHandler; private LayerRenderer mRenderer; @@ -100,6 +101,7 @@ public class LayerView extends FrameLayout { public void initializeView(EventDispatcher eventDispatcher) { mLayerClient = new GeckoLayerClient(getContext(), this, eventDispatcher); mPanZoomController = mLayerClient.getPanZoomController(); + mMarginsAnimator = mLayerClient.getLayerMarginsAnimator(); mRenderer = new LayerRenderer(this); mInputConnectionHandler = null; @@ -207,6 +209,7 @@ public class LayerView extends FrameLayout { public GeckoLayerClient getLayerClient() { return mLayerClient; } public PanZoomController getPanZoomController() { return mPanZoomController; } + public LayerMarginsAnimator getLayerMarginsAnimator() { return mMarginsAnimator; } public ImmutableViewportMetrics getViewportMetrics() { return mLayerClient.getViewportMetrics(); @@ -236,6 +239,10 @@ public class LayerView extends FrameLayout { mLayerClient.setZoomConstraints(constraints); } + public void setIsRTL(boolean aIsRTL) { + mLayerClient.setIsRTL(aIsRTL); + } + public void setInputConnectionHandler(InputConnectionHandler inputConnectionHandler) { mInputConnectionHandler = inputConnectionHandler; mLayerClient.forceRedraw(); diff --git a/mobile/android/base/gfx/NinePatchTileLayer.java b/mobile/android/base/gfx/NinePatchTileLayer.java index 2af7ed90714..0fa4713351b 100644 --- a/mobile/android/base/gfx/NinePatchTileLayer.java +++ b/mobile/android/base/gfx/NinePatchTileLayer.java @@ -75,8 +75,8 @@ public class NinePatchTileLayer extends TileLayer { float tileX, float tileY, float tileWidth, float tileHeight) { RectF viewport = context.viewport; float viewportHeight = viewport.height(); - float drawX = tileX - viewport.left; - float drawY = viewportHeight - (tileY + tileHeight - viewport.top); + float drawX = tileX - viewport.left - context.offset.x; + float drawY = viewportHeight - (tileY + tileHeight - viewport.top) - context.offset.y; float[] coords = { //x, y, z, texture_x, texture_y diff --git a/mobile/android/base/gfx/PanZoomTarget.java b/mobile/android/base/gfx/PanZoomTarget.java index 724f6445eed..8a82266c101 100644 --- a/mobile/android/base/gfx/PanZoomTarget.java +++ b/mobile/android/base/gfx/PanZoomTarget.java @@ -16,6 +16,8 @@ public interface PanZoomTarget { public void setAnimationTarget(ImmutableViewportMetrics viewport); public void setViewportMetrics(ImmutableViewportMetrics viewport); + public void scrollBy(float dx, float dy); + public void panZoomStopped(); /** This triggers an (asynchronous) viewport update/redraw. */ public void forceRedraw(); diff --git a/mobile/android/base/gfx/ScrollbarLayer.java b/mobile/android/base/gfx/ScrollbarLayer.java index 026b6125d23..a027b92608e 100644 --- a/mobile/android/base/gfx/ScrollbarLayer.java +++ b/mobile/android/base/gfx/ScrollbarLayer.java @@ -188,6 +188,7 @@ public class ScrollbarLayer extends TileLayer { float viewHeight = context.viewport.height(); mBarRectF.set(mBarRect.left, viewHeight - mBarRect.top, mBarRect.right, viewHeight - mBarRect.bottom); + mBarRectF.offset(context.offset.x, -context.offset.y); // We take a 1-pixel slice from the center of the image and scale it to become the bar fillRectCoordBuffer(mCoords, mBarRectF, viewWidth, viewHeight, mBodyTexCoords, mTexWidth, mTexHeight); diff --git a/mobile/android/base/gfx/ViewTransform.java b/mobile/android/base/gfx/ViewTransform.java index f1ac3109f14..d9ec6252882 100644 --- a/mobile/android/base/gfx/ViewTransform.java +++ b/mobile/android/base/gfx/ViewTransform.java @@ -13,6 +13,8 @@ public class ViewTransform { public float fixedLayerMarginTop; public float fixedLayerMarginRight; public float fixedLayerMarginBottom; + public float offsetX; + public float offsetY; public ViewTransform(float inX, float inY, float inScale) { x = inX; @@ -22,6 +24,8 @@ public class ViewTransform { fixedLayerMarginTop = 0; fixedLayerMarginRight = 0; fixedLayerMarginBottom = 0; + offsetX = 0; + offsetY = 0; } } diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 14610db4eb7..0fea188cc52 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -3462,6 +3462,8 @@ Tab.prototype = { if (aMetadata.maxZoom > 0) aMetadata.maxZoom *= scaleRatio; + aMetadata.isRTL = this.browser.contentDocument.documentElement.dir == "rtl"; + ViewportHandler.setMetadataForDocument(this.browser.contentDocument, aMetadata); this.updateViewportSize(gScreenWidth, aInitialLoad); this.sendViewportMetadata(); @@ -3590,6 +3592,7 @@ Tab.prototype = { defaultZoom: metadata.defaultZoom || metadata.scaleRatio, minZoom: metadata.minZoom || 0, maxZoom: metadata.maxZoom || 0, + isRTL: metadata.isRTL, tabID: this.id }); }, @@ -5111,6 +5114,8 @@ var ViewportHandler = { (!widthStr && (heightStr == "device-height" || scale == 1.0))); } + let isRTL = aWindow.document.documentElement.dir == "rtl"; + return new ViewportMetadata({ defaultZoom: scale, minZoom: minScale, @@ -5119,7 +5124,8 @@ var ViewportHandler = { height: height, autoSize: autoSize, allowZoom: allowZoom, - isSpecified: hasMetaViewport + isSpecified: hasMetaViewport, + isRTL: isRTL }); }, @@ -5191,6 +5197,7 @@ function ViewportMetadata(aMetadata = {}) { this.allowZoom = ("allowZoom" in aMetadata) ? aMetadata.allowZoom : true; this.isSpecified = ("isSpecified" in aMetadata) ? aMetadata.isSpecified : false; this.scaleRatio = ViewportHandler.getScaleRatio(); + this.isRTL = ("isRTL" in aMetadata) ? aMetadata.isRTL : false; Object.seal(this); } @@ -5204,6 +5211,7 @@ ViewportMetadata.prototype = { allowZoom: null, isSpecified: null, scaleRatio: null, + isRTL: null, }; diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index ded1e35a4c9..b64579acc0b 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -2109,14 +2109,15 @@ AndroidBridge::SetPageRect(const gfx::Rect& aCssPageRect) void AndroidBridge::SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, - gfx::Margin& aFixedLayerMargins) + gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY) { AndroidGeckoLayerClient *client = mLayerClient; if (!client) return; client->SyncViewportInfo(aDisplayPort, aDisplayResolution, aLayersUpdated, - aScrollOffset, aScaleX, aScaleY, aFixedLayerMargins); + aScrollOffset, aScaleX, aScaleY, aFixedLayerMargins, + aOffsetX, aOffsetY); } AndroidBridge::AndroidBridge() diff --git a/widget/android/AndroidBridge.h b/widget/android/AndroidBridge.h index 2db4bf4027c..45d8210845d 100644 --- a/widget/android/AndroidBridge.h +++ b/widget/android/AndroidBridge.h @@ -342,7 +342,7 @@ public: void SetPageRect(const gfx::Rect& aCssPageRect); void SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, - gfx::Margin& aFixedLayerMargins); + gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); void AddPluginView(jobject view, const gfxRect& rect, bool isFullScreen); void RemovePluginView(jobject view, bool isFullScreen); diff --git a/widget/android/AndroidJavaWrappers.cpp b/widget/android/AndroidJavaWrappers.cpp index 3bbb46c00e3..14b8397ad15 100644 --- a/widget/android/AndroidJavaWrappers.cpp +++ b/widget/android/AndroidJavaWrappers.cpp @@ -112,6 +112,8 @@ jfieldID AndroidViewTransform::jFixedLayerMarginLeft = 0; jfieldID AndroidViewTransform::jFixedLayerMarginTop = 0; jfieldID AndroidViewTransform::jFixedLayerMarginRight = 0; jfieldID AndroidViewTransform::jFixedLayerMarginBottom = 0; +jfieldID AndroidViewTransform::jOffsetXField = 0; +jfieldID AndroidViewTransform::jOffsetYField = 0; jclass AndroidProgressiveUpdateData::jProgressiveUpdateDataClass = 0; jfieldID AndroidProgressiveUpdateData::jXField = 0; @@ -389,6 +391,8 @@ AndroidViewTransform::InitViewTransformClass(JNIEnv *jEnv) jFixedLayerMarginTop = getField("fixedLayerMarginTop", "F"); jFixedLayerMarginRight = getField("fixedLayerMarginRight", "F"); jFixedLayerMarginBottom = getField("fixedLayerMarginBottom", "F"); + jOffsetXField = getField("offsetX", "F"); + jOffsetYField = getField("offsetY", "F"); } void @@ -824,7 +828,7 @@ AndroidGeckoLayerClient::SetPageRect(const gfx::Rect& aCssPageRect) void AndroidGeckoLayerClient::SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, - gfx::Margin& aFixedLayerMargins) + gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY) { NS_ASSERTION(!isNull(), "SyncViewportInfo called on null layer client!"); JNIEnv *env = GetJNIForThread(); // this is called on the compositor thread @@ -848,6 +852,9 @@ AndroidGeckoLayerClient::SyncViewportInfo(const nsIntRect& aDisplayPort, float a aScrollOffset = nsIntPoint(viewTransform.GetX(env), viewTransform.GetY(env)); aScaleX = aScaleY = viewTransform.GetScale(env); viewTransform.GetFixedLayerMargins(env, aFixedLayerMargins); + + aOffsetX = viewTransform.GetOffsetX(env); + aOffsetY = viewTransform.GetOffsetY(env); } bool @@ -1094,6 +1101,22 @@ AndroidViewTransform::GetFixedLayerMargins(JNIEnv *env, gfx::Margin &aFixedLayer aFixedLayerMargins.left = env->GetFloatField(wrapped_obj, jFixedLayerMarginLeft); } +float +AndroidViewTransform::GetOffsetX(JNIEnv *env) +{ + if (!env) + return 0.0f; + return env->GetFloatField(wrapped_obj, jOffsetXField); +} + +float +AndroidViewTransform::GetOffsetY(JNIEnv *env) +{ + if (!env) + return 0.0f; + return env->GetFloatField(wrapped_obj, jOffsetYField); +} + float AndroidProgressiveUpdateData::GetX(JNIEnv *env) { diff --git a/widget/android/AndroidJavaWrappers.h b/widget/android/AndroidJavaWrappers.h index 379df88b594..f83fb2aa992 100644 --- a/widget/android/AndroidJavaWrappers.h +++ b/widget/android/AndroidJavaWrappers.h @@ -195,6 +195,8 @@ public: float GetY(JNIEnv *env); float GetScale(JNIEnv *env); void GetFixedLayerMargins(JNIEnv *env, gfx::Margin &aFixedLayerMargins); + float GetOffsetX(JNIEnv *env); + float GetOffsetY(JNIEnv *env); private: static jclass jViewTransformClass; @@ -205,6 +207,8 @@ private: static jfieldID jFixedLayerMarginTop; static jfieldID jFixedLayerMarginRight; static jfieldID jFixedLayerMarginBottom; + static jfieldID jOffsetXField; + static jfieldID jOffsetYField; }; class AndroidProgressiveUpdateData : public WrappedJavaObject { @@ -266,7 +270,7 @@ public: void SetPageRect(const gfx::Rect& aCssPageRect); void SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, - gfx::Margin& aFixedLayerMargins); + gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); bool ProgressiveUpdateCallback(bool aHasPendingNewThebesContent, const gfx::Rect& aDisplayPort, float aDisplayResolution, bool aDrawingCritical, gfx::Rect& aViewport, float& aScaleX, float& aScaleY); bool CreateFrame(AutoLocalJNIFrame *jniFrame, AndroidLayerRendererFrame& aFrame); bool ActivateProgram(AutoLocalJNIFrame *jniFrame); From c8264eae8de342fd168d08d734189535eb5fcc95 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Fri, 26 Apr 2013 09:05:34 +1000 Subject: [PATCH 048/155] Bug 864000 - Document nsSVGTextFrame2::mPositioningDirty better. (DONTBUILD) rs=jwatt --- layout/svg/nsSVGTextFrame2.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/layout/svg/nsSVGTextFrame2.h b/layout/svg/nsSVGTextFrame2.h index 2c4243281ab..d4f02c79479 100644 --- a/layout/svg/nsSVGTextFrame2.h +++ b/layout/svg/nsSVGTextFrame2.h @@ -628,7 +628,14 @@ private: uint32_t mGetCanvasTMForFlag; /** - * Whether something has changed to invalidate the values in mPositions. + * The NS_FRAME_IS_DIRTY and NS_FRAME_HAS_DIRTY_CHILDREN bits indicate + * that our anonymous block child needs to be reflowed, and that mPositions + * will likely need to be updated as a consequence. These are set, for + * example, when the font-family changes. Sometimes we only need to + * update mPositions though. For example if the x/y attributes change. + * mPositioningDirty is used to indicate this latter "things are dirty" case + * to allow us to avoid reflowing the anonymous block when it is not + * necessary. */ bool mPositioningDirty; }; From 8ceca5da687d7e9250cf5ffc5005274e2c273367 Mon Sep 17 00:00:00 2001 From: Geoff Brown Date: Thu, 25 Apr 2013 17:10:42 -0600 Subject: [PATCH 049/155] Bug 864803 - sutAgent: do not destroy process if it has ended already; r=jmaher DONTBUILD --- build/mobile/sutagent/android/RedirOutputThread.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/mobile/sutagent/android/RedirOutputThread.java b/build/mobile/sutagent/android/RedirOutputThread.java index 1e986877498..a70bcddf6c3 100755 --- a/build/mobile/sutagent/android/RedirOutputThread.java +++ b/build/mobile/sutagent/android/RedirOutputThread.java @@ -136,7 +136,7 @@ public class RedirOutputThread extends Thread } } - // wait for process to end, if it has not already, then destroy it + // wait for process to end; if it has not already ended, then destroy it try { pProc.waitFor(); @@ -144,8 +144,8 @@ public class RedirOutputThread extends Thread catch (InterruptedException e) { e.printStackTrace(); + pProc.destroy(); } - pProc.destroy(); buffer = null; System.gc(); } From b33c5dffaf11f28dd6f5884a57549dc66e6ac47f Mon Sep 17 00:00:00 2001 From: Ian Stakenvicius Date: Tue, 23 Apr 2013 15:45:04 -0700 Subject: [PATCH 050/155] Bug 812265, Part 1/4 - Remove JS_VERSION. r=dmandelin --- js/src/Makefile.in | 4 -- js/src/jspubtd.h | 6 +- js/src/jsversion.h | 131 ++++---------------------------------------- js/src/shell/js.cpp | 6 +- 4 files changed, 14 insertions(+), 133 deletions(-) diff --git a/js/src/Makefile.in b/js/src/Makefile.in index a4f093aa40c..a3f62bea789 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -640,10 +640,6 @@ DEFINES += -DJS_HAS_CTYPES DEFINES += -DDLL_PREFIX=\"$(DLL_PREFIX)\" -DDLL_SUFFIX=\"$(DLL_SUFFIX)\" endif -ifdef JS_VERSION -DEFINES += -DJS_VERSION=$(JS_VERSION) -endif - ifneq ($(findstring -L,$(NSPR_LIBS)),) NSPR_STATIC_PATH = $(subst -L,,$(findstring -L,$(NSPR_LIBS))) else diff --git a/js/src/jspubtd.h b/js/src/jspubtd.h index c9e4eacad75..def35206d89 100644 --- a/js/src/jspubtd.h +++ b/js/src/jspubtd.h @@ -69,9 +69,9 @@ typedef uint16_t jschar; #endif /* - * Run-time version enumeration. See jsversion.h for compile-time counterparts - * to these values that may be selected by the JS_VERSION macro, and tested by - * #if expressions. + * Run-time version enumeration. For compile-time version checking, please use + * the JS_HAS_* macros in jsversion.h, or use MOZJS_MAJOR_VERSION, + * MOZJS_MINOR_VERSION, MOZJS_PATCH_VERSION, and MOZJS_ALPHA definitions. */ typedef enum JSVersion { JSVERSION_ECMA_3 = 148, diff --git a/js/src/jsversion.h b/js/src/jsversion.h index 64f2ad21767..5958c165b78 100644 --- a/js/src/jsversion.h +++ b/js/src/jsversion.h @@ -8,126 +8,21 @@ #define jsversion_h___ /* - * JS configuration macros. + * Deprecated JS_VERSION handler. */ -#ifndef JS_VERSION -#define JS_VERSION 185 +#ifdef JS_VERSION +# if JS_VERSION == 185 +# warning "JS_VERSION defined but unsupported (legacy)" +# elif JS_VERSION < 185 +# error "Unsupported JS_VERSION" +# else +# error "Unknown JS_VERSION" +# endif #endif /* - * Compile-time JS version configuration. The JS version numbers lie on the - * number line like so: - * - * 1.0 1.1 1.2 1.3 1.4 ECMAv3 1.5 1.6 1.7 1.8 ECMAv5 - * ^ ^ - * | | - * basis for ECMAv1 close to ECMAv2 - * - * where ECMAv3 stands for ECMA-262 Edition 3, and ECMAv5 stands for Edition 5. - * See the runtime version enum JSVersion in jspubtd.h. Code in the engine can - * therefore count on version <= JSVERSION_1_4 to mean "before the Third - * Edition of ECMA-262" and version > JSVERSION_1_4 to mean "at or after the - * Third Edition". - * - * In the (likely?) event that SpiderMonkey grows to implement JavaScript 2.0, - * the version number to use would be near 200, or greater. - * - * The JS_VERSION_ECMA_3 version is the minimal configuration conforming to - * the ECMA-262 Edition 3 specification. Use it for minimal embeddings, where - * you're sure you don't need any of the extensions disabled in this version. - * In order to facilitate testing, JS_HAS_OBJ_PROTO_PROP is defined as part of - * the JS_VERSION_ECMA_3_TEST version. - * - * To keep things sane in the modern age, where we need exceptions in order to - * implement, e.g., iterators and generators, we are dropping support for all - * versions <= 1.4. + * JS Capability Macros. */ -#define JS_VERSION_ECMA_3 148 -#define JS_VERSION_ECMA_3_TEST 149 - -#if JS_VERSION == JS_VERSION_ECMA_3 || \ - JS_VERSION == JS_VERSION_ECMA_3_TEST - -#define JS_HAS_STR_HTML_HELPERS 0 /* has str.anchor, str.bold, etc. */ -#if JS_VERSION == JS_VERSION_ECMA_3_TEST -#define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ -#else -#define JS_HAS_OBJ_PROTO_PROP 0 /* has o.__proto__ etc. */ -#endif -#define JS_HAS_OBJ_WATCHPOINT 0 /* has o.watch and o.unwatch */ -#define JS_HAS_TOSOURCE 0 /* has Object/Array toSource method */ -#define JS_HAS_CATCH_GUARD 0 /* has exception handling catch guard */ -#define JS_HAS_UNEVAL 0 /* has uneval() top-level function */ -#define JS_HAS_CONST 0 /* has JS2 const as alternative var */ -#define JS_HAS_FUN_EXPR_STMT 0 /* has function expression statement */ -#define JS_HAS_NO_SUCH_METHOD 0 /* has o.__noSuchMethod__ handler */ -#define JS_HAS_FOR_EACH_IN 0 /* has for each (lhs in iterable) */ -#define JS_HAS_GENERATORS 0 /* has yield in generator function */ -#define JS_HAS_BLOCK_SCOPE 0 /* has block scope via let/arraycomp */ -#define JS_HAS_DESTRUCTURING 0 /* has [a,b] = ... or {p:a,q:b} = ... */ -#define JS_HAS_GENERATOR_EXPRS 0 /* has (expr for (lhs in iterable)) */ -#define JS_HAS_EXPR_CLOSURES 0 /* has function (formals) listexpr */ - -#elif JS_VERSION < 150 - -#error "unsupported JS_VERSION" - -#elif JS_VERSION == 150 - -#define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. */ -#define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ -#define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ -#define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method */ -#define JS_HAS_CATCH_GUARD 1 /* has exception handling catch guard */ -#define JS_HAS_UNEVAL 1 /* has uneval() top-level function */ -#define JS_HAS_CONST 1 /* has JS2 const as alternative var */ -#define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statement */ -#define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler */ -#define JS_HAS_FOR_EACH_IN 0 /* has for each (lhs in iterable) */ -#define JS_HAS_GENERATORS 0 /* has yield in generator function */ -#define JS_HAS_BLOCK_SCOPE 0 /* has block scope via let/arraycomp */ -#define JS_HAS_DESTRUCTURING 0 /* has [a,b] = ... or {p:a,q:b} = ... */ -#define JS_HAS_GENERATOR_EXPRS 0 /* has (expr for (lhs in iterable)) */ -#define JS_HAS_EXPR_CLOSURES 0 /* has function (formals) listexpr */ - -#elif JS_VERSION == 160 - -#define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. */ -#define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ -#define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ -#define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method */ -#define JS_HAS_CATCH_GUARD 1 /* has exception handling catch guard */ -#define JS_HAS_UNEVAL 1 /* has uneval() top-level function */ -#define JS_HAS_CONST 1 /* has JS2 const as alternative var */ -#define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statement */ -#define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler */ -#define JS_HAS_FOR_EACH_IN 1 /* has for each (lhs in iterable) */ -#define JS_HAS_GENERATORS 0 /* has yield in generator function */ -#define JS_HAS_BLOCK_SCOPE 0 /* has block scope via let/arraycomp */ -#define JS_HAS_DESTRUCTURING 0 /* has [a,b] = ... or {p:a,q:b} = ... */ -#define JS_HAS_GENERATOR_EXPRS 0 /* has (expr for (lhs in iterable)) */ -#define JS_HAS_EXPR_CLOSURES 0 /* has function (formals) listexpr */ - -#elif JS_VERSION == 170 - -#define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. */ -#define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ -#define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ -#define JS_HAS_TOSOURCE 1 /* has Object/Array toSource method */ -#define JS_HAS_CATCH_GUARD 1 /* has exception handling catch guard */ -#define JS_HAS_UNEVAL 1 /* has uneval() top-level function */ -#define JS_HAS_CONST 1 /* has JS2 const as alternative var */ -#define JS_HAS_FUN_EXPR_STMT 1 /* has function expression statement */ -#define JS_HAS_NO_SUCH_METHOD 1 /* has o.__noSuchMethod__ handler */ -#define JS_HAS_FOR_EACH_IN 1 /* has for each (lhs in iterable) */ -#define JS_HAS_GENERATORS 1 /* has yield in generator function */ -#define JS_HAS_BLOCK_SCOPE 1 /* has block scope via let/arraycomp */ -#define JS_HAS_DESTRUCTURING 1 /* has [a,b] = ... or {p:a,q:b} = ... */ -#define JS_HAS_GENERATOR_EXPRS 0 /* has (expr for (lhs in iterable)) */ -#define JS_HAS_EXPR_CLOSURES 0 /* has function (formals) listexpr */ - -#elif 180 <= JS_VERSION && JS_VERSION <= 185 - #define JS_HAS_STR_HTML_HELPERS 1 /* has str.anchor, str.bold, etc. */ #define JS_HAS_OBJ_PROTO_PROP 1 /* has o.__proto__ etc. */ #define JS_HAS_OBJ_WATCHPOINT 1 /* has o.watch and o.unwatch */ @@ -144,12 +39,6 @@ #define JS_HAS_GENERATOR_EXPRS 1 /* has (expr for (lhs in iterable)) */ #define JS_HAS_EXPR_CLOSURES 1 /* has function (formals) listexpr */ -#else - -#error "unknown JS_VERSION" - -#endif - /* Support for JS_NewGlobalObject. */ #define JS_HAS_NEW_GLOBAL_OBJECT 1 diff --git a/js/src/shell/js.cpp b/js/src/shell/js.cpp index 1031e3c781d..51696aa76a0 100644 --- a/js/src/shell/js.cpp +++ b/js/src/shell/js.cpp @@ -2242,11 +2242,7 @@ static JSBool BuildDate(JSContext *cx, unsigned argc, jsval *vp) { CallArgs args = CallArgsFromVp(argc, vp); - char version[20] = "\n"; -#if JS_VERSION < 150 - sprintf(version, " for version %d\n", JS_VERSION); -#endif - fprintf(gOutFile, "built on %s at %s%s", __DATE__, __TIME__, version); + fprintf(gOutFile, "built on %s at %s\n", __DATE__, __TIME__); args.rval().setUndefined(); return true; } From 6d0071c7f33b250761a12b02dd1d3908d42245e7 Mon Sep 17 00:00:00 2001 From: Tim Lunn Date: Tue, 23 Apr 2013 16:55:13 -0700 Subject: [PATCH 051/155] Bug 812265, Part 2/4 - Setup versioning and pkg-config support. r=glandium --- js/src/Makefile.in | 78 ++++++++++++++++++++++----------------------- js/src/configure.in | 38 ++++++++++++++++++++-- js/src/js-config.in | 4 ++- js/src/js.pc.in | 11 +++++++ js/src/moz.build | 3 ++ 5 files changed, 92 insertions(+), 42 deletions(-) create mode 100644 js/src/js.pc.in diff --git a/js/src/Makefile.in b/js/src/Makefile.in index a3f62bea789..3be9976b576 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -11,9 +11,13 @@ srcdir = @srcdir@ run_for_side_effects := $(shell echo "MAKE: $(MAKE)") include $(DEPTH)/config/autoconf.mk -LIBRARY_NAME = mozjs -STATIC_LIBRARY_NAME = js_static +ifdef JS_STANDALONE +LIBRARY_NAME = mozjs-@MOZJS_MAJOR_VERSION@.@MOZJS_MINOR_VERSION@@MOZJS_ALPHA@ +else +LIBRARY_NAME = mozjs +endif +STATIC_LIBRARY_NAME = js_static LIBS = $(NSPR_LIBS) # JavaScript must be built shared, even for static builds, as it is used by @@ -761,24 +765,40 @@ JS_CONFIG_LIBS=$(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) # avoid trying to re-compute all that in the configure script, we just # have the configure script generate this Makefile, and then invoke # this rule. -at=@ + +# Set the various definitions that will be substituted for js-config +# and for the pck-config .pc file. +JS_CONFIG_SUBSTITUTIONS=\ + -Dprefix="$(prefix)" \ + -Dexec_prefix="$(exec_prefix)" \ + -Dincludedir="$(includedir)" \ + -Dlibdir="$(libdir)" \ + -DMODULE="$(MODULE)" \ + -DMOZILLA_VERSION="$(MOZILLA_VERSION)" \ + -DLIBRARY_NAME="$(LIBRARY_NAME)" \ + -DJS_CONFIG_LIBS="$(JS_CONFIG_LIBS)" \ + -DMOZ_JS_LIBS="$(MOZ_JS_LIBS)" \ + -DMOZJS_MAJOR_VERSION="$(MOZJS_MAJOR_VERSION)" \ + -DMOZJS_MINOR_VERSION="$(MOZJS_MINOR_VERSION)" \ + -DMOZJS_PATCH_VERSION="$(MOZJS_PATCH_VERSION)" \ + -DMOZJS_ALPHA="$(MOZJS_ALPHA)" \ + -DNSPR_CFLAGS="$(NSPR_CFLAGS)" \ + -DNSPR_PKGCONF_CHECK="$(NSPR_PKGCONF_CHECK)" + js-config: js-config.in Makefile $(DEPTH)/config/autoconf.mk $(topsrcdir)/config/config.mk $(topsrcdir)/config/rules.mk - $(RM) js-config.tmp - sed < $< > js-config.tmp \ - -e 's|$(at)prefix$(at)|$(prefix)|' \ - -e 's|$(at)exec_prefix$(at)|$(exec_prefix)|' \ - -e 's|$(at)includedir$(at)|$(includedir)|' \ - -e 's|$(at)libdir$(at)|$(libdir)|' \ - -e 's|$(at)MOZILLA_VERSION$(at)|$(MOZILLA_VERSION)|' \ - -e 's|$(at)LIBRARY_NAME$(at)|$(LIBRARY_NAME)|' \ - -e 's|$(at)NSPR_CFLAGS$(at)|$(NSPR_CFLAGS)|' \ - -e 's|$(at)JS_CONFIG_LIBS$(at)|$(JS_CONFIG_LIBS)|' \ - -e 's|$(at)MOZ_JS_LIBS$(at)|$(MOZ_JS_LIBS)|' \ - && mv js-config.tmp $@ && chmod +x $@ + $(RM) $@.tmp + $(PYTHON) $(topsrcdir)/config/Preprocessor.py --marker % $(JS_CONFIG_SUBSTITUTIONS) $< > $@.tmp \ + && mv $@.tmp $@ && chmod +x $@ SCRIPTS = js-config SDK_BINARY = js-config +$(LIBRARY_NAME).pc: js.pc.in + $(PYTHON) $(topsrcdir)/config/Preprocessor.py $(JS_CONFIG_SUBSTITUTIONS) $< > $@ + +install:: $(LIBRARY_NAME).pc + $(SYSINSTALL) $^ $(DESTDIR)$(libdir)/pkgconfig + ###################################################### # BEGIN SpiderMonkey header installation # @@ -802,27 +822,6 @@ SDK_BINARY = js-config # mozilla/ # mfbt headers # -# Currently $(MODULE) is just js, but we'll soon be changing it to include the -# SpiderMonkey version, so that headers for multiple SpiderMonkey installs can -# exist on a system at once. (This permits embedders depending on system -# SpiderMonkey to independently update their embeddings to newer SpiderMonkey -# releases at different paces.) -# -# It is expected that embedders will then add -I$(includedir)/$(MODULE) to -# their compiler invocations, which will then expose all of jsapi.h and friends -# as they've always been exported. (This will happen naturally for anyone using -# pkgconfig systems to determine compiler/linker flags and the like.) Headers -# in subdirectories will show up as "mozilla/Assertions.h" and so on. Also, -# this system keeps #include "js/CharacterEncoding.h" in internal headers -# working -- not that this is required, but it does simplify things. (At some -# point we may want to convert SpiderMonkey, and maybe Gecko, to this system, in -# the interest of being a more conventional embedder, but it's probably a ways -# off.) -# -# Eventually we'll probably trim this structure down to having the mfbt headers -# in mozilla/, and every SpiderMonkey-specific header in js/*. In the meantime -# this is the structure implemented below. -# install:: $(EXPORTS) $(SYSINSTALL) $^ $(DESTDIR)$(includedir)/$(MODULE) @@ -840,9 +839,10 @@ install:: $(EXPORTS_mozilla) install:: $(SCRIPTS) $(SYSINSTALL) $^ $(DESTDIR)$(bindir) -install:: $(LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY) -ifneq (,$(LIBRARY)) - $(SYSINSTALL) $(LIBRARY) $(DESTDIR)$(libdir) +install:: $(REAL_LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY) +ifneq (,$(REAL_LIBRARY)) + $(SYSINSTALL) $(REAL_LIBRARY) $(DESTDIR)$(libdir) + mv -f $(DESTDIR)$(libdir)/$(REAL_LIBRARY) $(subst $(STATIC_LIBRARY_NAME),$(LIBRARY_NAME),$(DESTDIR)$(libdir)/$(REAL_LIBRARY)) endif ifneq (,$(SHARED_LIBRARY)) $(SYSINSTALL) $(SHARED_LIBRARY) $(DESTDIR)$(libdir) diff --git a/js/src/configure.in b/js/src/configure.in index 3ec29c04489..c6044df0708 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -51,6 +51,7 @@ _SUBDIR_CONFIG_ARGS="$ac_configure_args" dnl Set the version number of the libs included with mozilla dnl ======================================================== NSPR_VERSION=4 +NSPR_MINVER=4.9.2 dnl Set the minimum version of toolkit libs used by mozilla dnl ======================================================== @@ -216,6 +217,35 @@ else MOZ_ANDROID_NDK fi +dnl ============================================================== +dnl Get mozilla version from central milestone file +dnl ============================================================== +MOZILLA_VERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir` +MOZILLA_UAVERSION=`$PERL $srcdir/config/milestone.pl -topsrcdir $srcdir -uaversion` + +AC_DEFINE_UNQUOTED(MOZILLA_VERSION,"$MOZILLA_VERSION") +AC_DEFINE_UNQUOTED(MOZILLA_VERSION_U,$MOZILLA_VERSION) +AC_DEFINE_UNQUOTED(MOZILLA_UAVERSION,"$MOZILLA_UAVERSION") + +# Separate version into components for use in shared object naming etc +changequote(,) +MOZJS_MAJOR_VERSION=`echo $MOZILLA_VERSION | sed "s|\(^[0-9]*\)\.[0-9]*.*|\1|"` +MOZJS_MINOR_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.\([0-9]*\).*|\1|"` +MOZJS_PATCH_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.[0-9]*[^0-9]*||"` +IS_ALPHA=`echo $MOZILLA_VERSION | grep [ab]` +changequote([,]) +if test -n "$IS_ALPHA"; then + changequote(,) + MOZJS_ALPHA=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.[0-9\.]*\([^0-9]\).*|\1|"` + changequote([,]) +fi +AC_DEFINE_UNQUOTED(MOZJS_MAJOR_VERSION,"$MOZJS_MAJOR_VERSION") +AC_DEFINE_UNQUOTED(MOZJS_MINOR_VERSION,"$MOZJS_MINOR_VERSION") +AC_SUBST(MOZJS_MAJOR_VERSION) +AC_SUBST(MOZJS_MINOR_VERSION) +AC_SUBST(MOZJS_PATCH_VERSION) +AC_SUBST(MOZJS_ALPHA) + dnl ======================================================== dnl Checks for compilers. dnl ======================================================== @@ -3139,13 +3169,16 @@ if test "$_USE_SYSTEM_NSPR" && (test "$NSPR_CFLAGS" -o "$NSPR_LIBS"); then See 'configure --help'.]) fi -dnl Top-level Mozilla switched to requiring NSPR 4.8.6 (bug 560582), but we don't need it in JS. if test -n "$_USE_SYSTEM_NSPR"; then MOZ_NATIVE_NSPR= - AM_PATH_NSPR(4.9.2, [MOZ_NATIVE_NSPR=1], [AC_MSG_ERROR([your don't have NSPR installed or your version is too old])]) + AM_PATH_NSPR($NSPR_MINVER, [MOZ_NATIVE_NSPR=1], [AC_MSG_ERROR([your don't have NSPR installed or your version is too old])]) fi +NSPR_PKGCONF_CHECK="nspr" if test -n "$MOZ_NATIVE_NSPR"; then + # piggy back on $MOZ_NATIVE_NSPR to set a variable for the nspr check for js.pc + NSPR_PKGCONF_CHECK="nspr >= $NSPR_MINVER" + _SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS $NSPR_CFLAGS" AC_TRY_COMPILE([#include "prlog.h"], @@ -3156,6 +3189,7 @@ if test -n "$MOZ_NATIVE_NSPR"; then AC_MSG_ERROR([system NSPR does not support PR_STATIC_ASSERT])) CFLAGS=$_SAVE_CFLAGS fi +AC_SUBST(NSPR_PKGCONF_CHECK) dnl ======================================================== dnl system zlib Support diff --git a/js/src/js-config.in b/js/src/js-config.in index 419a7731b6b..afe1c94baf0 100644 --- a/js/src/js-config.in +++ b/js/src/js-config.in @@ -1,3 +1,4 @@ +%filter substitution #!/bin/sh # 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 @@ -5,6 +6,7 @@ prefix='@prefix@' mozilla_version='@MOZILLA_VERSION@' +MODULE='@MODULE@' LIBRARY_NAME='@LIBRARY_NAME@' NSPR_CFLAGS='@NSPR_CFLAGS@' JS_CONFIG_LIBS='@JS_CONFIG_LIBS@' @@ -106,7 +108,7 @@ if test "$echo_libdir" = "yes"; then fi if test "$echo_cflags" = "yes"; then - echo "-I$includedir/js $NSPR_CFLAGS" + echo "-include $includedir/$MODULE/js/RequiredDefines.h -I$includedir/$MODULE $NSPR_CFLAGS" fi if test "$echo_libs" = "yes"; then diff --git a/js/src/js.pc.in b/js/src/js.pc.in new file mode 100644 index 00000000000..13d761d5733 --- /dev/null +++ b/js/src/js.pc.in @@ -0,0 +1,11 @@ +#filter substitution +prefix=@prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: SpiderMonkey @MOZILLA_VERSION@ +Description: The Mozilla library for JavaScript +Version: @MOZILLA_VERSION@ +Requires.private: @NSPR_PKGCONF_CHECK@ +Libs: -L${libdir} -l@LIBRARY_NAME@ +Cflags: -include ${includedir}/@MODULE@/js/RequiredDefines.h -I${includedir}/@MODULE@ diff --git a/js/src/moz.build b/js/src/moz.build index 557d5528797..115a3728ad7 100644 --- a/js/src/moz.build +++ b/js/src/moz.build @@ -23,6 +23,9 @@ if CONFIG['OS_ARCH'] != 'ANDROID': TEST_DIRS += ['tests', 'gdb'] MODULE = 'js' +if CONFIG['JS_STANDALONE']: + MODULE = 'js-%s.%s%s' % (CONFIG['MOZJS_MAJOR_VERSION'], CONFIG['MOZJS_MINOR_VERSION'], + CONFIG['MOZJS_ALPHA']) CONFIGURE_SUBST_FILES += ['devtools/rootAnalysis/Makefile'] From b057c4a2cf872eac6d39e61598c5d5358be4358c Mon Sep 17 00:00:00 2001 From: Tim Lunn Date: Tue, 23 Apr 2013 17:05:28 -0700 Subject: [PATCH 052/155] Bug 812265, Part 3/4 - Use version number in filename of shell and js-config. r=glandium --- js/src/Makefile.in | 12 ++++++------ js/src/configure.in | 17 ++++++++++++++--- js/src/js-config.in | 4 +++- js/src/shell/Makefile.in | 2 +- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/js/src/Makefile.in b/js/src/Makefile.in index 3be9976b576..5e3022c6030 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -581,7 +581,7 @@ endif check-jit-test:: $(wildcard $(RUN_TEST_PROGRAM)) $(PYTHON) -u $(srcdir)/jit-test/jit_test.py \ --no-slow --no-progress --tinderbox --tbpl $(JITTEST_VALGRIND_FLAG) \ - $(DIST)/bin/js$(BIN_SUFFIX) + $(DIST)/bin/$(JS_SHELL_NAME)$(BIN_SUFFIX) check:: check-jit-test @@ -598,7 +598,7 @@ check-jstests: --no-extensions \ --timeout 300 \ --args="`echo $$f | sed 's/\(.\)/ -\1/g'`" \ - $(DIST)/bin/js$(BIN_SUFFIX); \ + $(DIST)/bin/$(JS_SHELL_NAME)$(BIN_SUFFIX); \ RC=$$(( $$RC || $$?)); \ done; \ exit $$RC @@ -625,7 +625,7 @@ endif DIST_GARBAGE = config.cache config.log config.status* \ config/autoconf.mk \ - unallmakefiles js-config js-config.h js-confdefs.h + unallmakefiles $(JS_CONFIG_NAME) js-config.h js-confdefs.h distclean:: cat unallmakefiles | $(XARGS) rm -f @@ -785,13 +785,13 @@ JS_CONFIG_SUBSTITUTIONS=\ -DNSPR_CFLAGS="$(NSPR_CFLAGS)" \ -DNSPR_PKGCONF_CHECK="$(NSPR_PKGCONF_CHECK)" -js-config: js-config.in Makefile $(DEPTH)/config/autoconf.mk $(topsrcdir)/config/config.mk $(topsrcdir)/config/rules.mk +$(JS_CONFIG_NAME): js-config.in Makefile $(DEPTH)/config/autoconf.mk $(topsrcdir)/config/config.mk $(topsrcdir)/config/rules.mk $(RM) $@.tmp $(PYTHON) $(topsrcdir)/config/Preprocessor.py --marker % $(JS_CONFIG_SUBSTITUTIONS) $< > $@.tmp \ && mv $@.tmp $@ && chmod +x $@ -SCRIPTS = js-config -SDK_BINARY = js-config +SCRIPTS = $(JS_CONFIG_NAME) +SDK_BINARY = $(JS_CONFIG_NAME) $(LIBRARY_NAME).pc: js.pc.in $(PYTHON) $(topsrcdir)/config/Preprocessor.py $(JS_CONFIG_SUBSTITUTIONS) $< > $@ diff --git a/js/src/configure.in b/js/src/configure.in index c6044df0708..5c67404aab9 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -233,6 +233,15 @@ MOZJS_MAJOR_VERSION=`echo $MOZILLA_VERSION | sed "s|\(^[0-9]*\)\.[0-9]*.*|\1|"` MOZJS_MINOR_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.\([0-9]*\).*|\1|"` MOZJS_PATCH_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.[0-9]*[^0-9]*||"` IS_ALPHA=`echo $MOZILLA_VERSION | grep [ab]` + +if test -n "$JS_STANDALONE"; then +JS_SHELL_NAME=js$MOZJS_MAJOR_VERSION +JS_CONFIG_NAME=js$MOZJS_MAJOR_VERSION-config +else +JS_SHELL_NAME=js +JS_CONFIG_NAME=js-config +fi + changequote([,]) if test -n "$IS_ALPHA"; then changequote(,) @@ -241,6 +250,8 @@ if test -n "$IS_ALPHA"; then fi AC_DEFINE_UNQUOTED(MOZJS_MAJOR_VERSION,"$MOZJS_MAJOR_VERSION") AC_DEFINE_UNQUOTED(MOZJS_MINOR_VERSION,"$MOZJS_MINOR_VERSION") +AC_SUBST(JS_SHELL_NAME) +AC_SUBST(JS_CONFIG_NAME) AC_SUBST(MOZJS_MAJOR_VERSION) AC_SUBST(MOZJS_MINOR_VERSION) AC_SUBST(MOZJS_PATCH_VERSION) @@ -4421,9 +4432,9 @@ dnl ======================================================== AC_OUTPUT([js-confdefs.h Makefile config/autoconf.mk config/emptyvars.mk]) # Produce the js-config script at configure time; see the comments for -# 'js-config' in Makefile.in. -AC_MSG_RESULT(invoking $MAKE to create js-config script) -$MAKE js-config +# 'js*-config' in Makefile.in. +AC_MSG_RESULT(invoking $MAKE to create $JS_CONFIG_NAME script) +$MAKE $JS_CONFIG_NAME # Build jsctypes if it's enabled. if test "$JS_HAS_CTYPES" -a -z "$MOZ_NATIVE_FFI"; then diff --git a/js/src/js-config.in b/js/src/js-config.in index afe1c94baf0..b1b3ad865fd 100644 --- a/js/src/js-config.in +++ b/js/src/js-config.in @@ -12,10 +12,12 @@ NSPR_CFLAGS='@NSPR_CFLAGS@' JS_CONFIG_LIBS='@JS_CONFIG_LIBS@' MOZ_JS_LIBS='@MOZ_JS_LIBS@' +FILENAME=`basename "$0"` + usage() { cat < Date: Tue, 23 Apr 2013 17:21:50 -0700 Subject: [PATCH 053/155] Bug 812265, Part 4/4 - Fix MOZ_JS_LIBS. r=glandium --- js/src/Makefile.in | 7 ++++++- js/src/configure.in | 4 ---- js/src/js-config.in | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/js/src/Makefile.in b/js/src/Makefile.in index 5e3022c6030..38ef8a2a260 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -752,6 +752,11 @@ endif # - OS_LIBS includes libraries selected by the configure script. # - EXTRA_LIBS includes libraries selected by this Makefile. JS_CONFIG_LIBS=$(EXTRA_DSO_LDOPTS) $(OS_LIBS) $(EXTRA_LIBS) +ifdef GNU_CC +JS_CONFIG_MOZ_JS_LIBS=-L$(libdir) -l$(LIBRARY_NAME) +else +JS_CONFIG_MOZ_JS_LIBS=$(libdir)/$(LIBRARY_NAME).lib +endif # The configure script invokes this rule explicitly at configure time! # It's important that js-config be ready by the time we're done @@ -777,7 +782,7 @@ JS_CONFIG_SUBSTITUTIONS=\ -DMOZILLA_VERSION="$(MOZILLA_VERSION)" \ -DLIBRARY_NAME="$(LIBRARY_NAME)" \ -DJS_CONFIG_LIBS="$(JS_CONFIG_LIBS)" \ - -DMOZ_JS_LIBS="$(MOZ_JS_LIBS)" \ + -DJS_CONFIG_MOZ_JS_LIBS="$(JS_CONFIG_MOZ_JS_LIBS)" \ -DMOZJS_MAJOR_VERSION="$(MOZJS_MAJOR_VERSION)" \ -DMOZJS_MINOR_VERSION="$(MOZJS_MINOR_VERSION)" \ -DMOZJS_PATCH_VERSION="$(MOZJS_PATCH_VERSION)" \ diff --git a/js/src/configure.in b/js/src/configure.in index 5c67404aab9..28015de84ae 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -854,7 +854,6 @@ TARGET_MD_ARCH=unix DIRENT_INO=d_ino MOZ_USER_DIR=".mozilla" -MOZ_JS_LIBS='-L$(libdir) -lmozjs' MOZ_FIX_LINK_PATHS='-Wl,-rpath-link,$(LIBXUL_DIST)/bin -Wl,-rpath-link,$(prefix)/lib' MOZ_COMPONENT_NSPR_LIBS='-L$(LIBXUL_DIST)/bin $(NSPR_LIBS)' @@ -1677,7 +1676,6 @@ ia64*-hpux*) RCFLAGS='-O coff --use-temp-file' # mingw doesn't require kernel32, user32, and advapi32 explicitly LIBS="$LIBS -lgdi32 -lwinmm -lwsock32 -lpsapi" - MOZ_JS_LIBS='-L$(libdir) -lmozjs' MOZ_FIX_LINK_PATHS= DYNAMIC_XPCOM_LIBS='-L$(LIBXUL_DIST)/lib -lxpcom -lxpcom_core -lmozalloc' XPCOM_FROZEN_LDOPTS='-L$(LIBXUL_DIST)/lib -lxpcom -lmozalloc' @@ -1735,7 +1733,6 @@ ia64*-hpux*) MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV' WARNINGS_AS_ERRORS='-WX' MOZ_OPTIMIZE_FLAGS="-O2" - MOZ_JS_LIBS='$(libdir)/mozjs.lib' MOZ_FIX_LINK_PATHS= DYNAMIC_XPCOM_LIBS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/xpcom_core.lib $(LIBXUL_DIST)/lib/mozalloc.lib' XPCOM_FROZEN_LDOPTS='$(LIBXUL_DIST)/lib/xpcom.lib $(LIBXUL_DIST)/lib/mozalloc.lib' @@ -4194,7 +4191,6 @@ AC_SUBST(WINDRES) AC_SUBST(IMPLIB) AC_SUBST(FILTER) AC_SUBST(BIN_FLAGS) -AC_SUBST(MOZ_JS_LIBS) AC_SUBST(MOZ_DEBUG) AC_SUBST(MOZ_DEBUG_SYMBOLS) AC_SUBST(MOZ_DEBUG_ENABLE_DEFS) diff --git a/js/src/js-config.in b/js/src/js-config.in index b1b3ad865fd..a43a19af1e3 100644 --- a/js/src/js-config.in +++ b/js/src/js-config.in @@ -10,7 +10,7 @@ MODULE='@MODULE@' LIBRARY_NAME='@LIBRARY_NAME@' NSPR_CFLAGS='@NSPR_CFLAGS@' JS_CONFIG_LIBS='@JS_CONFIG_LIBS@' -MOZ_JS_LIBS='@MOZ_JS_LIBS@' +MOZ_JS_LIBS='@JS_CONFIG_MOZ_JS_LIBS@' FILENAME=`basename "$0"` From b2627b0608d4ed56031376e5728d417c6beb98a2 Mon Sep 17 00:00:00 2001 From: Ian Stakenvicius Date: Thu, 25 Apr 2013 15:35:40 -0700 Subject: [PATCH 054/155] Bug 809430 - Add symbol versions. r=glandium --- js/src/Makefile.in | 12 ++++++++++++ js/src/symverscript.in | 4 ++++ toolkit/library/Makefile.in | 7 +++++++ toolkit/library/symverscript.in | 4 ++++ 4 files changed, 27 insertions(+) create mode 100644 js/src/symverscript.in create mode 100644 toolkit/library/symverscript.in diff --git a/js/src/Makefile.in b/js/src/Makefile.in index 38ef8a2a260..fe7a2619c76 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -530,6 +530,18 @@ config/nsinstall$(HOST_BIN_SUFFIX): $(srcdir)/config/nsinstall.c $(srcdir)/confi $(MAKE) -C config/ nsinstall$(HOST_BIN_SUFFIX) endif +# Ensure symbol versions of shared library on Linux do not conflict +# with those in libxul. +ifeq (Linux,$(OS_TARGET)) +EXTRA_DSO_LDOPTS += -Wl,-version-script,symverscript + +symverscript: symverscript.in + $(PYTHON) $(topsrcdir)/config/Preprocessor.py \ + -DVERSION="$(subst -,_,$(LIBRARY_NAME))" $< > $@ + +EXTRA_DEPS += symverscript +endif + include $(topsrcdir)/config/rules.mk ifdef JS_HAS_CTYPES diff --git a/js/src/symverscript.in b/js/src/symverscript.in new file mode 100644 index 00000000000..ef70826ad4e --- /dev/null +++ b/js/src/symverscript.in @@ -0,0 +1,4 @@ +#filter substitution +@VERSION@ { + global: *; +}; diff --git a/toolkit/library/Makefile.in b/toolkit/library/Makefile.in index e961884e509..52db9a6b0ea 100644 --- a/toolkit/library/Makefile.in +++ b/toolkit/library/Makefile.in @@ -129,6 +129,13 @@ endif ifeq (Linux,$(OS_ARCH)) ifneq (Android,$(OS_TARGET)) OS_LIBS += -lrt +EXTRA_DSO_LDOPTS += -Wl,-version-script,symverscript + +symverscript: symverscript.in + $(PYTHON) $(topsrcdir)/config/Preprocessor.py \ + -DVERSION="$(LIBRARY_NAME)$(MOZILLA_VERSION)" $< > $@ + +EXTRA_DEPS += symverscript endif endif diff --git a/toolkit/library/symverscript.in b/toolkit/library/symverscript.in new file mode 100644 index 00000000000..ef70826ad4e --- /dev/null +++ b/toolkit/library/symverscript.in @@ -0,0 +1,4 @@ +#filter substitution +@VERSION@ { + global: *; +}; From b9de24c5a06c9ba37f86c50d8035bf3549784580 Mon Sep 17 00:00:00 2001 From: Landry Breuil Date: Thu, 25 Apr 2013 16:18:03 -0700 Subject: [PATCH 055/155] Bug 618485 - Add jsuword view to jsval_layout on 64-bit big-endian. r=luke --- js/public/Value.h | 1 + 1 file changed, 1 insertion(+) diff --git a/js/public/Value.h b/js/public/Value.h index 57e951a1def..6b1df5fd5d8 100644 --- a/js/public/Value.h +++ b/js/public/Value.h @@ -321,6 +321,7 @@ typedef union jsval_layout int32_t i32; uint32_t u32; JSWhyMagic why; + jsuword word; } payload; } s; double asDouble; From 4b50b73bdc9ef09c5b4c91bfd78f0201f8177e49 Mon Sep 17 00:00:00 2001 From: Tim Lunn Date: Thu, 25 Apr 2013 16:40:33 -0700 Subject: [PATCH 056/155] Bug 842889 - Include MOZILLA_VERSION in JS_GetImplementationVersion(). r=waldo --- js/src/jsapi.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index be03271ac64..36c59219dc9 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -1445,7 +1445,7 @@ JS_SetJitHardening(JSRuntime *rt, JSBool enabled) JS_PUBLIC_API(const char *) JS_GetImplementationVersion(void) { - return "JavaScript-C 1.8.5+ 2011-04-16"; + return "JavaScript-C" MOZILLA_VERSION; } JS_PUBLIC_API(void) From 35285d6e2f6791132b544a544eca023942ac1087 Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Fri, 26 Apr 2013 01:00:07 +0100 Subject: [PATCH 057/155] Fix broken build caused by 0a7e98a3c3eb (bug 858969) (r=mbrubeck) --- mobile/android/base/BrowserApp.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 8edaf9419a7..31e8e25c2cf 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -115,6 +115,9 @@ abstract public class BrowserApp extends GeckoApp // We'll ask for feedback after the user launches the app this many times. private static final int FEEDBACK_LAUNCH_COUNT = 15; + // Whether the dynamic toolbar pref is enabled. + private boolean mDynamicToolbarEnabled = false; + // Stored value of the toolbar height, so we know when it's changed. private int mToolbarHeight = 0; From 530a611185412a2d1d13da3d750375b75746667d Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Thu, 14 Mar 2013 15:35:38 -0700 Subject: [PATCH 058/155] Bug 858687/862755/860308 - Major simplification of browser toolbar layout (r=mfinkle) * * * Bug fi --- mobile/android/base/BrowserApp.java | 15 +- mobile/android/base/BrowserToolbar.java | 257 +++++----------- .../base/BrowserToolbarBackground.java | 84 +---- mobile/android/base/BrowserToolbarLayout.java | 4 +- mobile/android/base/GeckoViewsFactory.java | 1 - mobile/android/base/Makefile.in | 2 +- .../drawable/address_bar_right_edge.xml | 9 + .../layout-large-v11/browser_toolbar_menu.xml | 288 +++++++++--------- .../base/resources/layout/browser_toolbar.xml | 165 ---------- .../resources/layout/browser_toolbar_menu.xml | 264 ++++++++-------- .../resources/values-large-v11/dimens.xml | 3 - .../resources/values-large-v11/styles.xml | 6 +- .../android/base/resources/values/dimens.xml | 2 +- .../android/base/resources/values/styles.xml | 13 +- mobile/android/base/tests/BaseTest.java.in | 2 +- 15 files changed, 353 insertions(+), 762 deletions(-) create mode 100644 mobile/android/base/resources/drawable/address_bar_right_edge.xml delete mode 100644 mobile/android/base/resources/layout/browser_toolbar.xml diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 31e8e25c2cf..c9025df7ea0 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -342,7 +342,7 @@ abstract public class BrowserApp extends GeckoApp super.onCreate(savedInstanceState); - LinearLayout actionBar = (LinearLayout) getActionBarLayout(); + RelativeLayout actionBar = (RelativeLayout) getActionBarLayout(); mMainLayout.addView(actionBar, 2); ((GeckoApp.MainLayout) mMainLayout).setTouchEventInterceptor(new HideTabsTouchListener()); @@ -683,16 +683,9 @@ abstract public class BrowserApp extends GeckoApp } public View getActionBarLayout() { - int actionBarRes; - - if (!HardwareUtils.hasMenuButton() || HardwareUtils.isTablet()) - actionBarRes = R.layout.browser_toolbar_menu; - else - actionBarRes = R.layout.browser_toolbar; - - LinearLayout actionBar = (LinearLayout) LayoutInflater.from(this).inflate(actionBarRes, null); - actionBar.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, - (int) getResources().getDimension(R.dimen.browser_toolbar_height))); + RelativeLayout actionBar = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.browser_toolbar_menu, null); + actionBar.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, + (int) getResources().getDimension(R.dimen.browser_toolbar_height))); return actionBar; } diff --git a/mobile/android/base/BrowserToolbar.java b/mobile/android/base/BrowserToolbar.java index 8529e534c28..044d06c274f 100644 --- a/mobile/android/base/BrowserToolbar.java +++ b/mobile/android/base/BrowserToolbar.java @@ -40,6 +40,7 @@ import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; +import android.widget.RelativeLayout; import android.widget.RelativeLayout.LayoutParams; import android.widget.ViewSwitcher; @@ -52,16 +53,12 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, GeckoMenu.ActionItemBarPresenter, Animation.AnimationListener { private static final String LOGTAG = "GeckoToolbar"; - private LinearLayout mLayout; - private View mAwesomeBar; + private GeckoRelativeLayout mLayout; private LayoutParams mAwesomeBarParams; + private View mAwesomeBarContent; private View mAwesomeBarEntry; - private int mAwesomeBarEntryRightMargin; - private GeckoFrameLayout mAwesomeBarRightEdge; + private ImageView mAwesomeBarRightEdge; private BrowserToolbarBackground mAddressBarBg; - private View mAddressBarView; - private BrowserToolbarBackground.CurveTowards mAddressBarBgCurveTowards; - private int mAddressBarBgRightMargin; private GeckoTextView mTitle; private int mTitlePadding; private boolean mSiteSecurityVisible; @@ -105,7 +102,6 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, private TranslateAnimation mTitleSlideRight; private int mAddressBarViewOffset; - private int mAddressBarViewOffsetNoForward; private int mDefaultForwardMargin; private PropertyAnimator mForwardAnim = null; @@ -131,49 +127,23 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, mAnimatingEntry = false; } - public void from(LinearLayout layout) { + public void from(RelativeLayout layout) { if (mLayout != null) { // make sure we retain the visibility property on rotation layout.setVisibility(mLayout.getVisibility()); } - mLayout = layout; - mLayout.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - } - }); - mShowSiteSecurity = false; - mShowReader = false; + mLayout = (GeckoRelativeLayout) layout; - mAnimatingEntry = false; - - mAddressBarBg = (BrowserToolbarBackground) mLayout.findViewById(R.id.address_bar_bg); - mAddressBarView = mLayout.findViewById(R.id.addressbar); - mAddressBarViewOffset = mActivity.getResources().getDimensionPixelSize(R.dimen.addressbar_offset_left); - mAddressBarViewOffsetNoForward = mActivity.getResources().getDimensionPixelSize(R.dimen.addressbar_offset_left_noforward); - mDefaultForwardMargin = mActivity.getResources().getDimensionPixelSize(R.dimen.forward_default_offset); - mAwesomeBarRightEdge = (GeckoFrameLayout) mLayout.findViewById(R.id.awesome_bar_right_edge); - mAwesomeBarEntry = mLayout.findViewById(R.id.awesome_bar_entry); - - // This will hold the translation width inside the toolbar when the tabs - // pane is visible. It will affect the padding applied to the title TextView. - mTabsPaneWidth = 0; - - mTitle = (GeckoTextView) mLayout.findViewById(R.id.awesome_bar_title); - mTitlePadding = mTitle.getPaddingRight(); - if (Build.VERSION.SDK_INT >= 16) - mTitle.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); - - mAwesomeBar = mLayout.findViewById(R.id.awesome_bar); - mAwesomeBar.setOnClickListener(new Button.OnClickListener() { + mLayout.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { mActivity.autoHideTabs(); onAwesomeBarSearch(); } }); - mAwesomeBar.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { + + mLayout.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() { @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater inflater = mActivity.getMenuInflater(); @@ -206,6 +176,30 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, } }); + mShowSiteSecurity = false; + mShowReader = false; + + mAnimatingEntry = false; + + mAddressBarBg = (BrowserToolbarBackground) mLayout.findViewById(R.id.address_bar_bg); + mAddressBarViewOffset = mActivity.getResources().getDimensionPixelSize(R.dimen.addressbar_offset_left); + mDefaultForwardMargin = mActivity.getResources().getDimensionPixelSize(R.dimen.forward_default_offset); + mAwesomeBarContent = mLayout.findViewById(R.id.awesome_bar_content); + mAwesomeBarEntry = mLayout.findViewById(R.id.awesome_bar_entry); + + // This will clip the right edge's image at half of its width + mAwesomeBarRightEdge = (ImageView) mLayout.findViewById(R.id.awesome_bar_right_edge); + mAwesomeBarRightEdge.getDrawable().setLevel(5000); + + // This will hold the translation width inside the toolbar when the tabs + // pane is visible. It will affect the padding applied to the title TextView. + mTabsPaneWidth = 0; + + mTitle = (GeckoTextView) mLayout.findViewById(R.id.awesome_bar_title); + mTitlePadding = mTitle.getPaddingRight(); + if (Build.VERSION.SDK_INT >= 16) + mTitle.setImportantForAccessibility(View.IMPORTANT_FOR_ACCESSIBILITY_NO); + mTabs = (ShapedButton) mLayout.findViewById(R.id.tabs); mTabs.setOnClickListener(new Button.OnClickListener() { @Override @@ -323,6 +317,11 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, }); mShadow = (ImageView) mLayout.findViewById(R.id.shadow); + mShadow.setOnClickListener(new Button.OnClickListener() { + @Override + public void onClick(View v) { + } + }); mHandler = new Handler(); mSlideUpIn = new TranslateAnimation(0, 0, 40, 0); @@ -381,7 +380,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, int tail = (width - height) / 2; Rect bounds = new Rect(0, 0, tail, height); - TailTouchDelegate delegate = new TailTouchDelegate(bounds, mAddressBarView); + TailTouchDelegate delegate = new TailTouchDelegate(bounds, mShadow); mTabs.setTouchDelegate(delegate); } }); @@ -413,7 +412,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, } } - mFocusOrder = Arrays.asList(mBack, mForward, mAwesomeBar, mReader, mSiteSecurity, mStop, mTabs); + mFocusOrder = Arrays.asList(mBack, mForward, mLayout, mReader, mSiteSecurity, mStop, mTabs); } public View getLayout() { @@ -499,7 +498,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, } public void setNextFocusDownId(int nextId) { - mAwesomeBar.setNextFocusDownId(nextId); + mLayout.setNextFocusDownId(nextId); mTabs.setNextFocusDownId(nextId); mBack.setNextFocusDownId(nextId); mForward.setNextFocusDownId(nextId); @@ -544,52 +543,8 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, return mInflater.inflate(R.layout.tabs_counter, null); } - private int prepareAwesomeBarAnimation() { - // Keep the entry highlighted during the animation - mAwesomeBar.setSelected(true); - - // Expand the entry to fill all the horizontal space available during the - // animation. The fake right edge will slide on top of it to give the effect - // of expanding the entry. - MarginLayoutParams entryParams = (MarginLayoutParams) mAwesomeBarEntry.getLayoutParams(); - mAwesomeBarEntryRightMargin = entryParams.rightMargin; - entryParams.rightMargin = 0; - mAwesomeBarEntry.requestLayout(); - - // Remove any curves from the toolbar background and expand it to fill all - // the horizontal space. - MarginLayoutParams barParams = (MarginLayoutParams) mAddressBarBg.getLayoutParams(); - mAddressBarBgRightMargin = barParams.rightMargin; - barParams.rightMargin = 0; - mAddressBarBgCurveTowards = mAddressBarBg.getCurveTowards(); - mAddressBarBg.setCurveTowards(BrowserToolbarBackground.CurveTowards.NONE); - - // If we don't have any menu_items, then we simply slide all elements on the - // rigth side of the toolbar out of screen. - int translation = mAwesomeBarEntryRightMargin; - - if (mActionItemBar.getVisibility() == View.VISIBLE) { - // If the toolbar has action items (e.g. on the tablet UI), the translation will - // be in relation to the left side of their container (i.e. mActionItemBar). - MarginLayoutParams itemBarParams = (MarginLayoutParams) mActionItemBar.getLayoutParams(); - translation = itemBarParams.rightMargin + mActionItemBar.getWidth() - entryParams.leftMargin; - - // Expand the whole entry container to fill all the horizontal space available - View awesomeBarParent = (View) mAwesomeBar.getParent(); - mAwesomeBarParams = (LayoutParams) awesomeBarParent.getLayoutParams(); - awesomeBarParent.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT)); - - // Align the fake right edge to the right side of the entry bar - MarginLayoutParams rightEdgeParams = (MarginLayoutParams) mAwesomeBarRightEdge.getLayoutParams(); - rightEdgeParams.rightMargin = itemBarParams.rightMargin + mActionItemBar.getWidth() - 100; - mAwesomeBarRightEdge.requestLayout(); - } - - // Make the right edge visible to start the animation - mAwesomeBarRightEdge.setVisibility(View.VISIBLE); - - return translation; + private int getAwesomeBarAnimTranslation() { + return mLayout.getWidth() - mAwesomeBarEntry.getRight(); } public void fromAwesomeBarSearch(String url) { @@ -610,8 +565,11 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, // while in awesome screen, activity was killed in background, etc). In this // case, we have to ensure the toolbar is in the correct initial state to // shrink back. - if (!mAwesomeBar.isSelected()) { - int translation = prepareAwesomeBarAnimation(); + if (!mLayout.isSelected()) { + // Keep the entry highlighted during the animation + mLayout.setSelected(true); + + final int translation = getAwesomeBarAnimTranslation(); proxy = AnimatorProxy.create(mAwesomeBarRightEdge); proxy.setTranslationX(translation); @@ -673,27 +631,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, @Override public void onPropertyAnimationEnd() { // Turn off selected state on the entry - mAwesomeBar.setSelected(false); - - // Restore entry state - MarginLayoutParams entryParams = (MarginLayoutParams) mAwesomeBarEntry.getLayoutParams(); - entryParams.rightMargin = mAwesomeBarEntryRightMargin; - mAwesomeBarEntry.requestLayout(); - - // Restore the background state - MarginLayoutParams barParams = (MarginLayoutParams) mAddressBarBg.getLayoutParams(); - barParams.rightMargin = mAddressBarBgRightMargin; - mAddressBarBg.setCurveTowards(mAddressBarBgCurveTowards); - - // If there are action bar items in the toolbar, we have to restore the - // alignment of the entry in relation to them. mAwesomeBarParams might - // be null if the activity holding the toolbar is killed before returning - // from awesome screen (e.g. "Don't keep activities" is on) - if (mActionItemBar.getVisibility() == View.VISIBLE) - ((View) mAwesomeBar.getParent()).setLayoutParams(mAwesomeBarParams); - - // Hide fake right edge, we only use for the animation - mAwesomeBarRightEdge.setVisibility(View.INVISIBLE); + mLayout.setSelected(false); PropertyAnimator buttonsAnimator = new PropertyAnimator(150); @@ -735,7 +673,10 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, final PropertyAnimator contentAnimator = new PropertyAnimator(250); contentAnimator.setUseHardwareLayer(false); - int translation = prepareAwesomeBarAnimation(); + final int translation = getAwesomeBarAnimTranslation(); + + // Keep the entry highlighted during the animation + mLayout.setSelected(true); if (mActionItemBar.getVisibility() == View.VISIBLE) { contentAnimator.attach(mFavicon, @@ -859,13 +800,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, } public void prepareTabsAnimation(PropertyAnimator animator, int width) { - // This is negative before we want to keep the right edge in the same - // position while animating the left-most elements below. - animator.attach(mAwesomeBarRightEdge, - PropertyAnimator.Property.TRANSLATION_X, - -width); - - animator.attach(mAwesomeBar, + animator.attach(mAwesomeBarEntry, PropertyAnimator.Property.TRANSLATION_X, width); animator.attach(mAddressBarBg, @@ -907,8 +842,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, public void adjustTabsAnimation(boolean reset) { int width = reset ? 0 : mTabsPaneWidth; - mAwesomeBarRightEdge.setTranslationX(-width); - mAwesomeBar.setTranslationX(width); + mAwesomeBarEntry.setTranslationX(width); mAddressBarBg.setTranslationX(width); mTabs.setTranslationX(width); mTabsCount.setTranslationX(width); @@ -1071,7 +1005,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, title = null; mTitle.setText(title); - mAwesomeBar.setContentDescription(title != null ? title : mTitle.getHint()); + mLayout.setContentDescription(title != null ? title : mTitle.getHint()); } private void setFavicon(Bitmap image) { @@ -1107,7 +1041,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, } public void requestFocusFromTouch() { - mAwesomeBar.requestFocusFromTouch(); + mLayout.requestFocusFromTouch(); } public void updateBackButton(boolean enabled) { @@ -1130,7 +1064,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, return; mForwardAnim = new PropertyAnimator(FORWARD_ANIMATION_DURATION); - final int width = mForward.getWidth()/2; + final int width = mForward.getWidth() / 2; mForwardAnim.setPropertyAnimationListener(new PropertyAnimator.PropertyAnimationListener() { @Override @@ -1139,9 +1073,9 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, // Set the margin before the transition when hiding the forward button. We // have to do this so that the favicon isn't clipped during the transition ViewGroup.MarginLayoutParams layoutParams = - (ViewGroup.MarginLayoutParams)mAddressBarView.getLayoutParams(); - layoutParams.leftMargin = mAddressBarViewOffsetNoForward; - mAddressBarView.requestLayout(); + (ViewGroup.MarginLayoutParams)mAwesomeBarContent.getLayoutParams(); + layoutParams.leftMargin = 0; + mAwesomeBarContent.requestLayout(); // Note, we already translated the favicon, site security, and text field // in prepareForwardAnimation, so they should appear to have not moved at // all at this point. @@ -1152,7 +1086,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, public void onPropertyAnimationEnd() { if (enabled) { ViewGroup.MarginLayoutParams layoutParams = - (ViewGroup.MarginLayoutParams)mAddressBarView.getLayoutParams(); + (ViewGroup.MarginLayoutParams)mAwesomeBarContent.getLayoutParams(); layoutParams.leftMargin = mAddressBarViewOffset; AnimatorProxy proxy = AnimatorProxy.create(mTitle); @@ -1161,19 +1095,19 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, proxy.setTranslationX(0); proxy = AnimatorProxy.create(mSiteSecurity); proxy.setTranslationX(0); - } ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)mForward.getLayoutParams(); - layoutParams.leftMargin = mDefaultForwardMargin + (mForward.isEnabled() ? mForward.getWidth()/2 : 0); + layoutParams.leftMargin = mDefaultForwardMargin + (mForward.isEnabled() ? mForward.getWidth() / 2 : 0); AnimatorProxy proxy = AnimatorProxy.create(mForward); proxy.setTranslationX(0); - mAddressBarView.requestLayout(); + mAwesomeBarContent.requestLayout(); mForwardAnim = null; } }); + prepareForwardAnimation(mForwardAnim, enabled, width); mForwardAnim.start(); } @@ -1182,7 +1116,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, if (!enabled) { anim.attach(mForward, PropertyAnimator.Property.TRANSLATION_X, - -1*width); + -width); anim.attach(mForward, PropertyAnimator.Property.ALPHA, 0); @@ -1199,13 +1133,12 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, // We're hiding the forward button. We're going to reset the margin before // the animation starts, so we shift these items to the right so that they don't // appear to move initially. - int startTrans = mAddressBarViewOffset - mAddressBarViewOffsetNoForward; AnimatorProxy proxy = AnimatorProxy.create(mTitle); - proxy.setTranslationX(startTrans); + proxy.setTranslationX(mAddressBarViewOffset); proxy = AnimatorProxy.create(mFavicon); - proxy.setTranslationX(startTrans); + proxy.setTranslationX(mAddressBarViewOffset); proxy = AnimatorProxy.create(mSiteSecurity); - proxy.setTranslationX(startTrans); + proxy.setTranslationX(mAddressBarViewOffset); } else { anim.attach(mForward, PropertyAnimator.Property.TRANSLATION_X, @@ -1215,13 +1148,13 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, 1); anim.attach(mTitle, PropertyAnimator.Property.TRANSLATION_X, - mAddressBarViewOffset - mAddressBarViewOffsetNoForward); + mAddressBarViewOffset); anim.attach(mFavicon, PropertyAnimator.Property.TRANSLATION_X, - mAddressBarViewOffset - mAddressBarViewOffsetNoForward); + mAddressBarViewOffset); anim.attach(mSiteSecurity, PropertyAnimator.Property.TRANSLATION_X, - mAddressBarViewOffset - mAddressBarViewOffsetNoForward); + mAddressBarViewOffset); } } @@ -1267,12 +1200,7 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, updateForwardButton(tab.canDoForward()); mAddressBarBg.setPrivateMode(tab.isPrivate()); - - if (mAwesomeBar instanceof GeckoButton) - ((GeckoButton) mAwesomeBar).setPrivateMode(tab.isPrivate()); - else if (mAwesomeBar instanceof GeckoRelativeLayout) - ((GeckoRelativeLayout) mAwesomeBar).setPrivateMode(tab.isPrivate()); - + mLayout.setPrivateMode(tab.isPrivate()); mTabs.setPrivateMode(tab.isPrivate()); mTitle.setPrivateMode(tab.isPrivate()); mMenu.setPrivateMode(tab.isPrivate()); @@ -1309,43 +1237,4 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, return true; } - - public static class RightEdge extends GeckoFrameLayout { - private BrowserApp mActivity; - - public RightEdge(Context context, AttributeSet attrs) { - super(context, attrs); - mActivity = (BrowserApp) context; - } - - @Override - public void onLightweightThemeChanged() { - Drawable drawable = mActivity.getLightweightTheme().getDrawable(this); - if (drawable == null) - return; - - StateListDrawable stateList = new StateListDrawable(); - stateList.addState(new int[] { R.attr.state_private }, new ColorDrawable(mActivity.getResources().getColor(R.color.background_private))); - stateList.addState(new int[] {}, drawable); - - int[] padding = new int[] { getPaddingLeft(), - getPaddingTop(), - getPaddingRight(), - getPaddingBottom() - }; - setBackgroundDrawable(stateList); - setPadding(padding[0], padding[1], padding[2], padding[3]); - } - - @Override - public void onLightweightThemeReset() { - int[] padding = new int[] { getPaddingLeft(), - getPaddingTop(), - getPaddingRight(), - getPaddingBottom() - }; - setBackgroundResource(R.drawable.address_bar_bg); - setPadding(padding[0], padding[1], padding[2], padding[3]); - } - } } diff --git a/mobile/android/base/BrowserToolbarBackground.java b/mobile/android/base/BrowserToolbarBackground.java index 8a3fc54c4e1..e56a0689dbf 100644 --- a/mobile/android/base/BrowserToolbarBackground.java +++ b/mobile/android/base/BrowserToolbarBackground.java @@ -14,72 +14,14 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.StateListDrawable; import android.util.AttributeSet; -public class BrowserToolbarBackground extends GeckoLinearLayout - implements CanvasDelegate.DrawManager { +public class BrowserToolbarBackground extends GeckoLinearLayout { private GeckoActivity mActivity; - private Path mPath; - private CurveTowards mSide; - private CanvasDelegate mCanvasDelegate; - - public enum CurveTowards { NONE, LEFT, RIGHT }; public BrowserToolbarBackground(Context context, AttributeSet attrs) { super(context, attrs); - - TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BrowserToolbarCurve); - int curveTowards = a.getInt(R.styleable.BrowserToolbarCurve_curveTowards, 0x02); - a.recycle(); - - if (curveTowards == 0x00) - mSide = CurveTowards.NONE; - else if (curveTowards == 0x01) - mSide = CurveTowards.LEFT; - else - mSide = CurveTowards.RIGHT; - - // Path is clipped. - mPath = new Path(); - mCanvasDelegate = new CanvasDelegate(this, Mode.DST_OUT); mActivity = (GeckoActivity) context; } - @Override - public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - - int width = getMeasuredWidth(); - int height = getMeasuredHeight(); - int curve = (int) (height * 1.125f); - - mPath.reset(); - - if (mSide == CurveTowards.LEFT) { - mPath.moveTo(0, height); - mPath.cubicTo(curve * 0.75f, height, - curve * 0.25f, 0, - curve, 0); - mPath.lineTo(0, 0); - mPath.lineTo(0, height); - } else if (mSide == CurveTowards.RIGHT) { - mPath.moveTo(width, height); - mPath.cubicTo((width - (curve * 0.75f)), height, - (width - (curve * 0.25f)), 0, - (width - curve), 0); - mPath.lineTo(width, 0); - mPath.lineTo(width, height); - } - } - - @Override - public void draw(Canvas canvas) { - mCanvasDelegate.draw(canvas, mPath, getWidth(), getHeight()); - } - - @Override - public void defaultDraw(Canvas canvas) { - super.draw(canvas); - } - @Override public void onLightweightThemeChanged() { Drawable drawable = mActivity.getLightweightTheme().getDrawable(this); @@ -90,35 +32,11 @@ public class BrowserToolbarBackground extends GeckoLinearLayout stateList.addState(new int[] { R.attr.state_private }, new ColorDrawable(mActivity.getResources().getColor(R.color.background_private))); stateList.addState(new int[] {}, drawable); - int[] padding = new int[] { getPaddingLeft(), - getPaddingTop(), - getPaddingRight(), - getPaddingBottom() - }; setBackgroundDrawable(stateList); - setPadding(padding[0], padding[1], padding[2], padding[3]); } @Override public void onLightweightThemeReset() { - int[] padding = new int[] { getPaddingLeft(), - getPaddingTop(), - getPaddingRight(), - getPaddingBottom() - }; setBackgroundResource(R.drawable.address_bar_bg); - setPadding(padding[0], padding[1], padding[2], padding[3]); - } - - public CurveTowards getCurveTowards() { - return mSide; - } - - public void setCurveTowards(CurveTowards side) { - if (side == mSide) - return; - - mSide = side; - requestLayout(); } } diff --git a/mobile/android/base/BrowserToolbarLayout.java b/mobile/android/base/BrowserToolbarLayout.java index d2d54985d7f..1895e054170 100644 --- a/mobile/android/base/BrowserToolbarLayout.java +++ b/mobile/android/base/BrowserToolbarLayout.java @@ -8,9 +8,9 @@ package org.mozilla.gecko; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; -import android.widget.LinearLayout; +import android.widget.RelativeLayout; -public class BrowserToolbarLayout extends LinearLayout { +public class BrowserToolbarLayout extends GeckoRelativeLayout { private static final String LOGTAG = "GeckoToolbarLayout"; public BrowserToolbarLayout(Context context, AttributeSet attrs) { diff --git a/mobile/android/base/GeckoViewsFactory.java b/mobile/android/base/GeckoViewsFactory.java index ea35eda79e3..14a10081a25 100644 --- a/mobile/android/base/GeckoViewsFactory.java +++ b/mobile/android/base/GeckoViewsFactory.java @@ -56,7 +56,6 @@ public final class GeckoViewsFactory implements LayoutInflater.Factory { mFactoryMap.put("AwesomeBarTabs$BackgroundLayout", AwesomeBarTabs.BackgroundLayout.class.getConstructor(arg1Class, arg2Class)); mFactoryMap.put("BackButton", BackButton.class.getConstructor(arg1Class, arg2Class)); mFactoryMap.put("BrowserToolbarBackground", BrowserToolbarBackground.class.getConstructor(arg1Class, arg2Class)); - mFactoryMap.put("BrowserToolbar$RightEdge", BrowserToolbar.RightEdge.class.getConstructor(arg1Class, arg2Class)); mFactoryMap.put("CheckableLinearLayout", CheckableLinearLayout.class.getConstructor(arg1Class, arg2Class)); mFactoryMap.put("FormAssistPopup", FormAssistPopup.class.getConstructor(arg1Class, arg2Class)); mFactoryMap.put("ForwardButton", ForwardButton.class.getConstructor(arg1Class, arg2Class)); diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index 2308b09fb8b..ab0122d7300 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -401,7 +401,6 @@ RES_LAYOUT = \ res/layout/awesomebar_tab_indicator.xml \ res/layout/awesomebar_tabs.xml \ res/layout/bookmark_edit.xml \ - res/layout/browser_toolbar.xml \ res/layout/browser_toolbar_menu.xml \ res/layout/datetime_picker.xml \ res/layout/doorhangerpopup.xml \ @@ -1002,6 +1001,7 @@ MOZ_ANDROID_DRAWABLES += \ mobile/android/base/resources/drawable/address_bar_bg.xml \ mobile/android/base/resources/drawable/address_bar_bg_shadow_repeat.xml \ mobile/android/base/resources/drawable/address_bar_nav_button.xml \ + mobile/android/base/resources/drawable/address_bar_right_edge.xml \ mobile/android/base/resources/drawable/address_bar_url.xml \ mobile/android/base/resources/drawable/awesomebar_header_row.xml \ mobile/android/base/resources/drawable/awesomebar_row_favicon_bg.xml \ diff --git a/mobile/android/base/resources/drawable/address_bar_right_edge.xml b/mobile/android/base/resources/drawable/address_bar_right_edge.xml new file mode 100644 index 00000000000..567f7bd2e5f --- /dev/null +++ b/mobile/android/base/resources/drawable/address_bar_right_edge.xml @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/mobile/android/base/resources/layout-large-v11/browser_toolbar_menu.xml b/mobile/android/base/resources/layout-large-v11/browser_toolbar_menu.xml index 7636ff2f54e..e5b6a8eedc1 100644 --- a/mobile/android/base/resources/layout-large-v11/browser_toolbar_menu.xml +++ b/mobile/android/base/resources/layout-large-v11/browser_toolbar_menu.xml @@ -6,176 +6,160 @@ + style="@style/BrowserToolbar" + android:clickable="true" + android:focusable="true"> - + - + - + - + - + - + - + - + + + android:padding="13dp" + android:src="@drawable/ic_menu_back" + android:contentDescription="@string/back" + android:background="@drawable/address_bar_nav_button"/> - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - + diff --git a/mobile/android/base/resources/layout/browser_toolbar.xml b/mobile/android/base/resources/layout/browser_toolbar.xml deleted file mode 100644 index ce4fda728a0..00000000000 --- a/mobile/android/base/resources/layout/browser_toolbar.xml +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/mobile/android/base/resources/layout/browser_toolbar_menu.xml b/mobile/android/base/resources/layout/browser_toolbar_menu.xml index 3ea9b5546c7..db483dbf74c 100644 --- a/mobile/android/base/resources/layout/browser_toolbar_menu.xml +++ b/mobile/android/base/resources/layout/browser_toolbar_menu.xml @@ -6,167 +6,141 @@ + style="@style/BrowserToolbar" + android:layout_centerVertical="true" + android:clickable="true" + android:focusable="true"> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - - - - - + diff --git a/mobile/android/base/resources/values-large-v11/dimens.xml b/mobile/android/base/resources/values-large-v11/dimens.xml index 4a689a256b4..9dda026d144 100644 --- a/mobile/android/base/resources/values-large-v11/dimens.xml +++ b/mobile/android/base/resources/values-large-v11/dimens.xml @@ -7,10 +7,7 @@ 56dp 16dp - 45dp 8dip 26sp - 90dp - 50dip diff --git a/mobile/android/base/resources/values-large-v11/styles.xml b/mobile/android/base/resources/values-large-v11/styles.xml index ee50b4652c7..4a1b8e55882 100644 --- a/mobile/android/base/resources/values-large-v11/styles.xml +++ b/mobile/android/base/resources/values-large-v11/styles.xml @@ -33,9 +33,9 @@ diff --git a/mobile/android/base/resources/values/dimens.xml b/mobile/android/base/resources/values/dimens.xml index 07951d9b59e..0fc4424855c 100644 --- a/mobile/android/base/resources/values/dimens.xml +++ b/mobile/android/base/resources/values/dimens.xml @@ -30,7 +30,7 @@ 38dp 48dp 12dp - 36dp + 48dp 20dp 29.33dip diff --git a/mobile/android/base/resources/values/styles.xml b/mobile/android/base/resources/values/styles.xml index 8aae4263653..7b19b260292 100644 --- a/mobile/android/base/resources/values/styles.xml +++ b/mobile/android/base/resources/values/styles.xml @@ -175,15 +175,6 @@ @android:color/transparent - - + + diff --git a/mobile/android/base/tests/BaseTest.java.in b/mobile/android/base/tests/BaseTest.java.in index a2d57d84586..3cb13bf57da 100644 --- a/mobile/android/base/tests/BaseTest.java.in +++ b/mobile/android/base/tests/BaseTest.java.in @@ -190,7 +190,7 @@ abstract class BaseTest extends ActivityInstrumentationTestCase2 { */ protected final Activity clickOnAwesomeBar() { Activity activity = null; - Element awesomebar = mDriver.findElement(mActivity, "awesome_bar"); + Element awesomebar = mDriver.findElement(mActivity, "browser_toolbar"); if (awesomebar != null) { activity = getActivityFromClick(awesomebar); if (activity == null) { From 654d3765682da80684b72de95fd4a01635be9590 Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Wed, 24 Apr 2013 21:19:26 +0100 Subject: [PATCH 059/155] Bug 858687 - Rename browser_toolbar_menu.xml to browser_toolbar.xml (r=mfinkle) --HG-- rename : mobile/android/base/resources/layout-large-v11/browser_toolbar_menu.xml => mobile/android/base/resources/layout-large-v11/browser_toolbar.xml rename : mobile/android/base/resources/layout/browser_toolbar_menu.xml => mobile/android/base/resources/layout/browser_toolbar.xml --- mobile/android/base/BrowserApp.java | 2 +- mobile/android/base/Makefile.in | 4 ++-- .../{browser_toolbar_menu.xml => browser_toolbar.xml} | 0 .../layout/{browser_toolbar_menu.xml => browser_toolbar.xml} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename mobile/android/base/resources/layout-large-v11/{browser_toolbar_menu.xml => browser_toolbar.xml} (100%) rename mobile/android/base/resources/layout/{browser_toolbar_menu.xml => browser_toolbar.xml} (100%) diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index c9025df7ea0..5025291f23c 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -683,7 +683,7 @@ abstract public class BrowserApp extends GeckoApp } public View getActionBarLayout() { - RelativeLayout actionBar = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.browser_toolbar_menu, null); + RelativeLayout actionBar = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.browser_toolbar, null); actionBar.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, (int) getResources().getDimension(R.dimen.browser_toolbar_height))); return actionBar; diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index ab0122d7300..ba81d5d3ce7 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -401,7 +401,7 @@ RES_LAYOUT = \ res/layout/awesomebar_tab_indicator.xml \ res/layout/awesomebar_tabs.xml \ res/layout/bookmark_edit.xml \ - res/layout/browser_toolbar_menu.xml \ + res/layout/browser_toolbar.xml \ res/layout/datetime_picker.xml \ res/layout/doorhangerpopup.xml \ res/layout/doorhanger.xml \ @@ -448,7 +448,7 @@ RES_LAYOUT = \ RES_LAYOUT_LARGE_V11 = \ res/layout-large-v11/awesomebar_search.xml \ - res/layout-large-v11/browser_toolbar_menu.xml \ + res/layout-large-v11/browser_toolbar.xml \ $(NULL) RES_LAYOUT_LARGE_LAND_V11 = \ diff --git a/mobile/android/base/resources/layout-large-v11/browser_toolbar_menu.xml b/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml similarity index 100% rename from mobile/android/base/resources/layout-large-v11/browser_toolbar_menu.xml rename to mobile/android/base/resources/layout-large-v11/browser_toolbar.xml diff --git a/mobile/android/base/resources/layout/browser_toolbar_menu.xml b/mobile/android/base/resources/layout/browser_toolbar.xml similarity index 100% rename from mobile/android/base/resources/layout/browser_toolbar_menu.xml rename to mobile/android/base/resources/layout/browser_toolbar.xml From f4fee95fc10db9caabe032e8b96c462eb6b4e7f1 Mon Sep 17 00:00:00 2001 From: Sean Stangl Date: Thu, 25 Apr 2013 17:05:20 -0700 Subject: [PATCH 060/155] Bug 618485 - Prefer word types that exist. no_r=red --- js/public/Value.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/public/Value.h b/js/public/Value.h index 6b1df5fd5d8..e777cd9a4d8 100644 --- a/js/public/Value.h +++ b/js/public/Value.h @@ -321,7 +321,7 @@ typedef union jsval_layout int32_t i32; uint32_t u32; JSWhyMagic why; - jsuword word; + uintptr_t word; } payload; } s; double asDouble; From 2739bde63347c18e0f488c0a753ef8a30455544c Mon Sep 17 00:00:00 2001 From: Norbert Lindenberg Date: Thu, 25 Apr 2013 15:27:22 -0700 Subject: [PATCH 061/155] Bug 724533 - Integrate ICU into the Mozilla build (but don't actually build it, until a compile-time flag gets flipped). r=glandium --- js/src/Makefile.in | 49 +++++++++++++++++++++++-- js/src/configure.in | 89 ++++++++++++++++++++++++++++++++++++++++++++- js/src/jsversion.h | 3 -- 3 files changed, 133 insertions(+), 8 deletions(-) diff --git a/js/src/Makefile.in b/js/src/Makefile.in index fe7a2619c76..db09d6b6ff0 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -556,13 +556,53 @@ distclean clean:: endif endif + +############################################# +# BEGIN ECMAScript Internationalization API +# + # ICU headers need to be available whether we build with the complete # Internationalization API or not - ICU stubs rely on them. LOCAL_INCLUDES += \ - -I$(topsrcdir)/../../intl/icu/source/common \ - -I$(topsrcdir)/../../intl/icu/source/i18n \ - $(NULL) + -I$(topsrcdir)/../../intl/icu/source/common \ + -I$(topsrcdir)/../../intl/icu/source/i18n \ + $(NULL) + +ifdef ENABLE_INTL_API + +ifeq ($(OS_ARCH),WINNT) + # Parallel gmake is buggy on Windows + ICU_GMAKE_OPTIONS="-j1" + # Library names: On Windows, ICU uses modified library names for static + # and debug libraries. + ifdef MOZ_DEBUG + ICU_LIB_SUFFIX=d + endif + ICU_LIB_RENAME = $(foreach libname,$(ICU_LIB_NAMES),\ + cp -p intl/icu/lib/s$(libname)$(ICU_LIB_SUFFIX).lib intl/icu/lib/$(libname).lib;) +endif + +# - Build ICU as part of the "export" target, so things get built +# in the right order. +# - ICU requires GNU make according to its readme.html. pymake can't be used +# because it doesn't support order only dependencies. +# - Force ICU to use the standard suffix for object files because expandlibs +# will discard all files with a non-standard suffix (bug 857450). +# - Options for genrb: -k strict parsing; -R omit collation tailoring rules. +export:: + $(GMAKE) $(ICU_GMAKE_OPTIONS) -C intl/icu STATIC_O=$(OBJ_SUFFIX) GENRBOPTS='-k -R' + $(ICU_LIB_RENAME) + +distclean clean:: + $(call SUBMAKE,$@,intl/icu) + +endif + +# +# END ECMAScript Internationalization API +############################################# + # The "find any vanilla new/new[] calls" script is tailored to Linux, so # only run it there. That should be enough to catch any such calls that @@ -687,6 +727,8 @@ ifneq (,$(MOZ_ZLIB_LIBS)$(MOZ_GLUE_LDFLAGS)) DEFINES += -DUSE_ZLIB endif +SHARED_LIBRARY_LIBS += $(ICU_LIBS) + # Prevent floating point errors caused by VC++ optimizations ifdef _MSC_VER # XXX We should add this to CXXFLAGS, too? @@ -984,4 +1026,3 @@ endif # # END kludges for the Nitro assembler ############################################### - diff --git a/js/src/configure.in b/js/src/configure.in index 28015de84ae..37d696c486c 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -4403,14 +4403,102 @@ if test "$ACCESSIBILITY" -a "$MOZ_ENABLE_GTK2" ; then AC_DEFINE_UNQUOTED(ATK_REV_VERSION, $ATK_REV_VERSION) fi + +dnl ======================================================== dnl ECMAScript Internationalization API Support (uses ICU) dnl ======================================================== +MOZ_ARG_ENABLE_BOOL(intl-api, +[ --enable-intl-api Enable ECMAScript Internationalization API], + ENABLE_INTL_API=1 ) + +dnl Settings for the implementation of the ECMAScript Internationalization API +if test -n "$ENABLE_INTL_API"; then + AC_DEFINE(ENABLE_INTL_API) + # We build ICU as a static library. + AC_DEFINE(U_STATIC_IMPLEMENTATION) + + case "$OS_TARGET" in + WINNT) + ICU_LIB_NAMES="icuin icuuc icudt" + ;; + Darwin|Linux) + ICU_LIB_NAMES="icui18n icuuc icudata" + ;; + *) + AC_MSG_ERROR([ECMAScript Internationalization API is not yet supported on this platform]) + esac + + ICU_LIBS='$(call EXPAND_LIBNAME_PATH,$(ICU_LIB_NAMES),$(DEPTH)/intl/icu/lib)' +else + ICU_LIB_NAMES= + ICU_LIBS= +fi + +AC_SUBST(ENABLE_INTL_API) +AC_SUBST(ICU_LIB_NAMES) +AC_SUBST(ICU_LIBS) + dnl Source files that use ICU should have control over which parts of the ICU dnl namespace they want to use. AC_DEFINE(U_USING_ICU_NAMESPACE,0) +dnl Settings for ICU +if test -n "$ENABLE_INTL_API" ; then + # Set ICU compile options + ICU_CPPFLAGS="" + # don't use icu namespace automatically in client code + ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_USING_ICU_NAMESPACE=0" + # don't include obsolete header files + ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1" + # remove chunks of the library that we don't need (yet) + ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_LEGACY_CONVERSION" + ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_TRANSLITERATION" + ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_REGULAR_EXPRESSIONS" + ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_BREAK_ITERATION" + + # Set OS dependent options for ICU + case "$OS_TARGET" in + Darwin) + ICU_TARGET=MacOSX + ;; + Linux) + ICU_TARGET=Linux + ;; + WINNT) + ICU_TARGET=MSYS/MSVC + ;; + esac + + # To reduce library size, use static linking + ICU_LINK_OPTS="--enable-static --disable-shared" + # Force the ICU static libraries to be position independent code + ICU_CFLAGS="$DSO_PIC_CFLAGS" + ICU_CXXFLAGS="$DSO_PIC_CFLAGS" + + ICU_BUILD_OPTS="" + if test -n "$MOZ_DEBUG"; then + ICU_BUILD_OPTS="$ICU_BUILD_OPTS --enable-debug" + fi + if test -z "$MOZ_OPTIMIZE"; then + ICU_BUILD_OPTS="$ICU_BUILD_OPTS --disable-release" + fi + + abs_srcdir=`(cd $srcdir; pwd)` + mkdir -p $_objdir/intl/icu + (cd $_objdir/intl/icu; \ + CFLAGS="$ICU_CFLAGS" CPPFLAGS="$ICU_CPPFLAGS" CXXFLAGS="$ICU_CXXFLAGS" \ + $(SHELL) $abs_srcdir/../../intl/icu/source/runConfigureICU \ + $ICU_BUILD_OPTS \ + $ICU_TARGET \ + $ICU_LINK_OPTS \ + --enable-extras=no --enable-icuio=no --enable-layout=no \ + --enable-tests=no --enable-samples=no || exit 1 + ) || exit 1 +fi + + dnl ======================================================== dnl JavaScript shell dnl ======================================================== @@ -4502,4 +4590,3 @@ if test "$JS_HAS_CTYPES" -a -z "$MOZ_NATIVE_FFI"; then ac_configure_args="$_SUBDIR_CONFIG_ARGS" CONFIG_FILES=$old_config_files fi - diff --git a/js/src/jsversion.h b/js/src/jsversion.h index 5958c165b78..f3169fb5d11 100644 --- a/js/src/jsversion.h +++ b/js/src/jsversion.h @@ -64,7 +64,4 @@ MOZ_NOT_REACHED("don't call this! to be used in the new object representation") #endif -/* ECMAScript Internationalization API isn't fully implemented yet. */ -#define ENABLE_INTL_API 0 - #endif /* jsversion_h___ */ From fbfbcd2a45cb1280ce004c44393b64ed1943764d Mon Sep 17 00:00:00 2001 From: Brian Hackett Date: Thu, 25 Apr 2013 18:18:29 -0600 Subject: [PATCH 062/155] Bug 864216 - Only create IonScriptCounts for asm.js code if rt->profilingScripts, r=luke. --- js/src/ion/CodeGenerator.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/src/ion/CodeGenerator.cpp b/js/src/ion/CodeGenerator.cpp index 5e738c8513a..42c2b40051a 100644 --- a/js/src/ion/CodeGenerator.cpp +++ b/js/src/ion/CodeGenerator.cpp @@ -2084,6 +2084,8 @@ CodeGenerator::maybeCreateScriptCounts() if (cx->runtime->profilingScripts) { if (script && !script->hasScriptCounts && !script->initScriptCounts(cx)) return NULL; + } else if (!script) { + return NULL; } if (script && !script->hasScriptCounts) From 5ba3ab6f93bf1d2ba3e5d1101345933e29add8d4 Mon Sep 17 00:00:00 2001 From: Andreas Gal Date: Thu, 25 Apr 2013 17:48:59 -0700 Subject: [PATCH 063/155] Canvas image cache isn't hooked up to memory pressure purging, and needs a size limit (bug 865929, r=jlebar, a=tef+). --- b2g/app/b2g.js | 1 + content/canvas/src/CanvasImageCache.cpp | 53 ++++++++++++++++++++++++- modules/libpref/src/init/all.js | 4 ++ 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 24e8154ef9d..77b22411e42 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -28,6 +28,7 @@ pref("browser.cache.memory.capacity", 1024); // kilobytes /* image cache prefs */ pref("image.cache.size", 1048576); // bytes pref("image.high_quality_downscaling.enabled", false); +pref("canvas.image.cache.limit", 10485760); // 10 MB /* offline cache prefs */ pref("browser.offline-apps.notify", false); diff --git a/content/canvas/src/CanvasImageCache.cpp b/content/canvas/src/CanvasImageCache.cpp index f1fb2948e60..0804bb88feb 100644 --- a/content/canvas/src/CanvasImageCache.cpp +++ b/content/canvas/src/CanvasImageCache.cpp @@ -13,6 +13,7 @@ #include "nsTHashtable.h" #include "mozilla/dom/HTMLCanvasElement.h" #include "nsContentUtils.h" +#include "mozilla/Preferences.h" namespace mozilla { @@ -42,6 +43,8 @@ struct ImageCacheEntryData { nsExpirationState* GetExpirationState() { return &mState; } + size_t SizeInBytes() { return mSize.width * mSize.height * 4; } + // Key nsRefPtr mImage; nsIImageLoadingContent* mILC; @@ -79,19 +82,43 @@ public: nsAutoPtr mData; }; -class ImageCache MOZ_FINAL : public nsExpirationTracker { +static bool sPrefsInitialized = false; +static int32_t sCanvasImageCacheLimit = 0; + +class ImageCache MOZ_FINAL : public nsExpirationTracker, + public nsIObserver { public: + NS_DECL_ISUPPORTS + NS_DECL_NSIOBSERVER + // We use 3 generations of 1 second each to get a 2-3 seconds timeout. enum { GENERATION_MS = 1000 }; ImageCache() : nsExpirationTracker(GENERATION_MS) + , mSize(0) { + if (!sPrefsInitialized) { + sPrefsInitialized = true; + Preferences::AddIntVarCache(&sCanvasImageCacheLimit, "canvas.image.cache.limit", 0); + } mCache.Init(); } ~ImageCache() { AgeAllGenerations(); } + void AddObject(ImageCacheEntryData* aObject) + { + nsExpirationTracker::AddObject(aObject); + mSize += aObject->SizeInBytes(); + } + + void RemoveObject(ImageCacheEntryData* aObject) + { + nsExpirationTracker::RemoveObject(aObject); + mSize -= aObject->SizeInBytes(); + } + virtual void NotifyExpired(ImageCacheEntryData* aObject) { RemoveObject(aObject); @@ -100,10 +127,24 @@ public: } nsTHashtable mCache; + size_t mSize; }; static ImageCache* gImageCache = nullptr; +NS_IMPL_ISUPPORTS1(ImageCache, nsIObserver) + +NS_IMETHODIMP +ImageCache::Observe(nsISupports *aSubject, + const char *aTopic, + const PRUnichar *aData) +{ + if (strcmp(aTopic, "memory-pressure") == 0) { + AgeAllGenerations(); + } + return NS_OK; +} + class CanvasImageCacheShutdownObserver MOZ_FINAL : public nsIObserver { public: @@ -120,6 +161,9 @@ CanvasImageCache::NotifyDrawImage(Element* aImage, { if (!gImageCache) { gImageCache = new ImageCache(); + nsCOMPtr os = mozilla::services::GetObserverService(); + if (os) + os->AddObserver(gImageCache, "memory-pressure", false); nsContentUtils::RegisterShutdownObserver(new CanvasImageCacheShutdownObserver()); } @@ -140,6 +184,13 @@ CanvasImageCache::NotifyDrawImage(Element* aImage, entry->mData->mSurface = aSurface; entry->mData->mSize = aSize; } + + if (!sCanvasImageCacheLimit) + return; + + // Expire the image cache early if its larger than we want it to be. + while (gImageCache->mSize > size_t(sCanvasImageCacheLimit)) + gImageCache->AgeOneGeneration(); } gfxASurface* diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 55385d3da3b..6d3fee4f1a8 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -3921,6 +3921,10 @@ pref("image.multithreaded_decoding.enabled", true); // automatically determined based on the system's number of cores. pref("image.multithreaded_decoding.limit", -1); +// Limit for the canvas image cache. 0 means we don't limit the size of the +// cache. +pref("canvas.image.cache.limit", 0); + // WebGL prefs pref("gl.msaa-level", 2); pref("webgl.force-enabled", false); From d783a811685404438a1d036fc32e7eceb0b1494b Mon Sep 17 00:00:00 2001 From: Mark Hammond Date: Fri, 26 Apr 2013 11:02:39 +1000 Subject: [PATCH 064/155] Bug 849810 - fix 'blocklisted provider removed' orange. r=mixedpuppy --- .../content/test/social/browser_blocklist.js | 24 +++++++++---------- browser/base/content/test/social/head.js | 8 +++---- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/browser/base/content/test/social/browser_blocklist.js b/browser/base/content/test/social/browser_blocklist.js index 94eef1168c5..4ba51f701a9 100644 --- a/browser/base/content/test/social/browser_blocklist.js +++ b/browser/base/content/test/social/browser_blocklist.js @@ -29,8 +29,7 @@ function test() { waitForExplicitFinish(); runSocialTests(tests, undefined, undefined, function () { - resetBlocklist(); //restore to original pref - finish(); + resetBlocklist(finish); //restore to original pref }); } @@ -129,21 +128,22 @@ var tests = { ok(true, "window closed"); }); - function finish(good) { - ok(good, "blocklisted provider removed"); - Services.prefs.clearUserPref("social.manifest.blocked"); - setAndUpdateBlocklist(blocklistEmpty, next); - } setManifestPref("social.manifest.blocked", manifest_bad); SocialService.addProvider(manifest_bad, function(provider) { if (provider) { - setAndUpdateBlocklist(blocklistURL, function() { + // the act of blocking should cause a 'provider-removed' notification + // from SocialService. + SocialService.registerProviderListener(function providerListener() { + SocialService.unregisterProviderListener(providerListener); SocialService.getProvider(provider.origin, function(p) { - finish(p==null); - }) + ok(p==null, "blocklisted provider removed"); + Services.prefs.clearUserPref("social.manifest.blocked"); + setAndUpdateBlocklist(blocklistEmpty, next); + }); }); - } else { - finish(false); + // no callback - the act of updating should cause the listener above + // to fire. + setAndUpdateBlocklist(blocklistURL); } }); } diff --git a/browser/base/content/test/social/head.js b/browser/base/content/test/social/head.js index 88866c2a2e6..b2e99b70ec2 100644 --- a/browser/base/content/test/social/head.js +++ b/browser/base/content/test/social/head.js @@ -220,16 +220,14 @@ function updateBlocklist(aCallback) { blocklistNotifier.notify(null); } -var _originalTestBlocklistURL = null; function setAndUpdateBlocklist(aURL, aCallback) { - if (!_originalTestBlocklistURL) - _originalTestBlocklistURL = Services.prefs.getCharPref("extensions.blocklist.url"); Services.prefs.setCharPref("extensions.blocklist.url", aURL); updateBlocklist(aCallback); } -function resetBlocklist() { - Services.prefs.setCharPref("extensions.blocklist.url", _originalTestBlocklistURL); +function resetBlocklist(aCallback) { + Services.prefs.clearUserPref("extensions.blocklist.url"); + updateBlocklist(aCallback); } function setManifestPref(name, manifest) { From 1ae37e619b8a1633901cd9a9dfef24a12e996bc8 Mon Sep 17 00:00:00 2001 From: Sean Stangl Date: Thu, 25 Apr 2013 18:28:48 -0700 Subject: [PATCH 065/155] Bug 812265 - Temporarily comment out standalone JS executable renaming. r=luke --- js/src/configure.in | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/js/src/configure.in b/js/src/configure.in index 37d696c486c..a56a3c9dc16 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -234,13 +234,16 @@ MOZJS_MINOR_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.\([0-9]*\).*|\1|"` MOZJS_PATCH_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.[0-9]*[^0-9]*||"` IS_ALPHA=`echo $MOZILLA_VERSION | grep [ab]` -if test -n "$JS_STANDALONE"; then -JS_SHELL_NAME=js$MOZJS_MAJOR_VERSION -JS_CONFIG_NAME=js$MOZJS_MAJOR_VERSION-config -else +dnl XXX in a temporary bid to avoid developer anger at renaming files +dnl XXX before "js" symlinks exist, don't change names. +dnl +dnl if test -n "$JS_STANDALONE"; then +dnl JS_SHELL_NAME=js$MOZJS_MAJOR_VERSION +dnl JS_CONFIG_NAME=js$MOZJS_MAJOR_VERSION-config +dnl else JS_SHELL_NAME=js JS_CONFIG_NAME=js-config -fi +dnl fi changequote([,]) if test -n "$IS_ALPHA"; then From 8b350c11e3e861da9e697e7a0d7639794fd09e82 Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Thu, 25 Apr 2013 22:13:14 -0400 Subject: [PATCH 066/155] Backed out changeset ccdc2beb09ae (bug 865929) for mochitest and crashtest crashes. CLOSED TREE --- b2g/app/b2g.js | 1 - content/canvas/src/CanvasImageCache.cpp | 53 +------------------------ modules/libpref/src/init/all.js | 4 -- 3 files changed, 1 insertion(+), 57 deletions(-) diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 77b22411e42..24e8154ef9d 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -28,7 +28,6 @@ pref("browser.cache.memory.capacity", 1024); // kilobytes /* image cache prefs */ pref("image.cache.size", 1048576); // bytes pref("image.high_quality_downscaling.enabled", false); -pref("canvas.image.cache.limit", 10485760); // 10 MB /* offline cache prefs */ pref("browser.offline-apps.notify", false); diff --git a/content/canvas/src/CanvasImageCache.cpp b/content/canvas/src/CanvasImageCache.cpp index 0804bb88feb..f1fb2948e60 100644 --- a/content/canvas/src/CanvasImageCache.cpp +++ b/content/canvas/src/CanvasImageCache.cpp @@ -13,7 +13,6 @@ #include "nsTHashtable.h" #include "mozilla/dom/HTMLCanvasElement.h" #include "nsContentUtils.h" -#include "mozilla/Preferences.h" namespace mozilla { @@ -43,8 +42,6 @@ struct ImageCacheEntryData { nsExpirationState* GetExpirationState() { return &mState; } - size_t SizeInBytes() { return mSize.width * mSize.height * 4; } - // Key nsRefPtr mImage; nsIImageLoadingContent* mILC; @@ -82,43 +79,19 @@ public: nsAutoPtr mData; }; -static bool sPrefsInitialized = false; -static int32_t sCanvasImageCacheLimit = 0; - -class ImageCache MOZ_FINAL : public nsExpirationTracker, - public nsIObserver { +class ImageCache MOZ_FINAL : public nsExpirationTracker { public: - NS_DECL_ISUPPORTS - NS_DECL_NSIOBSERVER - // We use 3 generations of 1 second each to get a 2-3 seconds timeout. enum { GENERATION_MS = 1000 }; ImageCache() : nsExpirationTracker(GENERATION_MS) - , mSize(0) { - if (!sPrefsInitialized) { - sPrefsInitialized = true; - Preferences::AddIntVarCache(&sCanvasImageCacheLimit, "canvas.image.cache.limit", 0); - } mCache.Init(); } ~ImageCache() { AgeAllGenerations(); } - void AddObject(ImageCacheEntryData* aObject) - { - nsExpirationTracker::AddObject(aObject); - mSize += aObject->SizeInBytes(); - } - - void RemoveObject(ImageCacheEntryData* aObject) - { - nsExpirationTracker::RemoveObject(aObject); - mSize -= aObject->SizeInBytes(); - } - virtual void NotifyExpired(ImageCacheEntryData* aObject) { RemoveObject(aObject); @@ -127,24 +100,10 @@ public: } nsTHashtable mCache; - size_t mSize; }; static ImageCache* gImageCache = nullptr; -NS_IMPL_ISUPPORTS1(ImageCache, nsIObserver) - -NS_IMETHODIMP -ImageCache::Observe(nsISupports *aSubject, - const char *aTopic, - const PRUnichar *aData) -{ - if (strcmp(aTopic, "memory-pressure") == 0) { - AgeAllGenerations(); - } - return NS_OK; -} - class CanvasImageCacheShutdownObserver MOZ_FINAL : public nsIObserver { public: @@ -161,9 +120,6 @@ CanvasImageCache::NotifyDrawImage(Element* aImage, { if (!gImageCache) { gImageCache = new ImageCache(); - nsCOMPtr os = mozilla::services::GetObserverService(); - if (os) - os->AddObserver(gImageCache, "memory-pressure", false); nsContentUtils::RegisterShutdownObserver(new CanvasImageCacheShutdownObserver()); } @@ -184,13 +140,6 @@ CanvasImageCache::NotifyDrawImage(Element* aImage, entry->mData->mSurface = aSurface; entry->mData->mSize = aSize; } - - if (!sCanvasImageCacheLimit) - return; - - // Expire the image cache early if its larger than we want it to be. - while (gImageCache->mSize > size_t(sCanvasImageCacheLimit)) - gImageCache->AgeOneGeneration(); } gfxASurface* diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 6d3fee4f1a8..55385d3da3b 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -3921,10 +3921,6 @@ pref("image.multithreaded_decoding.enabled", true); // automatically determined based on the system's number of cores. pref("image.multithreaded_decoding.limit", -1); -// Limit for the canvas image cache. 0 means we don't limit the size of the -// cache. -pref("canvas.image.cache.limit", 0); - // WebGL prefs pref("gl.msaa-level", 2); pref("webgl.force-enabled", false); From a28003635b09ed7667aa0d82917f21513d87c2c5 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Tue, 23 Apr 2013 23:44:36 -0700 Subject: [PATCH 067/155] Bug 634839 (part 1) - Remove unnecessary headers (as found by include-what-you-use) from js/src/jsfoo.cpp files. r=luke. --- js/src/jsalloc.cpp | 1 + js/src/jsalloc.h | 5 ++++- js/src/jsanalyze.cpp | 4 ++-- js/src/jsapi.cpp | 13 ++++++------- js/src/jsapi.h | 1 + js/src/jsarray.cpp | 17 ++--------------- js/src/jsatom.cpp | 12 +++--------- js/src/jsbool.cpp | 9 +-------- js/src/jsclone.cpp | 5 ++--- js/src/jscntxt.cpp | 13 ++----------- js/src/jscompartment.cpp | 18 ++---------------- js/src/jscompartmentinlines.h | 2 ++ js/src/jscrashreport.cpp | 6 +++--- js/src/jsdate.cpp | 8 ++------ js/src/jsdate.h | 1 + js/src/jsdbgapi.cpp | 13 +------------ js/src/jsdhash.cpp | 7 ++++--- js/src/jsdtoa.cpp | 11 +++-------- js/src/jsdtoa.h | 1 + js/src/jsexn.cpp | 13 ++----------- js/src/jsfriendapi.cpp | 3 ++- js/src/jsfun.cpp | 17 ++--------------- js/src/jsgc.cpp | 26 ++------------------------ js/src/jsinfer.cpp | 14 ++------------ js/src/jsinterp.cpp | 19 ++----------------- js/src/jsiter.cpp | 10 ++-------- js/src/jsmath.cpp | 6 ++---- js/src/jsmemorymetrics.cpp | 1 - js/src/jsnativestack.cpp | 2 -- js/src/jsnum.cpp | 11 ++--------- js/src/jsobj.cpp | 24 +++++------------------- js/src/json.cpp | 11 ++--------- js/src/jsonparser.cpp | 3 ++- js/src/jsopcode.cpp | 17 ++++++----------- js/src/jsprf.cpp | 5 ++--- js/src/jsprobes.cpp | 17 +++++------------ js/src/jsprobes.h | 10 +++------- js/src/jspropertycache.cpp | 5 ++--- js/src/jspropertytree.cpp | 5 ++--- js/src/jspropertytree.h | 3 +++ js/src/jsproxy.cpp | 6 +++--- js/src/jsreflect.cpp | 13 ++++--------- js/src/jsscript.cpp | 11 ++--------- js/src/jsstr.cpp | 6 ++---- js/src/jstypedarray.cpp | 10 ++-------- js/src/jsutil.cpp | 13 ++----------- js/src/jswatchpoint.cpp | 4 ++-- js/src/jsweakmap.cpp | 7 +++---- js/src/jsworkers.cpp | 6 +++--- js/src/jswrapper.cpp | 12 ++---------- js/src/methodjit/StubCalls-inl.h | 2 ++ js/src/perf/jsperf.cpp | 2 ++ js/src/shell/jsoptparse.cpp | 3 +++ js/src/shell/jsoptparse.h | 4 +++- 54 files changed, 128 insertions(+), 340 deletions(-) diff --git a/js/src/jsalloc.cpp b/js/src/jsalloc.cpp index 744eb68cb9d..4b7ac6f51c0 100644 --- a/js/src/jsalloc.cpp +++ b/js/src/jsalloc.cpp @@ -5,6 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "jsalloc.h" + #include "jscntxt.h" using namespace js; diff --git a/js/src/jsalloc.h b/js/src/jsalloc.h index 7d2690b69a7..e7e64fc5407 100644 --- a/js/src/jsalloc.h +++ b/js/src/jsalloc.h @@ -7,7 +7,10 @@ #ifndef jsalloc_h_ #define jsalloc_h_ -#include "jsutil.h" +#include "js/Utility.h" +#include "jstypes.h" + +struct JSContext; namespace js { diff --git a/js/src/jsanalyze.cpp b/js/src/jsanalyze.cpp index bda8e36751e..4c1e2e1f2c2 100644 --- a/js/src/jsanalyze.cpp +++ b/js/src/jsanalyze.cpp @@ -4,16 +4,16 @@ * 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 "jsanalyze.h" + #include "mozilla/DebugOnly.h" #include "mozilla/PodOperations.h" -#include "jsanalyze.h" #include "jsautooplen.h" #include "jscompartment.h" #include "jscntxt.h" #include "jsinferinlines.h" -#include "jsobjinlines.h" using namespace js; using namespace js::analyze; diff --git a/js/src/jsapi.cpp b/js/src/jsapi.cpp index 36c59219dc9..627eca9d9d1 100644 --- a/js/src/jsapi.cpp +++ b/js/src/jsapi.cpp @@ -8,6 +8,8 @@ * JavaScript API. */ +#include "jsapi.h" + #include "mozilla/FloatingPoint.h" #include "mozilla/GuardObjects.h" #include "mozilla/PodOperations.h" @@ -18,11 +20,11 @@ #include #include #include + #include "jstypes.h" #include "jsutil.h" #include "jsclist.h" #include "jsprf.h" -#include "jsapi.h" #include "jsarray.h" #include "jsatom.h" #include "jsbool.h" @@ -43,28 +45,26 @@ #include "json.h" #include "jsobj.h" #include "jsopcode.h" -#include "jsprobes.h" #include "jsproxy.h" #include "jsscript.h" #include "jsstr.h" #include "prmjtime.h" #include "jsweakmap.h" -#include "jsworkers.h" #include "jswrapper.h" #include "jstypedarray.h" +#ifdef JS_THREADSAFE +#include "jsworkers.h" +#endif #include "builtin/Eval.h" -#include "builtin/Intl.h" #include "builtin/MapObject.h" #include "builtin/RegExp.h" #include "builtin/ParallelArray.h" -#include "ds/LifoAlloc.h" #include "frontend/BytecodeCompiler.h" #include "gc/Marking.h" #include "gc/Memory.h" #include "ion/AsmJS.h" #include "js/CharacterEncoding.h" -#include "js/MemoryMetrics.h" #include "vm/Debugger.h" #include "vm/NumericConversions.h" #include "vm/Shape.h" @@ -82,7 +82,6 @@ #include "vm/RegExpObject-inl.h" #include "vm/RegExpStatics-inl.h" #include "vm/Shape-inl.h" -#include "vm/Stack-inl.h" #include "vm/String-inl.h" #if ENABLE_YARR_JIT diff --git a/js/src/jsapi.h b/js/src/jsapi.h index fc30d420afe..0b879880cdd 100644 --- a/js/src/jsapi.h +++ b/js/src/jsapi.h @@ -16,6 +16,7 @@ #include "mozilla/StandardInteger.h" #include "mozilla/ThreadLocal.h" +#include #include #include diff --git a/js/src/jsarray.cpp b/js/src/jsarray.cpp index b7bc6fbae2f..208698b91d7 100644 --- a/js/src/jsarray.cpp +++ b/js/src/jsarray.cpp @@ -4,44 +4,33 @@ * 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 "jsarray.h" + #include "mozilla/DebugOnly.h" #include "mozilla/FloatingPoint.h" -#include "mozilla/RangedPtr.h" #include "mozilla/Util.h" -#include #include -#include #include "jsapi.h" -#include "jsarray.h" #include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" #include "jsfriendapi.h" #include "jsfun.h" -#include "jsgc.h" #include "jsinterp.h" #include "jsiter.h" -#include "jslock.h" #include "jsnum.h" #include "jsobj.h" #include "jstypes.h" #include "jsutil.h" -#include "jsversion.h" -#include "jswrapper.h" - #include "ds/Sort.h" -#include "gc/Marking.h" #include "methodjit/MethodJIT.h" -#include "methodjit/StubCalls.h" #include "methodjit/StubCalls-inl.h" #include "vm/ArgumentsObject.h" #include "vm/ForkJoin.h" #include "vm/NumericConversions.h" #include "vm/Shape.h" #include "vm/StringBuffer.h" -#include "vm/ThreadPool.h" #include "jsatominlines.h" #include "jscntxtinlines.h" @@ -51,8 +40,6 @@ #include "vm/ArgumentsObject-inl.h" #include "vm/ObjectImpl-inl.h" -#include "vm/Shape-inl.h" -#include "vm/Stack-inl.h" using namespace js; using namespace js::gc; diff --git a/js/src/jsatom.cpp b/js/src/jsatom.cpp index a675149a54a..c7a9291d689 100644 --- a/js/src/jsatom.cpp +++ b/js/src/jsatom.cpp @@ -7,31 +7,25 @@ /* * JS atom table. */ +#include "jsatom.h" + #include #include #include "mozilla/RangedPtr.h" #include "mozilla/Util.h" -#include "jstypes.h" -#include "jsutil.h" -#include "jsprf.h" #include "jsapi.h" -#include "jsatom.h" #include "jscntxt.h" -#include "jsgc.h" #include "jslock.h" -#include "jsnum.h" #include "jsstr.h" +#include "jstypes.h" #include "jsversion.h" -#include "frontend/Parser.h" #include "gc/Marking.h" #include "vm/Xdr.h" -#include "jsstrinlines.h" #include "jsatominlines.h" -#include "jsobjinlines.h" #include "vm/String-inl.h" diff --git a/js/src/jsbool.cpp b/js/src/jsbool.cpp index 02ac50c99d4..7ad65d2da33 100644 --- a/js/src/jsbool.cpp +++ b/js/src/jsbool.cpp @@ -8,26 +8,19 @@ * JS boolean implementation. */ -#include "mozilla/FloatingPoint.h" +#include "jsbool.h" #include "jstypes.h" -#include "jsutil.h" #include "jsapi.h" #include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" -#include "jsinfer.h" #include "jsversion.h" -#include "jslock.h" -#include "jsnum.h" #include "jsobj.h" -#include "jsstr.h" #include "vm/GlobalObject.h" #include "vm/StringBuffer.h" #include "jsboolinlines.h" -#include "jsinferinlines.h" #include "jsobjinlines.h" #include "vm/BooleanObject-inl.h" diff --git a/js/src/jsclone.cpp b/js/src/jsclone.cpp index 885bfc01a1b..b3ca355e0a0 100644 --- a/js/src/jsclone.cpp +++ b/js/src/jsclone.cpp @@ -28,18 +28,17 @@ * array object. */ +#include "jsclone.h" + #include "mozilla/FloatingPoint.h" -#include "jsclone.h" #include "jsdate.h" #include "jstypedarray.h" #include "jstypedarrayinlines.h" #include "vm/BooleanObject-inl.h" -#include "vm/NumberObject-inl.h" #include "vm/RegExpObject-inl.h" -#include "vm/StringObject-inl.h" using namespace js; using mozilla::LittleEndian; diff --git a/js/src/jscntxt.cpp b/js/src/jscntxt.cpp index 8fb0a62b269..90924af0c65 100644 --- a/js/src/jscntxt.cpp +++ b/js/src/jscntxt.cpp @@ -8,10 +8,10 @@ * JS execution context. */ -#include +#include "jscntxt.h" + #include #include -#include #include #include "mozilla/DebugOnly.h" @@ -25,12 +25,8 @@ #include "mozilla/Util.h" #include "jstypes.h" -#include "jsutil.h" -#include "jsclist.h" #include "jsprf.h" #include "jsatom.h" -#include "jscntxt.h" -#include "jsversion.h" #include "jsdbgapi.h" #include "jsexn.h" #include "jsfun.h" @@ -38,7 +34,6 @@ #include "jsiter.h" #include "jslock.h" #include "jsmath.h" -#include "jsnum.h" #include "jsobj.h" #include "jsopcode.h" #include "jspubtd.h" @@ -47,22 +42,18 @@ #include "jsworkers.h" #ifdef JS_ION #include "ion/Ion.h" -#include "ion/IonFrames.h" #endif #ifdef JS_METHODJIT -# include "assembler/assembler/MacroAssembler.h" # include "methodjit/MethodJIT.h" #endif #include "gc/Marking.h" #include "js/CharacterEncoding.h" #include "js/MemoryMetrics.h" -#include "frontend/TokenStream.h" #include "frontend/ParseMaps.h" #include "vm/Shape.h" #include "yarr/BumpPointerAllocator.h" -#include "jsatominlines.h" #include "jscntxtinlines.h" #include "jscompartment.h" #include "jsobjinlines.h" diff --git a/js/src/jscompartment.cpp b/js/src/jscompartment.cpp index 371afe7539a..bbafe0e63ef 100644 --- a/js/src/jscompartment.cpp +++ b/js/src/jscompartment.cpp @@ -4,11 +4,11 @@ * 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 "jscompartment.h" + #include "mozilla/DebugOnly.h" #include "jscntxt.h" -#include "jsdate.h" -#include "jscompartment.h" #include "jsgc.h" #include "jsiter.h" #include "jsmath.h" @@ -16,30 +16,16 @@ #include "jswatchpoint.h" #include "jswrapper.h" -#if ENABLE_YARR_JIT -#include "assembler/jit/ExecutableAllocator.h" -#endif -#include "assembler/wtf/Platform.h" #include "gc/Marking.h" #ifdef JS_ION #include "ion/IonCompartment.h" -#include "ion/Ion.h" #endif -#include "js/MemoryMetrics.h" #include "js/RootingAPI.h" -#include "methodjit/MethodJIT.h" -#include "methodjit/PolyIC.h" -#include "methodjit/MonoIC.h" -#include "methodjit/Retcon.h" #include "vm/Debugger.h" -#include "vm/ForkJoin.h" -#include "yarr/BumpPointerAllocator.h" #include "jsgcinlines.h" #include "jsobjinlines.h" -#include "vm/Shape-inl.h" - using namespace js; using namespace js::gc; diff --git a/js/src/jscompartmentinlines.h b/js/src/jscompartmentinlines.h index c9c747b55e9..dad00d78785 100644 --- a/js/src/jscompartmentinlines.h +++ b/js/src/jscompartmentinlines.h @@ -7,6 +7,8 @@ #ifndef jscompartment_inlines_h___ #define jscompartment_inlines_h___ +#include "jscompartment.h" + inline void JSCompartment::initGlobal(js::GlobalObject &global) { diff --git a/js/src/jscrashreport.cpp b/js/src/jscrashreport.cpp index 1ebac89fa44..0f07da6f6ba 100644 --- a/js/src/jscrashreport.cpp +++ b/js/src/jscrashreport.cpp @@ -4,13 +4,13 @@ * 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 "jsapi.h" -#include "jscntxt.h" #include "jscrashreport.h" -#include "jscrashformat.h" #include +#include "jsapi.h" +#include "jscrashformat.h" + using namespace js; using namespace js::crash; diff --git a/js/src/jsdate.cpp b/js/src/jsdate.cpp index 7eac115923c..5636088aba1 100644 --- a/js/src/jsdate.cpp +++ b/js/src/jsdate.cpp @@ -8,6 +8,8 @@ * JS date methods. */ +#include "jsdate.h" + #include "mozilla/FloatingPoint.h" #include "mozilla/Util.h" @@ -23,7 +25,6 @@ #include #include #include -#include #include #include "jstypes.h" @@ -33,12 +34,10 @@ #include "jsapi.h" #include "jsversion.h" #include "jscntxt.h" -#include "jsdate.h" #include "jsinterp.h" #include "jsnum.h" #include "jsobj.h" #include "jsstr.h" -#include "jslibmath.h" #include "vm/DateTime.h" #include "vm/GlobalObject.h" @@ -46,11 +45,8 @@ #include "vm/String.h" #include "vm/StringBuffer.h" -#include "jsinferinlines.h" #include "jsobjinlines.h" -#include "vm/Stack-inl.h" - using namespace js; using namespace js::types; diff --git a/js/src/jsdate.h b/js/src/jsdate.h index 67c2ca06798..68711f6e0a4 100644 --- a/js/src/jsdate.h +++ b/js/src/jsdate.h @@ -15,6 +15,7 @@ #include +#include "jsapi.h" #include "jstypes.h" extern "C" { diff --git a/js/src/jsdbgapi.cpp b/js/src/jsdbgapi.cpp index dffdfc6f6bb..1d5298b6b2f 100644 --- a/js/src/jsdbgapi.cpp +++ b/js/src/jsdbgapi.cpp @@ -8,21 +8,16 @@ * JS debugging API. */ -#include "mozilla/DebugOnly.h" +#include "jsdbgapi.h" #include #include "jsprvtd.h" #include "jstypes.h" -#include "jsutil.h" -#include "jsclist.h" #include "jsapi.h" #include "jscntxt.h" -#include "jsversion.h" -#include "jsdbgapi.h" #include "jsfun.h" #include "jsgc.h" #include "jsinterp.h" -#include "jslock.h" #include "jsobj.h" #include "jsopcode.h" #include "jsscript.h" @@ -30,9 +25,7 @@ #include "jswatchpoint.h" #include "jswrapper.h" -#include "gc/Marking.h" #include "frontend/BytecodeEmitter.h" -#include "frontend/Parser.h" #include "vm/Debugger.h" #include "vm/Shape.h" @@ -46,15 +39,11 @@ #include "jsinterpinlines.h" #include "jsscriptinlines.h" -#include "vm/Shape-inl.h" #include "vm/Stack-inl.h" -#include "jsautooplen.h" - using namespace js; using namespace js::gc; -using mozilla::DebugOnly; using mozilla::PodZero; JS_PUBLIC_API(JSBool) diff --git a/js/src/jsdhash.cpp b/js/src/jsdhash.cpp index 00b0dbdbc04..9006b56b1a8 100644 --- a/js/src/jsdhash.cpp +++ b/js/src/jsdhash.cpp @@ -9,10 +9,11 @@ * * Try to keep this file in sync with xpcom/glue/pldhash.cpp. */ -#include -#include -#include #include "jsdhash.h" + +#include +#include + #include "jsutil.h" using namespace js; diff --git a/js/src/jsdtoa.cpp b/js/src/jsdtoa.cpp index 9d94bebaf5e..1511211a0a5 100644 --- a/js/src/jsdtoa.cpp +++ b/js/src/jsdtoa.cpp @@ -7,16 +7,11 @@ /* * Portable double to alphanumeric string and back converters. */ -#include "jstypes.h" #include "jsdtoa.h" -#include "jsprf.h" -#include "jsapi.h" -#include "jsprvtd.h" -#include "jsnum.h" -#include "jslibmath.h" -#include "jscntxt.h" -#include "jsobjinlines.h" +#include "jstypes.h" +#include "jsprf.h" +#include "jsutil.h" using namespace js; diff --git a/js/src/jsdtoa.h b/js/src/jsdtoa.h index dfd5393d109..b1be05e5e32 100644 --- a/js/src/jsdtoa.h +++ b/js/src/jsdtoa.h @@ -10,6 +10,7 @@ * Public interface to portable double-precision floating point to string * and back conversion package. */ +#include struct DtoaState; diff --git a/js/src/jsexn.cpp b/js/src/jsexn.cpp index 57a2710c23e..dabe839c285 100644 --- a/js/src/jsexn.cpp +++ b/js/src/jsexn.cpp @@ -7,6 +7,8 @@ /* * JS standard exception implementation. */ +#include "jsexn.h" + #include #include @@ -15,31 +17,20 @@ #include "jstypes.h" #include "jsutil.h" -#include "jsprf.h" #include "jsapi.h" #include "jscntxt.h" #include "jsversion.h" -#include "jsexn.h" #include "jsfun.h" -#include "jsgc.h" -#include "jsinterp.h" #include "jsnum.h" #include "jsobj.h" -#include "jsopcode.h" #include "jsscript.h" -#include "jswrapper.h" #include "gc/Marking.h" #include "vm/GlobalObject.h" -#include "vm/Shape.h" #include "vm/StringBuffer.h" -#include "jsinferinlines.h" #include "jsobjinlines.h" -#include "vm/Stack-inl.h" -#include "vm/String-inl.h" - using namespace js; using namespace js::gc; using namespace js::types; diff --git a/js/src/jsfriendapi.cpp b/js/src/jsfriendapi.cpp index f31fe5fe8c8..5735f10572c 100644 --- a/js/src/jsfriendapi.cpp +++ b/js/src/jsfriendapi.cpp @@ -4,13 +4,14 @@ * 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 "jsfriendapi.h" + #include "mozilla/GuardObjects.h" #include "mozilla/PodOperations.h" #include "mozilla/StandardInteger.h" #include "jscntxt.h" #include "jscompartment.h" -#include "jsfriendapi.h" #include "jsgc.h" #include "jswrapper.h" #include "jsweakmap.h" diff --git a/js/src/jsfun.cpp b/js/src/jsfun.cpp index 65d35197f89..7030b753ac8 100644 --- a/js/src/jsfun.cpp +++ b/js/src/jsfun.cpp @@ -7,6 +7,8 @@ /* * JS function support. */ +#include "jsfun.h" + #include #include "mozilla/PodOperations.h" @@ -14,22 +16,12 @@ #include "mozilla/Util.h" #include "jstypes.h" -#include "jsutil.h" #include "jsapi.h" #include "jsarray.h" #include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" -#include "jsexn.h" -#include "jsfun.h" -#include "jsgc.h" #include "jsinterp.h" -#include "jsiter.h" -#include "jslock.h" -#include "jsnum.h" #include "jsobj.h" -#include "jsopcode.h" -#include "jspropertytree.h" #include "jsproxy.h" #include "jsscript.h" #include "jsstr.h" @@ -38,8 +30,6 @@ #include "frontend/BytecodeCompiler.h" #include "frontend/TokenStream.h" #include "gc/Marking.h" -#include "vm/Debugger.h" -#include "vm/ScopeObject.h" #include "vm/Shape.h" #include "vm/StringBuffer.h" #include "vm/Xdr.h" @@ -48,15 +38,12 @@ #include "methodjit/MethodJIT.h" #endif -#include "jsatominlines.h" #include "jsfuninlines.h" #include "jsinferinlines.h" #include "jsinterpinlines.h" #include "jsobjinlines.h" #include "jsscriptinlines.h" -#include "vm/ArgumentsObject-inl.h" -#include "vm/ScopeObject-inl.h" #include "vm/Stack-inl.h" #ifdef JS_ION diff --git a/js/src/jsgc.cpp b/js/src/jsgc.cpp index c1d7e71f99d..55f238ba34b 100644 --- a/js/src/jsgc.cpp +++ b/js/src/jsgc.cpp @@ -6,7 +6,8 @@ /* JS Mark-and-Sweep Garbage Collector. */ -#include "mozilla/Attributes.h" +#include "jsgc.h" + #include "mozilla/DebugOnly.h" #include "mozilla/Util.h" @@ -39,61 +40,38 @@ * barriers on them. */ -#include #include /* for memset used when DEBUG */ #include "jstypes.h" #include "jsutil.h" -#include "jsclist.h" -#include "jsprf.h" #include "jsapi.h" #include "jsatom.h" #include "jscompartment.h" -#include "jscrashreport.h" -#include "jscrashformat.h" #include "jscntxt.h" -#include "jsversion.h" -#include "jsdbgapi.h" -#include "jsexn.h" -#include "jsfun.h" -#include "jsgc.h" -#include "jsinterp.h" -#include "jsiter.h" -#include "jslock.h" -#include "jsnum.h" #include "jsobj.h" -#include "jsprobes.h" #include "jsproxy.h" #include "jsscript.h" #include "jswatchpoint.h" #include "jsweakmap.h" -#include "builtin/MapObject.h" -#include "frontend/Parser.h" #include "gc/FindSCCs.h" #include "gc/GCInternals.h" #include "gc/Marking.h" #include "gc/Memory.h" #include "methodjit/MethodJIT.h" #include "vm/Debugger.h" -#include "vm/ForkJoin.h" #include "vm/Shape.h" #include "vm/String.h" #include "vm/ForkJoin.h" #include "ion/IonCode.h" #ifdef JS_ION # include "ion/BaselineJIT.h" -# include "ion/IonMacroAssembler.h" -#include "ion/IonFrameIterator.h" #endif #include "jsgcinlines.h" -#include "jsinterpinlines.h" #include "jsobjinlines.h" #include "gc/FindSCCs-inl.h" -#include "gc/Nursery-inl.h" -#include "vm/ScopeObject-inl.h" #include "vm/String-inl.h" #ifdef XP_WIN diff --git a/js/src/jsinfer.cpp b/js/src/jsinfer.cpp index a102d53f3e9..12d659a6472 100644 --- a/js/src/jsinfer.cpp +++ b/js/src/jsinfer.cpp @@ -4,25 +4,19 @@ * 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 "jsinfer.h" + #include "mozilla/DebugOnly.h" #include "mozilla/PodOperations.h" #include "jsapi.h" #include "jsautooplen.h" -#include "jsbool.h" -#include "jscntxt.h" -#include "jsdate.h" -#include "jsexn.h" #include "jsfriendapi.h" #include "jsgc.h" -#include "jsinfer.h" -#include "jsmath.h" -#include "jsnum.h" #include "jsobj.h" #include "jsscript.h" #include "jscntxt.h" #include "jsstr.h" -#include "jsiter.h" #include "jsworkers.h" #ifdef JS_ION @@ -30,15 +24,11 @@ #include "ion/Ion.h" #include "ion/IonCompartment.h" #endif -#include "frontend/TokenStream.h" #include "gc/Marking.h" #include "js/MemoryMetrics.h" #include "methodjit/MethodJIT.h" #include "methodjit/Retcon.h" #include "vm/Shape.h" -#ifdef JS_METHODJIT -# include "assembler/assembler/MacroAssembler.h" -#endif #include "jsatominlines.h" #include "jsgcinlines.h" diff --git a/js/src/jsinterp.cpp b/js/src/jsinterp.cpp index 81bb4b884e9..b292d945965 100644 --- a/js/src/jsinterp.cpp +++ b/js/src/jsinterp.cpp @@ -8,30 +8,25 @@ * JavaScript bytecode interpreter. */ +#include "jsinterp.h" + #include "mozilla/DebugOnly.h" #include "mozilla/FloatingPoint.h" #include "mozilla/PodOperations.h" #include #include -#include #include "jstypes.h" -#include "jsutil.h" #include "jsprf.h" #include "jsapi.h" #include "jsarray.h" #include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" -#include "jsdate.h" #include "jsversion.h" #include "jsdbgapi.h" #include "jsfun.h" #include "jsgc.h" -#include "jsinterp.h" #include "jsiter.h" -#include "jslibmath.h" -#include "jslock.h" #include "jsnum.h" #include "jsobj.h" #include "jsopcode.h" @@ -40,8 +35,6 @@ #include "jsstr.h" #include "builtin/Eval.h" -#include "gc/Marking.h" -#include "ion/AsmJS.h" #include "vm/Debugger.h" #include "vm/Shape.h" @@ -63,21 +56,13 @@ #include "jsobjinlines.h" #include "jsopcodeinlines.h" #include "jsprobes.h" -#include "jspropertycacheinlines.h" #include "jsscriptinlines.h" -#include "jstypedarrayinlines.h" #include "builtin/Iterator-inl.h" -#include "vm/Shape-inl.h" #include "vm/Stack-inl.h" -#include "vm/String-inl.h" #include "jsautooplen.h" -#if defined(JS_METHODJIT) && defined(JS_MONOIC) -#include "methodjit/MonoIC.h" -#endif - #if JS_TRACE_LOGGING #include "TraceLogging.h" #endif diff --git a/js/src/jsiter.cpp b/js/src/jsiter.cpp index 1f66164de20..7561e504597 100644 --- a/js/src/jsiter.cpp +++ b/js/src/jsiter.cpp @@ -6,6 +6,8 @@ /* JavaScript iterators. */ +#include "jsiter.h" + #include "mozilla/PodOperations.h" #include "mozilla/Util.h" @@ -14,23 +16,15 @@ #include "jsapi.h" #include "jsarray.h" #include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" #include "jsversion.h" -#include "jsexn.h" -#include "jsfun.h" #include "jsgc.h" #include "jsinterp.h" -#include "jsiter.h" -#include "jslock.h" -#include "jsnum.h" #include "jsobj.h" #include "jsopcode.h" #include "jsproxy.h" #include "jsscript.h" -#include "ds/Sort.h" -#include "frontend/TokenStream.h" #include "gc/Marking.h" #include "vm/GlobalObject.h" #include "vm/Shape.h" diff --git a/js/src/jsmath.cpp b/js/src/jsmath.cpp index 762b76822e1..8df92a58103 100644 --- a/js/src/jsmath.cpp +++ b/js/src/jsmath.cpp @@ -8,6 +8,8 @@ * JS math package. */ +#include "jsmath.h" + #include "mozilla/Constants.h" #include "mozilla/FloatingPoint.h" #include "mozilla/MathAlgorithms.h" @@ -19,13 +21,9 @@ #include "jsatom.h" #include "jscntxt.h" #include "jsversion.h" -#include "jslock.h" -#include "jsmath.h" -#include "jsnum.h" #include "jslibmath.h" #include "jscompartment.h" -#include "jsinferinlines.h" #include "jsobjinlines.h" using namespace js; diff --git a/js/src/jsmemorymetrics.cpp b/js/src/jsmemorymetrics.cpp index 8ca67630cdc..7d6e4895889 100644 --- a/js/src/jsmemorymetrics.cpp +++ b/js/src/jsmemorymetrics.cpp @@ -18,7 +18,6 @@ #include "ion/BaselineJIT.h" #include "ion/Ion.h" -#include "ion/IonCode.h" #include "vm/Shape.h" #include "jsobjinlines.h" diff --git a/js/src/jsnativestack.cpp b/js/src/jsnativestack.cpp index cd301292d72..7b1f602b2d3 100644 --- a/js/src/jsnativestack.cpp +++ b/js/src/jsnativestack.cpp @@ -4,8 +4,6 @@ * 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 -#include "jstypes.h" #include "jsnativestack.h" #ifdef XP_WIN diff --git a/js/src/jsnum.cpp b/js/src/jsnum.cpp index 9fe7a512819..562bb769483 100644 --- a/js/src/jsnum.cpp +++ b/js/src/jsnum.cpp @@ -8,6 +8,8 @@ * JS number type and wrapper class. */ +#include "jsnum.h" + #include "mozilla/FloatingPoint.h" #include "mozilla/PodOperations.h" #include "mozilla/RangedPtr.h" @@ -24,7 +26,6 @@ #include #include #include -#include #include #include "jstypes.h" @@ -34,22 +35,14 @@ #include "jscntxt.h" #include "jsversion.h" #include "jsdtoa.h" -#include "jsgc.h" -#include "jsinterp.h" -#include "jsnum.h" #include "jsobj.h" -#include "jsopcode.h" -#include "jsprf.h" #include "jsstr.h" -#include "jslibmath.h" #include "vm/GlobalObject.h" #include "vm/NumericConversions.h" -#include "vm/Shape.h" #include "vm/StringBuffer.h" #include "jsatominlines.h" -#include "jsinferinlines.h" #include "jsnuminlines.h" #include "jsobjinlines.h" diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 08f8ebb0fdf..d41c1343ad6 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -7,6 +7,8 @@ /* * JS object implementation. */ +#include "jsobj.h" + #include #include @@ -18,19 +20,12 @@ #include "jsapi.h" #include "jsarray.h" #include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" -#include "jsdate.h" -#include "jsversion.h" #include "jsfun.h" #include "jsgc.h" #include "jsinterp.h" #include "jsiter.h" -#include "jslock.h" -#include "jsmath.h" #include "jsnum.h" -#include "jsobj.h" -#include "jsonparser.h" #include "jsopcode.h" #include "jsprobes.h" #include "jsprototypes.h" @@ -38,36 +33,27 @@ #include "jsscript.h" #include "jsstr.h" #include "jsdbgapi.h" -#include "json.h" #include "jswatchpoint.h" #include "jswrapper.h" -#include "builtin/MapObject.h" -#include "builtin/Module.h" -#include "builtin/ParallelArray.h" -#include "frontend/BytecodeCompiler.h" -#include "frontend/Parser.h" +#include "frontend/TokenStream.h" #include "gc/Marking.h" #include "js/MemoryMetrics.h" #include "vm/Shape.h" -#include "vm/StringBuffer.h" -#include "vm/Xdr.h" #include "jsatominlines.h" #include "jsboolinlines.h" #include "jscntxtinlines.h" -#include "jsinterpinlines.h" +#include "jscompartmentinlines.h" #include "jsobjinlines.h" #include "jsscriptinlines.h" -#include "jscompartmentinlines.h" +#include "jstypedarrayinlines.h" #include "vm/BooleanObject-inl.h" #include "vm/NumberObject-inl.h" #include "vm/Shape-inl.h" #include "vm/StringObject-inl.h" -#include "jsautooplen.h" - using namespace js; using namespace js::gc; using namespace js::types; diff --git a/js/src/json.cpp b/js/src/json.cpp index 8b9875fb912..b55fb45fca9 100644 --- a/js/src/json.cpp +++ b/js/src/json.cpp @@ -4,36 +4,29 @@ * 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 "json.h" + #include "mozilla/FloatingPoint.h" #include #include "jsapi.h" #include "jsarray.h" #include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" -#include "jsfun.h" #include "jsinterp.h" -#include "jsiter.h" #include "jsnum.h" #include "jsobj.h" -#include "json.h" #include "jsonparser.h" -#include "jsprf.h" #include "jsstr.h" #include "jstypes.h" #include "jsutil.h" -#include "frontend/TokenStream.h" #include "vm/StringBuffer.h" #include "jsatominlines.h" #include "jsboolinlines.h" -#include "jsinferinlines.h" #include "jsobjinlines.h" -#include "vm/Stack-inl.h" - using namespace js; using namespace js::gc; using namespace js::types; diff --git a/js/src/jsonparser.cpp b/js/src/jsonparser.cpp index 9c89d08b499..8eae90b6b81 100644 --- a/js/src/jsonparser.cpp +++ b/js/src/jsonparser.cpp @@ -4,9 +4,10 @@ * 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 "jsonparser.h" + #include "jsarray.h" #include "jsnum.h" -#include "jsonparser.h" #include "vm/StringBuffer.h" diff --git a/js/src/jsopcode.cpp b/js/src/jsopcode.cpp index 699c49968e5..4419b12bfe6 100644 --- a/js/src/jsopcode.cpp +++ b/js/src/jsopcode.cpp @@ -8,38 +8,29 @@ * JS bytecode descriptors, disassemblers, and (expression) decompilers. */ -#include "mozilla/FloatingPoint.h" +#include "jsopcode.h" + #include "mozilla/Util.h" -#ifdef HAVE_MEMORY_H -#include -#endif #include #include -#include #include #include "jstypes.h" #include "jsutil.h" #include "jsprf.h" #include "jsapi.h" -#include "jsarray.h" #include "jsatom.h" #include "jscntxt.h" -#include "jsversion.h" #include "jsfun.h" -#include "jsiter.h" #include "jsnum.h" #include "jsobj.h" -#include "jsopcode.h" #include "jsscript.h" #include "jsstr.h" -#include "ds/Sort.h" #include "frontend/BytecodeEmitter.h" #include "frontend/TokenStream.h" #include "js/CharacterEncoding.h" -#include "vm/Debugger.h" #include "vm/Shape.h" #include "vm/StringBuffer.h" @@ -268,6 +259,7 @@ PCCounts::countName(JSOp op, size_t which) #ifdef DEBUG +#ifdef JS_ION void js::DumpIonScriptCounts(Sprinter *sp, ion::IonScriptCounts *ionCounts) { @@ -284,6 +276,7 @@ js::DumpIonScriptCounts(Sprinter *sp, ion::IonScriptCounts *ionCounts) Sprint(sp, "%s\n", block.code()); } } +#endif void js_DumpPCCounts(JSContext *cx, HandleScript script, js::Sprinter *sp) @@ -319,12 +312,14 @@ js_DumpPCCounts(JSContext *cx, HandleScript script, js::Sprinter *sp) pc = next; } +#ifdef JS_ION ion::IonScriptCounts *ionCounts = script->getIonCounts(); while (ionCounts) { DumpIonScriptCounts(sp, ionCounts); ionCounts = ionCounts->previous(); } +#endif } /* diff --git a/js/src/jsprf.cpp b/js/src/jsprf.cpp index 08fb08ff3fb..781bf615708 100644 --- a/js/src/jsprf.cpp +++ b/js/src/jsprf.cpp @@ -9,17 +9,16 @@ ** ** Author: Kipp E.B. Hickman */ +#include "jsprf.h" + #include #include #include #include -#include "jsprf.h" #include "jsutil.h" #include "jspubtd.h" #include "jsstr.h" -#include "js/CharacterEncoding.h" - using namespace js; /* diff --git a/js/src/jsprobes.cpp b/js/src/jsprobes.cpp index b2217b1b8c1..c470f1fbbe4 100644 --- a/js/src/jsprobes.cpp +++ b/js/src/jsprobes.cpp @@ -4,21 +4,14 @@ * 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 "jsapi.h" -#include "jsutil.h" -#include "jsatom.h" -#include "jscntxt.h" -#include "jsdbgapi.h" -#include "jsfun.h" -#include "jsinterp.h" -#include "jsobj.h" #include "jsprobes.h" + +#include "jscntxt.h" #include "jsscript.h" -#include "jsstr.h" -#include "methodjit/Compiler.h" - -#include "jsobjinlines.h" +#ifdef INCLUDE_MOZILLA_DTRACE +#include "jsscriptinlines.h" +#endif #define TYPEOF(cx,v) (JSVAL_IS_NULL(v) ? JSTYPE_NULL : JS_TypeOfValue(cx,v)) diff --git a/js/src/jsprobes.h b/js/src/jsprobes.h index 0bd391a2b70..d76dad8cd43 100644 --- a/js/src/jsprobes.h +++ b/js/src/jsprobes.h @@ -12,20 +12,16 @@ #endif #include "jspubtd.h" #include "jsprvtd.h" -#include "jsscript.h" +#include "jscntxt.h" #include "jsobj.h" - -#ifdef JS_METHODJIT -#include "methodjit/MethodJIT.h" -#endif - -#include "vm/ObjectImpl-inl.h" +#include "jsscript.h" namespace js { namespace mjit { struct NativeAddressInfo; struct JSActiveFrame; +struct JITChunk; } namespace Probes { diff --git a/js/src/jspropertycache.cpp b/js/src/jspropertycache.cpp index 98a84f21df7..19e2f8e3437 100644 --- a/js/src/jspropertycache.cpp +++ b/js/src/jspropertycache.cpp @@ -4,15 +4,14 @@ * 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 "jspropertycache.h" + #include "mozilla/PodOperations.h" #include "jscntxt.h" -#include "jsnum.h" -#include "jspropertycache.h" #include "jsobjinlines.h" #include "jsopcodeinlines.h" -#include "jspropertycacheinlines.h" using namespace js; diff --git a/js/src/jspropertytree.cpp b/js/src/jspropertytree.cpp index 6e8843821c1..4b5851ad086 100644 --- a/js/src/jspropertytree.cpp +++ b/js/src/jspropertytree.cpp @@ -4,17 +4,16 @@ * 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 "jspropertytree.h" + #include "jstypes.h" -#include "jsprf.h" #include "jsapi.h" #include "jscntxt.h" #include "jsgc.h" -#include "jspropertytree.h" #include "vm/Shape.h" #include "jsgcinlines.h" -#include "jsobjinlines.h" #include "vm/Shape-inl.h" diff --git a/js/src/jspropertytree.h b/js/src/jspropertytree.h index d269e2937c4..c12d78fc174 100644 --- a/js/src/jspropertytree.h +++ b/js/src/jspropertytree.h @@ -7,7 +7,10 @@ #ifndef jspropertytree_h___ #define jspropertytree_h___ +#include "jsalloc.h" + #include "js/HashTable.h" +#include "js/RootingAPI.h" namespace js { diff --git a/js/src/jsproxy.cpp b/js/src/jsproxy.cpp index 26dbc47c419..7beb9d08e00 100644 --- a/js/src/jsproxy.cpp +++ b/js/src/jsproxy.cpp @@ -4,17 +4,17 @@ * 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 "jsproxy.h" + #include + #include "jsapi.h" #include "jscntxt.h" #include "jsfun.h" #include "jsgc.h" #include "jsprvtd.h" -#include "jsnum.h" -#include "jsproxy.h" #include "gc/Marking.h" -#include "vm/Shape.h" #include "jsatominlines.h" #include "jsinferinlines.h" diff --git a/js/src/jsreflect.cpp b/js/src/jsreflect.cpp index 4a1ec410e03..2951fb1c968 100644 --- a/js/src/jsreflect.cpp +++ b/js/src/jsreflect.cpp @@ -6,22 +6,17 @@ /* JS reflection package. */ +#include "jsreflect.h" + #include #include "mozilla/DebugOnly.h" #include "mozilla/Util.h" #include "jspubtd.h" +#include "jsarray.h" #include "jsatom.h" #include "jsobj.h" -#include "jsreflect.h" -#include "jsprf.h" -#include "jsiter.h" -#include "jsbool.h" -#include "jsinferinlines.h" -#include "jsobjinlines.h" -#include "jsarray.h" -#include "jsnum.h" #include "frontend/Parser.h" #include "frontend/ParseNode-inl.h" @@ -29,7 +24,7 @@ #include "js/CharacterEncoding.h" #include "vm/RegExpObject.h" -#include "jsscriptinlines.h" +#include "jsobjinlines.h" using namespace js; using namespace js::frontend; diff --git a/js/src/jsscript.cpp b/js/src/jsscript.cpp index 25519dea164..4c0399365a4 100644 --- a/js/src/jsscript.cpp +++ b/js/src/jsscript.cpp @@ -8,31 +8,25 @@ * JS script operations. */ +#include "jsscript.h" + #include #include "mozilla/PodOperations.h" #include "jstypes.h" #include "jsutil.h" -#include "jscrashreport.h" -#include "jsprf.h" #include "jsapi.h" #include "jsatom.h" #include "jscntxt.h" -#include "jsversion.h" #include "jsdbgapi.h" #include "jsfun.h" #include "jsgc.h" #include "jsinterp.h" -#include "jslock.h" -#include "jsnum.h" #include "jsopcode.h" -#include "jsscript.h" #include "gc/Marking.h" #include "frontend/BytecodeEmitter.h" -#include "frontend/Parser.h" -#include "js/MemoryMetrics.h" #include "methodjit/MethodJIT.h" #include "ion/IonCode.h" #include "ion/BaselineJIT.h" @@ -46,7 +40,6 @@ #include "jsobjinlines.h" #include "jsscriptinlines.h" -#include "frontend/SharedContext-inl.h" #include "vm/RegExpObject-inl.h" using namespace js; diff --git a/js/src/jsstr.cpp b/js/src/jsstr.cpp index 3b42251e622..aa7585b9d13 100644 --- a/js/src/jsstr.cpp +++ b/js/src/jsstr.cpp @@ -15,6 +15,8 @@ * allocations in the same native method. */ +#include "jsstr.h" + #include "mozilla/Attributes.h" #include "mozilla/CheckedInt.h" #include "mozilla/FloatingPoint.h" @@ -32,16 +34,12 @@ #include "jscntxt.h" #include "jsgc.h" #include "jsinterp.h" -#include "jslock.h" #include "jsnum.h" #include "jsobj.h" #include "jsopcode.h" -#include "jsprobes.h" -#include "jsstr.h" #include "jsversion.h" #include "builtin/RegExp.h" -#include "js/HashTable.h" #include "vm/GlobalObject.h" #include "vm/NumericConversions.h" #include "vm/RegExpObject.h" diff --git a/js/src/jstypedarray.cpp b/js/src/jstypedarray.cpp index 7fd586dc8a2..29e1c6971f6 100644 --- a/js/src/jstypedarray.cpp +++ b/js/src/jstypedarray.cpp @@ -4,32 +4,27 @@ * 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 "jstypedarray.h" + #include -#include "mozilla/DebugOnly.h" #include "mozilla/FloatingPoint.h" #include "mozilla/PodOperations.h" #include "jstypes.h" #include "jsutil.h" -#include "jsprf.h" #include "jsapi.h" #include "jsarray.h" -#include "jsatom.h" -#include "jsbool.h" #include "jscntxt.h" #include "jscpucfg.h" #include "jsversion.h" #include "jsgc.h" #include "jsinterp.h" -#include "jslock.h" #include "jsnum.h" #include "jsobj.h" -#include "jstypedarray.h" #include "gc/Barrier.h" #include "gc/Marking.h" -#include "gc/StoreBuffer.h" #include "vm/GlobalObject.h" #include "vm/NumericConversions.h" @@ -50,7 +45,6 @@ using namespace js; using namespace js::gc; using namespace js::types; -using mozilla::DebugOnly; using mozilla::PodCopy; /* diff --git a/js/src/jsutil.cpp b/js/src/jsutil.cpp index fc434100244..55b128367a8 100644 --- a/js/src/jsutil.cpp +++ b/js/src/jsutil.cpp @@ -6,28 +6,20 @@ /* Various JS utility functions. */ +#include "jsutil.h" + #include "mozilla/Assertions.h" -#include "mozilla/Attributes.h" #include "mozilla/PodOperations.h" #include -#include #include "jstypes.h" -#include "jsutil.h" #ifdef WIN32 # include "jswin.h" -#else -# include #endif -#include "js/TemplateLib.h" #include "js/Utility.h" -#if USE_ZLIB -#include "zlib.h" -#endif - using namespace js; using mozilla::PodArrayZero; @@ -169,7 +161,6 @@ JS_Assert(const char *s, const char *file, int ln) #ifdef JS_BASIC_STATS #include -#include /* * Histogram bins count occurrences of values <= the bin label, as follows: diff --git a/js/src/jswatchpoint.cpp b/js/src/jswatchpoint.cpp index 42b6a272bd8..a4caca08e3c 100644 --- a/js/src/jswatchpoint.cpp +++ b/js/src/jswatchpoint.cpp @@ -4,11 +4,11 @@ * 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 "jsatom.h" #include "jswatchpoint.h" +#include "jsatom.h" + #include "gc/Marking.h" -#include "gc/StoreBuffer.h" #include "jsobjinlines.h" diff --git a/js/src/jsweakmap.cpp b/js/src/jsweakmap.cpp index fe424e64a21..f032b085123 100644 --- a/js/src/jsweakmap.cpp +++ b/js/src/jsweakmap.cpp @@ -4,18 +4,17 @@ * 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 "jsweakmap.h" + #include + #include "jsapi.h" #include "jscntxt.h" #include "jsfriendapi.h" -#include "jsgc.h" #include "jsobj.h" -#include "jsweakmap.h" -#include "gc/Marking.h" #include "vm/GlobalObject.h" -#include "jsgcinlines.h" #include "jsobjinlines.h" using namespace js; diff --git a/js/src/jsworkers.cpp b/js/src/jsworkers.cpp index f6a2e279f74..190212e8938 100644 --- a/js/src/jsworkers.cpp +++ b/js/src/jsworkers.cpp @@ -4,11 +4,11 @@ * 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 "mozilla/DebugOnly.h" - #include "jsworkers.h" -#if JS_ION +#include "mozilla/DebugOnly.h" + +#ifdef JS_PARALLEL_COMPILATION # include "ion/AsmJS.h" # include "ion/IonBuilder.h" # include "ion/ExecutionModeInlines.h" diff --git a/js/src/jswrapper.cpp b/js/src/jswrapper.cpp index 1ba7bd75a5b..45b643b9957 100644 --- a/js/src/jswrapper.cpp +++ b/js/src/jswrapper.cpp @@ -4,26 +4,18 @@ * 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 "jswrapper.h" + #include "jsapi.h" #include "jscntxt.h" #include "jscompartment.h" #include "jsexn.h" #include "jsgc.h" #include "jsiter.h" -#include "jsnum.h" -#include "jswrapper.h" - -#ifdef JS_METHODJIT -# include "assembler/jit/ExecutableAllocator.h" -#endif -#include "gc/Marking.h" -#include "methodjit/PolyIC.h" -#include "methodjit/MonoIC.h" #include "jsobjinlines.h" #include "builtin/Iterator-inl.h" -#include "vm/RegExpObject-inl.h" using namespace js; using namespace js::gc; diff --git a/js/src/methodjit/StubCalls-inl.h b/js/src/methodjit/StubCalls-inl.h index 47f4725e04f..289158980fd 100644 --- a/js/src/methodjit/StubCalls-inl.h +++ b/js/src/methodjit/StubCalls-inl.h @@ -7,6 +7,8 @@ #if !defined jslogic_h_inl__ && defined JS_METHODJIT #define jslogic_h_inl__ +#include "methodjit/StubCalls.h" + namespace js { namespace mjit { diff --git a/js/src/perf/jsperf.cpp b/js/src/perf/jsperf.cpp index eb4eeef4905..556e64b2d7b 100644 --- a/js/src/perf/jsperf.cpp +++ b/js/src/perf/jsperf.cpp @@ -4,10 +4,12 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "jsperf.h" + #include "jscntxt.h" /* for error messages */ #include "jsobj.h" /* for unwrapping without a context */ #include "jsobjinlines.h" +#include "vm/ObjectImpl-inl.h" using JS::PerfMeasurement; diff --git a/js/src/shell/jsoptparse.cpp b/js/src/shell/jsoptparse.cpp index 0556b747eb7..1d7b7a676ce 100644 --- a/js/src/shell/jsoptparse.cpp +++ b/js/src/shell/jsoptparse.cpp @@ -5,9 +5,12 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "jsoptparse.h" + #include #include +#include "jsutil.h" + using namespace js; using namespace js::cli; using namespace js::cli::detail; diff --git a/js/src/shell/jsoptparse.h b/js/src/shell/jsoptparse.h index 9e52cb97871..b4bf5ba477a 100644 --- a/js/src/shell/jsoptparse.h +++ b/js/src/shell/jsoptparse.h @@ -9,8 +9,10 @@ #include -#include "js/Vector.h" #include "jsalloc.h" +#include "jsutil.h" + +#include "js/Vector.h" namespace js { namespace cli { From 524c852af1bfd0ec8b52ca01257986e9f58c503f Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Thu, 25 Apr 2013 19:44:22 -0700 Subject: [PATCH 068/155] Bug 855966 - Warn more harshly about test_interfaces. r+sr=bz --- dom/tests/mochitest/general/test_interfaces.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/dom/tests/mochitest/general/test_interfaces.html b/dom/tests/mochitest/general/test_interfaces.html index 263ab12910d..3cec6bbcaf2 100644 --- a/dom/tests/mochitest/general/test_interfaces.html +++ b/dom/tests/mochitest/general/test_interfaces.html @@ -20,6 +20,10 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=766694 /** Test for Bug 766694 **/ +// This is a list of all interfaces that are exposed to every webpage. Please only +// add things to this list with great care. + +// IMPORTANT: Do not change this list without review from a DOM peer! var interfaceNamesInGlobalScope = [ "MozApplicationEvent", @@ -545,6 +549,10 @@ var interfaceNamesInGlobalScope = "StyleSheetRemovedEvent", "MozMobileMessageThread", ] +// IMPORTANT: Do not change this list without review from a DOM peer! + +// If your interface is named nsIDOMSomeInterface and you don't mean to expose +// it to every webpage, simply change its name to nsISomeInterface to fix this problem. for (var i in SpecialPowers.Components.interfaces) { var s = i.toString(); @@ -556,7 +564,7 @@ for (var i in SpecialPowers.Components.interfaces) { } if (name && (name in window)) { ok(interfaceNamesInGlobalScope.indexOf(name) >= 0, - "Unexpected interface name in global scope: " + name); + "If this is failing: DANGER, are you sure you want to expose the new interface " + name + " to all webpages as a property on the window?"); } } From 88d95549427aa511fba088f60f9ef583fa255ba5 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 22:46:18 -0400 Subject: [PATCH 069/155] Bug 865940. Remove AsMutable now that our binding stack variables aren't const. r=bholley --- dom/bindings/BindingDeclarations.h | 5 ----- dom/bindings/Codegen.py | 9 ++------- dom/bindings/Nullable.h | 4 ---- 3 files changed, 2 insertions(+), 16 deletions(-) diff --git a/dom/bindings/BindingDeclarations.h b/dom/bindings/BindingDeclarations.h index f222de7d384..e1d22878246 100644 --- a/dom/bindings/BindingDeclarations.h +++ b/dom/bindings/BindingDeclarations.h @@ -265,11 +265,6 @@ public: return mImpl.ref(); } - Optional& AsMutable() const - { - return *const_cast(this); - } - // If we ever decide to add conversion operators for optional arrays // like the ones Nullable has, we'll need to ensure that Maybe<> has // the boolean before the actual data. diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index d39010092c6..c109c4edf4e 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -4051,7 +4051,7 @@ def wrapTypeIntoCurrentCompartment(type, value): if type.isSequence(): if type.nullable(): type = type.inner - value = "%s.AsMutable().Value()" % value + value = "%s.Value()" % value global sequenceWrapLevel index = "indexName%d" % sequenceWrapLevel sequenceWrapLevel += 1 @@ -4067,7 +4067,6 @@ def wrapTypeIntoCurrentCompartment(type, value): if type.isDictionary(): assert not type.nullable() - value = "%s.AsMutable()" % value myDict = type.inner memberWraps = [] while myDict: @@ -4099,7 +4098,7 @@ def wrapArgIntoCurrentCompartment(arg, value): origValue = value isOptional = arg.optional and not arg.defaultValue if isOptional: - value = value + ".AsMutable().Value()" + value = value + ".Value()" wrap = wrapTypeIntoCurrentCompartment(arg.type, value) if wrap and isOptional: wrap = CGIfWrapper(wrap, "%s.WasPassed()" % origValue) @@ -7188,10 +7187,6 @@ class CGDictionary(CGThing): " NS_ENSURE_TRUE(cx, false);\n" " return Init(cx, json.ref());\n" " }\n" if not self.workers else "") + - " ${selfName}& AsMutable() const\n" - " {\n" - " return *const_cast<${selfName}*>(this);\n" - " }\n" "\n" + "\n".join(memberDecls) + "\n" "private:\n" diff --git a/dom/bindings/Nullable.h b/dom/bindings/Nullable.h index e265cbf1d78..5fb57392941 100644 --- a/dom/bindings/Nullable.h +++ b/dom/bindings/Nullable.h @@ -64,10 +64,6 @@ public: return mIsNull; } - Nullable& AsMutable() const { - return *const_cast(this); - } - // Make it possible to use a const Nullable of an array type with other // array types. template From ff5af21f922531bd609ea8d7638b729281129ca8 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 25 Apr 2013 22:46:19 -0400 Subject: [PATCH 070/155] Bug 857555. Make window.content return an existing named frame with that name if there is one. r=bholley --- dom/base/nsGlobalWindow.cpp | 9 +++++- dom/tests/mochitest/bugs/Makefile.in | 1 + dom/tests/mochitest/bugs/test_bug857555.html | 31 ++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 dom/tests/mochitest/bugs/test_bug857555.html diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index 002ff6ef1d0..ab15f4f06a5 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -3504,6 +3504,13 @@ nsGlobalWindow::GetContent(nsIDOMWindow** aContent) FORWARD_TO_OUTER(GetContent, (aContent), NS_ERROR_NOT_INITIALIZED); *aContent = nullptr; + // First check for a named frame named "content" + nsCOMPtr domWindow = GetChildWindow(nsDOMClassInfo::sContent_id); + if (domWindow) { + domWindow.forget(aContent); + return NS_OK; + } + // If we're contained in + +
+
+ + From c9edffff956298ee1974986adb7d7ea5d6fb6b82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kan-Ru=20Chen=20=28=E9=99=B3=E4=BE=83=E5=A6=82=29?= Date: Fri, 26 Apr 2013 10:54:45 +0800 Subject: [PATCH 071/155] Bug 865249 - Wrap GetSingleton in a MainThread event. r=jdm --- dom/system/gonk/GonkGPSGeolocationProvider.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/dom/system/gonk/GonkGPSGeolocationProvider.cpp b/dom/system/gonk/GonkGPSGeolocationProvider.cpp index 3f88013dd25..ae232d85b59 100644 --- a/dom/system/gonk/GonkGPSGeolocationProvider.cpp +++ b/dom/system/gonk/GonkGPSGeolocationProvider.cpp @@ -250,13 +250,20 @@ GonkGPSGeolocationProvider::AGPSRILSetIDCallback(uint32_t flags) void GonkGPSGeolocationProvider::AGPSRILRefLocCallback(uint32_t flags) { - nsRefPtr provider = - GonkGPSGeolocationProvider::GetSingleton(); + class RequestRefLocEvent : public nsRunnable { + public: + RequestRefLocEvent() + {} + NS_IMETHOD Run() { + nsRefPtr provider = + GonkGPSGeolocationProvider::GetSingleton(); + provider->SetReferenceLocation(); + return NS_OK; + } + }; if (flags & AGPS_RIL_REQUEST_REFLOC_CELLID) { - nsCOMPtr event = - NS_NewRunnableMethod(provider, &GonkGPSGeolocationProvider::SetReferenceLocation); - NS_DispatchToMainThread(event); + NS_DispatchToMainThread(new RequestRefLocEvent()); } } From f3cf00b3f9a5a251f4ce2a19652d07d926b6d999 Mon Sep 17 00:00:00 2001 From: Seth Fowler Date: Thu, 25 Apr 2013 20:30:29 -0700 Subject: [PATCH 072/155] Bug 853774 - RequestBehaviour must handle null owners. r=joe --- image/src/imgRequestProxy.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/image/src/imgRequestProxy.cpp b/image/src/imgRequestProxy.cpp index cfcd36dea3b..48d716d3e2b 100644 --- a/image/src/imgRequestProxy.cpp +++ b/image/src/imgRequestProxy.cpp @@ -55,7 +55,12 @@ class RequestBehaviour : public ProxyBehaviour virtual void SetOwner(imgRequest* aOwner) MOZ_OVERRIDE { mOwner = aOwner; - mOwnerHasImage = !!aOwner->GetStatusTracker().GetImage(); + + if (mOwner) { + mOwnerHasImage = !!aOwner->GetStatusTracker().GetImage(); + } else { + mOwnerHasImage = false; + } } private: From 9bcc1fce324ec86d591288ffd35eaac886fd25ff Mon Sep 17 00:00:00 2001 From: Richard Newman Date: Thu, 25 Apr 2013 20:42:05 -0700 Subject: [PATCH 073/155] Bug 858992 - Don't sync pinned bookmarks. r=nalexander --- .../AndroidBrowserBookmarksDataAccessor.java | 18 ++++++++++++------ ...droidBrowserBookmarksRepositorySession.java | 13 +++++++++---- .../AndroidBrowserRepositorySession.java | 15 +++++++++------ 3 files changed, 30 insertions(+), 16 deletions(-) diff --git a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java index 5f121b66740..e187aff4311 100644 --- a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java +++ b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksDataAccessor.java @@ -31,9 +31,14 @@ public class AndroidBrowserBookmarksDataAccessor extends AndroidBrowserRepositor */ private static final String BOOKMARK_IS_FOLDER = BrowserContract.Bookmarks.TYPE + " = " + BrowserContract.Bookmarks.TYPE_FOLDER; - private static final String GUID_NOT_TAGS_OR_PLACES = BrowserContract.SyncColumns.GUID + " NOT IN ('" + - BrowserContract.Bookmarks.TAGS_FOLDER_GUID + "', '" + - BrowserContract.Bookmarks.PLACES_FOLDER_GUID + "')"; + + // SQL fragment to retrieve GUIDs whose ID mappings should be tracked by this session. + // Exclude folders we don't want to sync. + private static final String GUID_SHOULD_TRACK = BrowserContract.SyncColumns.GUID + " NOT IN ('" + + BrowserContract.Bookmarks.TAGS_FOLDER_GUID + "', '" + + BrowserContract.Bookmarks.PLACES_FOLDER_GUID + "', '" + + BrowserContract.Bookmarks.READING_LIST_FOLDER_GUID + "', '" + + BrowserContract.Bookmarks.PINNED_FOLDER_GUID + "')"; private static final String EXCLUDE_SPECIAL_GUIDS_WHERE_CLAUSE; static { @@ -71,7 +76,7 @@ public class AndroidBrowserBookmarksDataAccessor extends AndroidBrowserRepositor return BrowserContractHelpers.BOOKMARKS_CONTENT_URI; } - protected Uri getPositionsUri() { + protected static Uri getPositionsUri() { return BrowserContractHelpers.BOOKMARKS_POSITIONS_CONTENT_URI; } @@ -86,8 +91,9 @@ public class AndroidBrowserBookmarksDataAccessor extends AndroidBrowserRepositor BrowserContract.Bookmarks._ID }; protected Cursor getGuidsIDsForFolders() throws NullCursorException { - // Exclude "places" and "tags", in case they've ended up in the DB. - String where = BOOKMARK_IS_FOLDER + " AND " + GUID_NOT_TAGS_OR_PLACES; + // Exclude items that we don't want to sync (pinned items, reading list, + // tags, the places root), in case they've ended up in the DB. + String where = BOOKMARK_IS_FOLDER + " AND " + GUID_SHOULD_TRACK; return queryHelper.safeQuery(".getGuidsIDsForFolders", GUID_AND_ID, where, null, null); } diff --git a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java index f953e7ab4d5..e4ec077c38b 100644 --- a/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java +++ b/mobile/android/base/sync/repositories/android/AndroidBrowserBookmarksRepositorySession.java @@ -131,14 +131,19 @@ public class AndroidBrowserBookmarksRepositorySession extends AndroidBrowserRepo * Additionally, the mobile root is annotated. In Firefox Sync, PlacesUtils is * used to find the IDs of these special folders. * - * Sync skips over `places` and `tags` when finding IDs. - * - * We need to consume records with these various guids, producing a local + * We need to consume records with these various GUIDs, producing a local * representation which we are able to stably map upstream. * + * Android Sync skips over the contents of some special GUIDs -- `places`, `tags`, + * etc. -- when finding IDs. + * Some of these special GUIDs are part of desktop structure (places, tags). Some + * are part of Fennec's custom data (readinglist, pinned). + * + * We don't want to upload or apply these records. + * * That is: * - * * We should not upload a `places` record or a `tags` record. + * * We should not upload a `places`,`tags`, `readinglist`, or `pinned` record. * * We can stably _store_ menu/toolbar/unfiled/mobile as special GUIDs, and set * their parent ID as appropriate on upload. * diff --git a/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java b/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java index 006dd7c8145..090a9ace481 100644 --- a/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java +++ b/mobile/android/base/sync/repositories/android/AndroidBrowserRepositorySession.java @@ -5,7 +5,6 @@ package org.mozilla.gecko.sync.repositories.android; import java.util.ArrayList; -import java.util.HashMap; import org.mozilla.gecko.background.common.log.Logger; import org.mozilla.gecko.sync.repositories.InactiveSessionException; @@ -30,6 +29,7 @@ import org.mozilla.gecko.sync.repositories.domain.Record; import android.content.ContentUris; import android.database.Cursor; import android.net.Uri; +import android.util.SparseArray; /** * You'll notice that all delegate calls *either*: @@ -71,7 +71,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos * In this case, we search the database for a matching record explicitly using * findByRecordString. */ - protected HashMap recordToGuid; + protected SparseArray recordToGuid; public AndroidBrowserRepositorySession(Repository repository) { super(repository); @@ -105,6 +105,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos * * For example, a session subclass might skip records of an unsupported type. */ + @SuppressWarnings("static-method") public boolean shouldIgnore(Record record) { return false; } @@ -115,6 +116,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos * * Example: translating remote folder names into local names. */ + @SuppressWarnings("static-method") protected void fixupRecord(Record record) { return; } @@ -134,6 +136,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos * @return The transformed record. Can be null. * @throws NullCursorException */ + @SuppressWarnings("static-method") protected Record transformRecord(Record record) throws NullCursorException { return record; } @@ -679,12 +682,12 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos if (recordToGuid == null) { createRecordToGuidMap(); } - return recordToGuid.get(new Integer(recordString.hashCode())); + return recordToGuid.get(Integer.valueOf(recordString.hashCode())); } protected void createRecordToGuidMap() throws NoGuidForIdException, NullCursorException, ParentNotFoundException { Logger.info(LOG_TAG, "BEGIN: creating record -> GUID map."); - recordToGuid = new HashMap(); + recordToGuid = new SparseArray(); // TODO: we should be able to do this entire thing with string concatenations within SQL. // Also consider whether it's better to fetch and process every record in the DB into @@ -699,7 +702,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos if (record != null) { final String recordString = buildRecordString(record); if (recordString != null) { - recordToGuid.put(new Integer(recordString.hashCode()), record.guid); + recordToGuid.put(Integer.valueOf(recordString.hashCode()), record.guid); } } cur.moveToNext(); @@ -757,7 +760,7 @@ public abstract class AndroidBrowserRepositorySession extends StoreTrackingRepos if (recordToGuid == null) { createRecordToGuidMap(); } - recordToGuid.put(new Integer(recordString.hashCode()), guid); + recordToGuid.put(Integer.valueOf(recordString.hashCode()), guid); } protected abstract Record prepareRecord(Record record); From 745d28da5f75e864d319f4c7fcdd9209c67046ee Mon Sep 17 00:00:00 2001 From: Bill McCloskey Date: Tue, 9 Apr 2013 18:11:04 -0700 Subject: [PATCH 074/155] Bug 697319 - First browser should be dynamically created to allow honoring of browser.tabs.remote pref (r=gavin) --- browser/base/content/tabbrowser.xml | 51 ++++++++++++++++++----------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 573ed0bb8ba..45550f3a276 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -28,10 +28,7 @@ - - - + @@ -1328,26 +1325,14 @@ if (aOwner) t.owner = aOwner; - var b = document.createElementNS( - "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", - "browser"); + var b = this._createBrowserElement(); b.setAttribute("type", "content-targetable"); - b.setAttribute("message", "true"); - b.setAttribute("contextmenu", this.getAttribute("contentcontextmenu")); - b.setAttribute("tooltip", this.getAttribute("contenttooltip")); - - if (Services.prefs.getPrefType("browser.tabs.remote") == Services.prefs.PREF_BOOL && - Services.prefs.getBoolPref("browser.tabs.remote")) { - b.setAttribute("remote", "true"); - } if (window.gShowPageResizers && document.getElementById("addon-bar").collapsed && window.windowState == window.STATE_NORMAL) { b.setAttribute("showresizer", "true"); } - if (this.hasAttribute("autocompletepopup")) - b.setAttribute("autocompletepopup", this.getAttribute("autocompletepopup")); b.setAttribute("autoscrollpopup", this._autoScrollPopup.id); // Create the browserStack container @@ -1415,7 +1400,6 @@ this.mTabFilters[position] = filter; b._fastFind = this.fastFind; - b.droppedLinkHandler = handleDroppedLink; // Dispatch a new tab notification. We do this once we're // entirely done, so that things are in a consistent state @@ -2716,9 +2700,37 @@ ]]> + + + + Date: Thu, 25 Apr 2013 21:02:15 -0700 Subject: [PATCH 075/155] Bug 864462 - Fix OOM in write barrier verifier (r=terrence) --- js/src/gc/Verifier.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/js/src/gc/Verifier.cpp b/js/src/gc/Verifier.cpp index cf3f0f1838b..eef8fbd03c7 100644 --- a/js/src/gc/Verifier.cpp +++ b/js/src/gc/Verifier.cpp @@ -509,12 +509,13 @@ gc::StartVerifyPreBarriers(JSRuntime *rt) const size_t size = 64 * 1024 * 1024; trc->root = (VerifyNode *)js_malloc(size); - JS_ASSERT(trc->root); + if (!trc->root) + goto oom; trc->edgeptr = (char *)trc->root; trc->term = trc->edgeptr + size; if (!trc->nodemap.init()) - return; + goto oom; /* Create the root node. */ trc->curnode = MakeNode(trc, NULL, JSGCTraceKind(0)); @@ -525,7 +526,8 @@ gc::StartVerifyPreBarriers(JSRuntime *rt) /* Make all the roots be edges emanating from the root node. */ MarkRuntime(trc); - VerifyNode *node = trc->curnode; + VerifyNode *node; + node = trc->curnode; if (trc->edgeptr == trc->term) goto oom; From 4da563b989c3091172cbe43f84c41d0df478778f Mon Sep 17 00:00:00 2001 From: Bill McCloskey Date: Thu, 25 Apr 2013 21:02:22 -0700 Subject: [PATCH 076/155] Bug 856670 - Bring JS C stack limit closer to actual OS limits (r=bsmedberg) --- js/xpconnect/src/XPCJSRuntime.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/js/xpconnect/src/XPCJSRuntime.cpp b/js/xpconnect/src/XPCJSRuntime.cpp index a1639f7477a..78d35144fd7 100644 --- a/js/xpconnect/src/XPCJSRuntime.cpp +++ b/js/xpconnect/src/XPCJSRuntime.cpp @@ -2691,6 +2691,12 @@ XPCJSRuntime::XPCJSRuntime(nsXPConnect* aXPConnect) // between optimized and debug builds. Also, ASan requires more stack space // due to redzones JS_SetNativeStackQuota(mJSRuntime, 2 * 128 * sizeof(size_t) * 1024); +#elif defined(XP_WIN) + // 1MB is the default stack size on Windows + JS_SetNativeStackQuota(mJSRuntime, 900 * 1024); +#elif defined(XP_MACOSX) || defined(DARWIN) + // 8MB is the default stack size on MacOS + JS_SetNativeStackQuota(mJSRuntime, 7 * 1024 * 1024); #else JS_SetNativeStackQuota(mJSRuntime, 128 * sizeof(size_t) * 1024); #endif From 2b226ae2f6b7df3aaf867b3f0dff6526e35bef44 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sun, 21 Apr 2013 13:48:01 -0700 Subject: [PATCH 077/155] Bug 857382 (part 1) - Correctly handle memory report files that have no measurements in the "explicit" or "other" sections. r=kats. --HG-- extra : rebase_source : 2fa86e1a5b0729f2deee3f1f15989685fb2e5d77 --- .../aboutmemory/content/aboutMemory.js | 109 +++++++++--------- .../tests/memory-reports-good.json | 8 +- .../aboutmemory/tests/test_aboutmemory3.xul | 46 +++++++- .../aboutmemory/tests/test_aboutmemory4.xul | 23 ++++ 4 files changed, 125 insertions(+), 61 deletions(-) diff --git a/toolkit/components/aboutmemory/content/aboutMemory.js b/toolkit/components/aboutmemory/content/aboutMemory.js index 8521c971ad7..2fbea505ca3 100644 --- a/toolkit/components/aboutmemory/content/aboutMemory.js +++ b/toolkit/components/aboutmemory/content/aboutMemory.js @@ -511,6 +511,8 @@ function onLoadAboutMemory() } } +//--------------------------------------------------------------------------- + function doGC() { Cu.forceGC(); @@ -542,8 +544,6 @@ function doMeasure() addChildObserversAndUpdate(updateAboutMemoryFromReporters); } -//--------------------------------------------------------------------------- - /** * Top-level function that does the work of generating the page from the memory * reporters. @@ -690,6 +690,16 @@ function updateAboutMemoryFromClipboard() } } +//--------------------------------------------------------------------------- + +// |PColl| is short for "process collection". +function PColl() +{ + this._trees = {}; + this._degenerates = {}; + this._heapTotal = 0; +} + /** * Processes reports (whether from reporters or from a file) and append the * main part of the page. @@ -706,12 +716,10 @@ function updateAboutMemoryFromClipboard() function appendAboutMemoryMain(aProcess, aHasMozMallocUsableSize, aForceShowSmaps) { - let treesByProcess = {}, degeneratesByProcess = {}, heapTotalByProcess = {}; - getTreesByProcess(aProcess, treesByProcess, degeneratesByProcess, - heapTotalByProcess, aForceShowSmaps); + let pcollsByProcess = getPCollsByProcess(aProcess, aForceShowSmaps); - // Sort our list of processes. - let processes = Object.keys(treesByProcess); + // Sort the processes. + let processes = Object.keys(pcollsByProcess); processes.sort(function(aProcessA, aProcessB) { assert(aProcessA != aProcessB, "Elements of Object.keys() should be unique, but " + @@ -726,8 +734,8 @@ function appendAboutMemoryMain(aProcess, aHasMozMallocUsableSize, } // Then sort by resident size. - let nodeA = degeneratesByProcess[aProcessA]['resident']; - let nodeB = degeneratesByProcess[aProcessB]['resident']; + let nodeA = pcollsByProcess[aProcessA]._degenerates['resident']; + let nodeB = pcollsByProcess[aProcessB]._degenerates['resident']; let residentA = nodeA ? nodeA._amount : -1; let residentB = nodeB ? nodeB._amount : -1; @@ -755,20 +763,13 @@ function appendAboutMemoryMain(aProcess, aHasMozMallocUsableSize, let section = appendElement(gMain, 'div', 'section'); appendProcessAboutMemoryElements(section, process, - treesByProcess[process], - degeneratesByProcess[process], - heapTotalByProcess[process], + pcollsByProcess[process]._trees, + pcollsByProcess[process]._degenerates, + pcollsByProcess[process]._heapTotal, aHasMozMallocUsableSize); } } -//--------------------------------------------------------------------------- - -// This regexp matches sentences and sentence fragments, i.e. strings that -// start with a capital letter and ends with a '.'. (The final sentence may be -// in parentheses, so a ')' might appear after the '.'.) -const gSentenceRegExp = /^[A-Z].*\.\)?$/m; - /** * This function reads all the memory reports, and puts that data in structures * that will be used to generate the page. @@ -776,23 +777,20 @@ const gSentenceRegExp = /^[A-Z].*\.\)?$/m; * @param aProcessMemoryReports * Function that extracts the memory reports from the reporters or from * file. - * @param aTreesByProcess - * Table of non-degenerate trees, indexed by process, which this - * function appends to. - * @param aDegeneratesByProcess - * Table of degenerate trees, indexed by process, which this function - * appends to. - * @param aHeapTotalByProcess - * Table of heap total counts, indexed by process, which this function - * appends to. * @param aForceShowSmaps * True if we should show the smaps memory reporters even if we're not * in verbose mode. + * @return The table of PColls by process. */ -function getTreesByProcess(aProcessMemoryReports, aTreesByProcess, - aDegeneratesByProcess, aHeapTotalByProcess, - aForceShowSmaps) +function getPCollsByProcess(aProcessMemoryReports, aForceShowSmaps) { + let pcollsByProcess = {}; + + // This regexp matches sentences and sentence fragments, i.e. strings that + // start with a capital letter and ends with a '.'. (The final sentence may + // be in parentheses, so a ')' might appear after the '.'.) + const gSentenceRegExp = /^[A-Z].*\.\)?$/m; + // Ignore the "smaps" multi-reporter in non-verbose mode unless we're reading // from a file or the clipboard, and ignore the "compartments" and // "ghost-windows" multi-reporters all the time. (Note that reports from @@ -849,20 +847,17 @@ function getTreesByProcess(aProcessMemoryReports, aTreesByProcess, let unsafeName0 = unsafeNames[0]; let isDegenerate = unsafeNames.length === 1; - // Get the appropriate trees table (non-degenerate or degenerate) for the - // process, creating it if necessary. - let t; - let thingsByProcess = - isDegenerate ? aDegeneratesByProcess : aTreesByProcess; - let things = thingsByProcess[process]; - if (!thingsByProcess[process]) { - things = thingsByProcess[process] = {}; + // Get the PColl table for the process, creating it if necessary. + let pcoll = pcollsByProcess[process]; + if (!pcollsByProcess[process]) { + pcoll = pcollsByProcess[process] = new PColl(); } // Get the root node, creating it if necessary. - t = things[unsafeName0]; + let psubcoll = isDegenerate ? pcoll._degenerates : pcoll._trees; + let t = psubcoll[unsafeName0]; if (!t) { - t = things[unsafeName0] = + t = psubcoll[unsafeName0] = new TreeNode(unsafeName0, aUnits, isDegenerate); } @@ -884,10 +879,7 @@ function getTreesByProcess(aProcessMemoryReports, aTreesByProcess, // Update the heap total if necessary. if (unsafeName0 === "explicit" && aKind == KIND_HEAP) { - if (!aHeapTotalByProcess[process]) { - aHeapTotalByProcess[process] = 0; - } - aHeapTotalByProcess[process] += aAmount; + pcollsByProcess[process]._heapTotal += aAmount; } } @@ -903,6 +895,8 @@ function getTreesByProcess(aProcessMemoryReports, aTreesByProcess, } aProcessMemoryReports(ignoreSingle, ignoreMulti, handleReport); + + return pcollsByProcess; } //--------------------------------------------------------------------------- @@ -1221,18 +1215,19 @@ function appendProcessAboutMemoryElements(aP, aProcess, aTrees, aDegenerates, let hasKnownHeapAllocated; { let treeName = "explicit"; - let t = aTrees[treeName]; - assertInput(t, "no explicit reports"); - fillInTree(t); - hasKnownHeapAllocated = - aDegenerates && - addHeapUnclassifiedNode(t, aDegenerates["heap-allocated"], aHeapTotal); - sortTreeAndInsertAggregateNodes(t._amount, t); - t._description = kTreeDescriptions[treeName]; let pre = appendSectionHeader(aP, kSectionNames[treeName]); - appendTreeElements(pre, t, aProcess, ""); + let t = aTrees[treeName]; + if (t) { + fillInTree(t); + hasKnownHeapAllocated = + aDegenerates && + addHeapUnclassifiedNode(t, aDegenerates["heap-allocated"], aHeapTotal); + sortTreeAndInsertAggregateNodes(t._amount, t); + t._description = kTreeDescriptions[treeName]; + appendTreeElements(pre, t, aProcess, ""); + delete aTrees[treeName]; + } appendTextNode(aP, "\n"); // gives nice spacing when we cut and paste - delete aTrees[treeName]; } // The smaps trees, which are only present in aTrees in verbose mode or when @@ -1242,14 +1237,14 @@ function appendProcessAboutMemoryElements(aP, aProcess, aTrees, aDegenerates, // unsafePath. let t = aTrees[aTreeName]; if (t) { + let pre = appendSectionHeader(aP, kSectionNames[aTreeName]); fillInTree(t); sortTreeAndInsertAggregateNodes(t._amount, t); t._description = kTreeDescriptions[aTreeName]; t._hideKids = true; // smaps trees are always initially collapsed - let pre = appendSectionHeader(aP, kSectionNames[aTreeName]); appendTreeElements(pre, t, aProcess, ""); - appendTextNode(aP, "\n"); // gives nice spacing when we cut and paste delete aTrees[aTreeName]; + appendTextNode(aP, "\n"); // gives nice spacing when we cut and paste } }); diff --git a/toolkit/components/aboutmemory/tests/memory-reports-good.json b/toolkit/components/aboutmemory/tests/memory-reports-good.json index d449ac4731e..8c5c2412a54 100644 --- a/toolkit/components/aboutmemory/tests/memory-reports-good.json +++ b/toolkit/components/aboutmemory/tests/memory-reports-good.json @@ -5,6 +5,12 @@ {"process": "Main Process (pid NNN)", "path": "heap-allocated", "kind": 2, "units": 0, "amount": 262144000, "description": "Heap allocated."}, {"process": "Main Process (pid NNN)", "path": "other/b", "kind": 2, "units": 0, "amount": 104857, "description": "Other b."}, {"process": "Main Process (pid NNN)", "path": "other/a", "kind": 2, "units": 0, "amount": 209715, "description": "Other a."}, - {"process": "Main Process (pid NNN)", "path": "explicit/a/b", "kind": 1, "units": 0, "amount": 52428800, "description": "A b."} + {"process": "Main Process (pid NNN)", "path": "explicit/a/b", "kind": 1, "units": 0, "amount": 52428800, "description": "A b."}, + + {"process": "Explicit-only process", "path": "explicit/a/b", "kind": 1, "units": 0, "amount": 100000, "description": "A b."}, + + {"process": "Other-only process", "path": "a/b", "kind": 1, "units": 0, "amount": 100000, "description": "A b."}, + {"process": "Other-only process", "path": "a/c", "kind": 1, "units": 0, "amount": 100000, "description": "A c."}, + {"process": "Other-only process", "path": "heap-allocated", "kind": 1, "units": 0, "amount": 500000, "description": "D."} ] } diff --git a/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul b/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul index 14d475d05b8..bf9c8fd658f 100644 --- a/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul +++ b/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul @@ -175,10 +175,50 @@ } } - // This is pretty simple output, but that's ok; this file is about testing - // the loading of data from file. If we got this far, we're doing fine. let expectedGood = "\ +Explicit-only process\n\ +\n\ +WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\ +Explicit Allocations\n\ +\n\ +0.10 MB (100.0%) -- explicit\n\ +└──0.10 MB (100.0%) ── a/b\n\ +\n\ +Other Measurements\n\ +\n\ +Main Process (pid NNN)\n\ +Explicit Allocations\n\ +\n\ +250.00 MB (100.0%) -- explicit\n\ +├──200.00 MB (80.00%) ── heap-unclassified\n\ +└───50.00 MB (20.00%) ── a/b\n\ +\n\ +Other Measurements\n\ +\n\ +0.30 MB (100.0%) -- other\n\ +├──0.20 MB (66.67%) ── a\n\ +└──0.10 MB (33.33%) ── b\n\ +\n\ +250.00 MB ── heap-allocated\n\ +\n\ +Other-only process\n\ +\n\ +WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\ +Explicit Allocations\n\ +\n\ +Other Measurements\n\ +\n\ +0.19 MB (100.0%) -- a\n\ +├──0.10 MB (50.00%) ── b\n\ +└──0.10 MB (50.00%) ── c\n\ +\n\ +0.48 MB ── heap-allocated\n\ +\n\ +"; + + let expectedGood2 = +"\ Main Process (pid NNN)\n\ Explicit Allocations\n\ \n\ @@ -206,7 +246,7 @@ Invalid memory report(s): missing 'hasMozMallocUsableSize' property"; { frameId: "amGoodFrame", filename: "memory-reports-good.json", expected: expectedGood, dumpFirst: false }, // This dumps to a file and then reads it back in. The output is the same as the first test. - { frameId: "amGoodFrame2", filename: "memory-reports-dumped.json.gz", expected: expectedGood, dumpFirst: true }, + { frameId: "amGoodFrame2", filename: "memory-reports-dumped.json.gz", expected: expectedGood2, dumpFirst: true }, // This loads a pre-existing file that is invalid. { frameId: "amBadFrame", filename: "memory-reports-bad.json", expected: expectedBad, dumpFirst: false } diff --git a/toolkit/components/aboutmemory/tests/test_aboutmemory4.xul b/toolkit/components/aboutmemory/tests/test_aboutmemory4.xul index d8c8011068d..22ce18777e4 100644 --- a/toolkit/components/aboutmemory/tests/test_aboutmemory4.xul +++ b/toolkit/components/aboutmemory/tests/test_aboutmemory4.xul @@ -89,6 +89,16 @@ // the loading of data from file. If we got this far, we're doing fine. let expectedGood = "\ +Explicit-only process\n\ +\n\ +WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\ +Explicit Allocations\n\ +\n\ +0.10 MB (100.0%) -- explicit\n\ +└──0.10 MB (100.0%) ── a/b\n\ +\n\ +Other Measurements\n\ +\n\ Main Process (pid NNN)\n\ Explicit Allocations\n\ \n\ @@ -104,6 +114,19 @@ Other Measurements\n\ \n\ 250.00 MB ── heap-allocated\n\ \n\ +Other-only process\n\ +\n\ +WARNING: the 'heap-allocated' memory reporter does not work for this platform and/or configuration. This means that 'heap-unclassified' is not shown and the 'explicit' tree shows less memory than it should.\n\ +Explicit Allocations\n\ +\n\ +Other Measurements\n\ +\n\ +0.19 MB (100.0%) -- a\n\ +├──0.10 MB (50.00%) ── b\n\ +└──0.10 MB (50.00%) ── c\n\ +\n\ +0.48 MB ── heap-allocated\n\ +\n\ "; // This is the output for a malformed data file. From 9146bccc1ad8c26b172837aa6502d894a04a6a04 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sun, 21 Apr 2013 13:55:05 -0700 Subject: [PATCH 078/155] Bug 857382 (part 2) - Prefix zone addresses in about:memory with "0x" for consistenty with other addresses. r=billm. --HG-- extra : rebase_source : a8c669c0bf27fa0b1d90c9b7862ca43dfe4a80bd --- js/xpconnect/src/XPCJSRuntime.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/xpconnect/src/XPCJSRuntime.cpp b/js/xpconnect/src/XPCJSRuntime.cpp index 78d35144fd7..dace5ae40e0 100644 --- a/js/xpconnect/src/XPCJSRuntime.cpp +++ b/js/xpconnect/src/XPCJSRuntime.cpp @@ -2248,7 +2248,7 @@ class XPCJSRuntimeStats : public JS::RuntimeStats } } - extras->pathPrefix += nsPrintfCString("zone(%p)/", (void *)zone); + extras->pathPrefix += nsPrintfCString("zone(0x%p)/", (void *)zone); zStats->extra = extras; } From 7f9c92b66769c9c883467d90920bc1330d1a7b28 Mon Sep 17 00:00:00 2001 From: Nicholas Nethercote Date: Sun, 21 Apr 2013 15:36:07 -0700 Subject: [PATCH 079/155] Bug 857382 (part 3) - Add ability to diff two files to about:memory. r=kats. --HG-- extra : rebase_source : d5cfd7a690b1de7ce0b18ef45fbb03fc6cb9fc23 --- .../aboutmemory/content/aboutMemory.js | 392 +++++++++++++++--- .../components/aboutmemory/tests/Makefile.in | 2 + .../tests/memory-reports-diff1.json | 23 + .../tests/memory-reports-diff2.json | 24 ++ .../aboutmemory/tests/test_aboutmemory3.xul | 184 +++++--- .../aboutmemory/tools/diff-memory-reports.js | 338 --------------- 6 files changed, 527 insertions(+), 436 deletions(-) create mode 100644 toolkit/components/aboutmemory/tests/memory-reports-diff1.json create mode 100644 toolkit/components/aboutmemory/tests/memory-reports-diff2.json delete mode 100644 toolkit/components/aboutmemory/tools/diff-memory-reports.js diff --git a/toolkit/components/aboutmemory/content/aboutMemory.js b/toolkit/components/aboutmemory/content/aboutMemory.js index 2fbea505ca3..1dcfcc9bd94 100644 --- a/toolkit/components/aboutmemory/content/aboutMemory.js +++ b/toolkit/components/aboutmemory/content/aboutMemory.js @@ -57,22 +57,12 @@ let gMgr = Cc["@mozilla.org/memory-reporter-manager;1"] let gUnnamedProcessStr = "Main Process"; -// Because about:memory and about:compartments are non-standard URLs, -// location.search is undefined, so we have to use location.href here. -// The toLowerCase() calls ensure that addresses like "ABOUT:MEMORY" work. let gIsDiff = false; + { let split = document.location.href.split('?'); + // The toLowerCase() calls ensure that addresses like "ABOUT:MEMORY" work. document.title = split[0].toLowerCase(); - - if (split.length === 2) { - let searchSplit = split[1].split('&'); - for (let i = 0; i < searchSplit.length; i++) { - if (searchSplit[i].toLowerCase() === 'diff') { - gIsDiff = true; - } - } - } } let gChildMemoryListener = undefined; @@ -213,7 +203,13 @@ function processMemoryReporters(aIgnoreSingle, aIgnoreMulti, aHandleReport) while (e.hasMoreElements()) { let mr = e.getNext().QueryInterface(Ci.nsIMemoryMultiReporter); if (!aIgnoreMulti(mr.name)) { - mr.collectReports(aHandleReport, null); + // |collectReports| never passes in a |presence| argument. + let handleReport = function(aProcess, aUnsafePath, aKind, aUnits, + aAmount, aDescription) { + aHandleReport(aProcess, aUnsafePath, aKind, aUnits, aAmount, + aDescription, /* presence = */ undefined); + } + mr.collectReports(handleReport, null); } } } @@ -237,7 +233,7 @@ function processMemoryReportsFromFile(aReports, aIgnoreSingle, aHandleReport) let r = aReports[i]; if (!aIgnoreSingle(r.path)) { aHandleReport(r.process, r.path, r.kind, r.units, r.amount, - r.description); + r.description, r._presence); } } } @@ -413,6 +409,15 @@ function appendButton(aP, aTitle, aOnClick, aText, aId) return b; } +function appendHiddenFileInput(aP, aId, aChangeListener) +{ + let input = appendElementWithText(aP, "input", "hidden", ""); + input.type = "file"; + input.id = aId; // used in testing + input.addEventListener("change", aChangeListener); + return input; +} + function onLoadAboutMemory() { // Generate the header. @@ -420,17 +425,38 @@ function onLoadAboutMemory() let header = appendElement(document.body, "div", "ancillary"); // A hidden file input element that can be invoked when necessary. - let filePickerInput = appendElementWithText(header, "input", "hidden", ""); - filePickerInput.type = "file"; - filePickerInput.id = "filePickerInput"; // used in testing - filePickerInput.addEventListener("change", function() { + let fileInput1 = appendHiddenFileInput(header, "fileInput1", function() { let file = this.files[0]; let filename = file.mozFullPath; updateAboutMemoryFromFile(filename); }); + // Ditto. + let fileInput2 = + appendHiddenFileInput(header, "fileInput2", function(e) { + let file = this.files[0]; + // First time around, we stash a copy of the filename and reinvoke. Second + // time around we do the diff and display. + if (!this.filename1) { + this.filename1 = file.mozFullPath; + + // e.skipClick is only true when testing -- it allows fileInput2's + // onchange handler to be re-called without having to go via the file + // picker. + if (!e.skipClick) { + this.click(); + } + } else { + let filename1 = this.filename1; + delete this.filename1; + updateAboutMemoryFromTwoFiles(filename1, file.mozFullPath); + } + }); + const CuDesc = "Measure current memory reports and show."; const LdDesc = "Load memory reports from file and show."; + const DfDesc = "Load memory report data from two files and show the " + + "difference."; const RdDesc = "Read memory reports from the clipboard and show."; const SvDesc = "Save memory reports to file."; @@ -460,7 +486,9 @@ function onLoadAboutMemory() // The "measureButton" id is used for testing. appendButton(row1, CuDesc, doMeasure, "Measure", "measureButton"); - appendButton(row1, LdDesc, () => filePickerInput.click(), "Load" + kEllipsis); + appendButton(row1, LdDesc, () => fileInput1.click(), "Load" + kEllipsis); + appendButton(row1, DfDesc, () => fileInput2.click(), + "Load and diff" + kEllipsis); appendButton(row1, RdDesc, updateAboutMemoryFromClipboard, "Read from clipboard"); @@ -497,7 +525,9 @@ function onLoadAboutMemory() appendElementWithText(gFooter, "div", "legend", legendText1); appendElementWithText(gFooter, "div", "legend hiddenOnMobile", legendText2); - // Check location.href to see if we're loading from a file. + // See if we're loading from a file. (Because about:memory and + // about:compartments are non-standard URLs, location.search is undefined, so + // we have to use location.href instead.) let search = location.href.split('?')[1]; if (search) { let searchSplit = search.split('&'); @@ -572,27 +602,25 @@ function updateAboutMemoryFromReporters() var gCurrentFileFormatVersion = 1; /** - * Populate about:memory using the data in the given JSON string. + * Populate about:memory using the data in the given JSON object. * - * @param aJSONString - * A string containing JSON data conforming to the schema used by - * nsIMemoryReporterManager::dumpReports. + * @param aObj + * An object containing JSON data that (hopefully!) conforms to the + * schema used by nsIMemoryInfoDumper. */ -function updateAboutMemoryFromJSONString(aJSONString) +function updateAboutMemoryFromJSONObject(aObj) { try { - let json = JSON.parse(aJSONString); - assertInput(json.version === gCurrentFileFormatVersion, + assertInput(aObj.version === gCurrentFileFormatVersion, "data version number missing or doesn't match"); - assertInput(json.hasMozMallocUsableSize !== undefined, + assertInput(aObj.hasMozMallocUsableSize !== undefined, "missing 'hasMozMallocUsableSize' property"); - assertInput(json.reports && json.reports instanceof Array, + assertInput(aObj.reports && aObj.reports instanceof Array, "missing or non-array 'reports' property"); let process = function(aIgnoreSingle, aIgnoreMulti, aHandleReport) { - processMemoryReportsFromFile(json.reports, aIgnoreSingle, - aHandleReport); + processMemoryReportsFromFile(aObj.reports, aIgnoreSingle, aHandleReport); } - appendAboutMemoryMain(process, json.hasMozMallocUsableSize, + appendAboutMemoryMain(process, aObj.hasMozMallocUsableSize, /* forceShowSmaps = */ true); } catch (ex) { handleException(ex); @@ -600,16 +628,31 @@ function updateAboutMemoryFromJSONString(aJSONString) } /** - * Like updateAboutMemoryFromReporters(), but gets its data from a file instead - * of the memory reporters. + * Populate about:memory using the data in the given JSON string. + * + * @param aStr + * A string containing JSON data conforming to the schema used by + * nsIMemoryReporterManager::dumpReports. + */ +function updateAboutMemoryFromJSONString(aStr) +{ + try { + let obj = JSON.parse(aStr); + updateAboutMemoryFromJSONObject(obj); + } catch (ex) { + handleException(ex); + } +} + +/** + * Loads the contents of a file into a string and passes that to a callback. * * @param aFilename * The name of the file being read from. - * - * The expected format of the file's contents is described in the - * comment describing nsIMemoryReporterManager::dumpReports. + * @param aFn + * The function to call and pass the read string to upon completion. */ -function updateAboutMemoryFromFile(aFilename) +function loadMemoryReportsFromFile(aFilename, aFn) { updateMainAndFooter("Loading...", HIDE_FOOTER); @@ -619,7 +662,7 @@ function updateAboutMemoryFromFile(aFilename) reader.onabort = () => { throw "FileReader.onabort"; }; reader.onload = (aEvent) => { updateMainAndFooter("", SHOW_FOOTER); // Clear "Loading..." from above. - updateAboutMemoryFromJSONString(aEvent.target.result); + aFn(aEvent.target.result); }; // If it doesn't have a .gz suffix, read it as a (legacy) ungzipped file. @@ -658,6 +701,46 @@ function updateAboutMemoryFromFile(aFilename) } } +/** + * Like updateAboutMemoryFromReporters(), but gets its data from a file instead + * of the memory reporters. + * + * @param aFilename + * The name of the file being read from. The expected format of the + * file's contents is described in a comment in nsIMemoryInfoDumper.idl. + */ +function updateAboutMemoryFromFile(aFilename) +{ + loadMemoryReportsFromFile(aFilename, + updateAboutMemoryFromJSONString); +} + +/** + * Like updateAboutMemoryFromFile(), but gets its data from a two files and + * diffs them. + * + * @param aFilename1 + * The name of the first file being read from. + * @param aFilename2 + * The name of the first file being read from. + */ +function updateAboutMemoryFromTwoFiles(aFilename1, aFilename2) +{ + loadMemoryReportsFromFile(aFilename1, function(aStr1) { + loadMemoryReportsFromFile(aFilename2, function f2(aStr2) { + try { + let obj1 = JSON.parse(aStr1); + let obj2 = JSON.parse(aStr2); + gIsDiff = true; + updateAboutMemoryFromJSONObject(diffJSONObjects(obj1, obj2)); + gIsDiff = false; + } catch (ex) { + handleException(ex); + } + }); + }); +} + /** * Like updateAboutMemoryFromFile(), but gets its data from the clipboard * instead of a file. @@ -692,6 +775,188 @@ function updateAboutMemoryFromClipboard() //--------------------------------------------------------------------------- +// Something unlikely to appear in a process name. +let kProcessPathSep = "^:^:^"; + +// Short for "diff report". +function DReport(aKind, aUnits, aAmount, aDescription, aNMerged, aPresence) +{ + this._kind = aKind; + this._units = aUnits; + this._amount = aAmount; + this._description = aDescription; + this._nMerged = aNMerged; + if (aPresence !== undefined) { + this._presence = aPresence; + } +} + +DReport.prototype = { + assertCompatible: function(aKind, aUnits) + { + assert(this._kind == aKind, "Mismatched kinds"); + assert(this._units == aUnits, "Mismatched units"); + + // We don't check that the "description" properties match. This is because + // on Linux we can get cases where the paths are the same but the + // descriptions differ, like this: + // + // "path": "size/other-files/icon-theme.cache/[r--p]", + // "description": "/usr/share/icons/gnome/icon-theme.cache (read-only, not executable, private)" + // + // "path": "size/other-files/icon-theme.cache/[r--p]" + // "description": "/usr/share/icons/hicolor/icon-theme.cache (read-only, not executable, private)" + // + // In those cases, we just use the description from the first-encountered + // one, which is what about:memory also does. + }, + + merge: function(aJr) { + this.assertCompatible(aJr.kind, aJr.units); + this._amount += aJr.amount; + this._nMerged++; + }, + + toJSON: function(aProcess, aPath, aAmount) { + return { + process: aProcess, + path: aPath, + kind: this._kind, + units: this._units, + amount: aAmount, + description: this._description, + _presence: this._presence + }; + } +}; + +// Constants that indicate if a DReport was present in both data sets, or +// added/removed in the second data set. +DReport.PRESENT_IN_FIRST_ONLY = 1; +DReport.PRESENT_IN_SECOND_ONLY = 2; + +/** + * Make a report map, which has combined path+process strings for keys, and + * DReport objects for values. + * + * @param aJSONReports + * The |reports| field of a JSON object. + * @return The constructed report map. + */ +function makeDReportMap(aJSONReports) +{ + let dreportMap = {}; + for (let i = 0; i < aJSONReports.length; i++) { + let jr = aJSONReports[i]; + + assert(jr.process !== undefined, "Missing process"); + assert(jr.path !== undefined, "Missing path"); + assert(jr.kind !== undefined, "Missing kind"); + assert(jr.units !== undefined, "Missing units"); + assert(jr.amount !== undefined, "Missing amount"); + assert(jr.description !== undefined, "Missing description"); + + // Strip out some non-deterministic stuff that prevents clean diffs -- + // e.g. PIDs, addresses. + let strippedProcess = jr.process.replace(/pid \d+/, "pid NNN"); + let strippedPath = jr.path.replace(/0x[0-9A-Fa-f]+/, "0xNNN"); + let processPath = strippedProcess + kProcessPathSep + strippedPath; + + let rOld = dreportMap[processPath]; + if (rOld === undefined) { + dreportMap[processPath] = + new DReport(jr.kind, jr.units, jr.amount, jr.description, 1, undefined); + } else { + rOld.merge(jr); + } + } + return dreportMap; +} + +// Return a new dreportMap which is the diff of two dreportMaps. Empties +// aDReportMap2 along the way. +function diffDReportMaps(aDReportMap1, aDReportMap2) +{ + let result = {}; + + for (let processPath in aDReportMap1) { + let r1 = aDReportMap1[processPath]; + let r2 = aDReportMap2[processPath]; + let r2_amount, r2_nMerged; + let presence; + if (r2 !== undefined) { + r1.assertCompatible(r2._kind, r2._units); + r2_amount = r2._amount; + r2_nMerged = r2._nMerged; + delete aDReportMap2[processPath]; + presence = undefined; // represents that it's present in both + } else { + r2_amount = 0; + r2_nMerged = 0; + presence = DReport.PRESENT_IN_FIRST_ONLY; + } + result[processPath] = + new DReport(r1._kind, r1._units, r2_amount - r1._amount, r1._description, + Math.max(r1._nMerged, r2_nMerged), presence); + } + + for (let processPath in aDReportMap2) { + let r2 = aDReportMap2[processPath]; + result[processPath] = new DReport(r2._kind, r2._units, r2._amount, + r2._description, r2._nMerged, + DReport.PRESENT_IN_SECOND_ONLY); + } + + return result; +} + +function makeJSONReports(aDReportMap) +{ + let reports = []; + for (let processPath in aDReportMap) { + let r = aDReportMap[processPath]; + if (r._amount !== 0) { + // If _nMerged > 1, we give the full (aggregated) amount in the first + // copy, and then use amount=0 in the remainder. When viewed in + // about:memory, this shows up as an entry with a "[2]"-style suffix + // and the correct amount. + let split = processPath.split(kProcessPathSep); + assert(split.length >= 2); + let process = split.shift(); + let path = split.join(); + reports.push(r.toJSON(process, path, r._amount)); + for (let i = 1; i < r._nMerged; i++) { + reports.push(r.toJSON(process, path, 0)); + } + } + } + + return reports; +} + + +// Diff two JSON objects holding memory reports. +function diffJSONObjects(aJson1, aJson2) +{ + function simpleProp(aProp) + { + assert(aJson1[aProp] !== undefined && aJson1[aProp] === aJson2[aProp], + aProp + " properties don't match"); + return aJson1[aProp]; + } + + return { + version: simpleProp("version"), + + hasMozMallocUsableSize: simpleProp("hasMozMallocUsableSize"), + + reports: makeJSONReports(diffDReportMaps(makeDReportMap(aJson1.reports), + makeDReportMap(aJson2.reports))) + }; +} + +//--------------------------------------------------------------------------- + // |PColl| is short for "process collection". function PColl() { @@ -823,7 +1088,7 @@ function getPCollsByProcess(aProcessMemoryReports, aForceShowSmaps) } function handleReport(aProcess, aUnsafePath, aKind, aUnits, aAmount, - aDescription) + aDescription, aPresence) { if (isExplicitPath(aUnsafePath)) { assertInput(aKind === KIND_HEAP || aKind === KIND_NONHEAP, @@ -842,6 +1107,10 @@ function getPCollsByProcess(aProcessMemoryReports, aForceShowSmaps) "non-sentence other description"); } + assert(aPresence === undefined || + aPresence == DReport.PRESENT_IN_FIRST_ONLY || + aPresence == DReport.PRESENT_IN_SECOND_ONLY); + let process = aProcess === "" ? gUnnamedProcessStr : aProcess; let unsafeNames = aUnsafePath.split('/'); let unsafeName0 = unsafeNames[0]; @@ -887,10 +1156,14 @@ function getPCollsByProcess(aProcessMemoryReports, aForceShowSmaps) // Duplicate! Sum the values and mark it as a dup. t._amount += aAmount; t._nMerged = t._nMerged ? t._nMerged + 1 : 2; + assert(t._presence === aPresence, "presence mismatch"); } else { - // New leaf node. Fill in extra details node from the report. + // New leaf node. Fill in extra node details from the report. t._amount = aAmount; t._description = aDescription; + if (aPresence !== undefined) { + t._presence = aPresence; + } } } @@ -919,6 +1192,7 @@ function TreeNode(aUnsafeName, aUnits, aIsDegenerate) // - _amount // - _description // - _nMerged (only defined if > 1) + // - _presence (only defined if value is PRESENT_IN_{FIRST,SECOND}_ONLY) // // Non-leaf TreeNodes have these properties added later: // - _kids @@ -1429,10 +1703,11 @@ const kNoKidsSep = " \u2500\u2500 ", kHideKidsSep = " ++ ", kShowKidsSep = " -- "; -function appendMrNameSpan(aP, aDescription, aUnsafeName, aIsInvalid, aNMerged) +function appendMrNameSpan(aP, aDescription, aUnsafeName, aIsInvalid, aNMerged, + aPresence) { let safeName = flipBackslashes(aUnsafeName); - if (!aIsInvalid && !aNMerged) { + if (!aIsInvalid && !aNMerged && !aPresence) { safeName += "\n"; } let nameSpan = appendElementWithText(aP, "span", "mrName", safeName); @@ -1450,12 +1725,35 @@ function appendMrNameSpan(aP, aDescription, aUnsafeName, aIsInvalid, aNMerged) } if (aNMerged) { - let noteSpan = appendElementWithText(aP, "span", "mrNote", - " [" + aNMerged + "]\n"); + let noteText = " [" + aNMerged + "]"; + if (!aPresence) { + noteText += "\n"; + } + let noteSpan = appendElementWithText(aP, "span", "mrNote", noteText); noteSpan.title = "This value is the sum of " + aNMerged + " memory reporters that all have the same path."; } + + if (aPresence) { + let c, nth; + switch (aPresence) { + case DReport.PRESENT_IN_FIRST_ONLY: + c = '-'; + nth = "first"; + break; + case DReport.PRESENT_IN_SECOND_ONLY: + c = '+'; + nth = "second"; + break; + default: assert(false, "bad presence"); + break; + } + let noteSpan = appendElementWithText(aP, "span", "mrNote", + " [" + c + "]\n"); + noteSpan.title = + "This value was only present in the " + nth + " set of memory reports."; + } } // This is used to record the (safe) IDs of which sub-trees have been manually @@ -1650,7 +1948,7 @@ function appendTreeElements(aP, aRoot, aProcess, aPadText) // The entry's name. appendMrNameSpan(d, aT._description, aT._unsafeName, - tIsInvalid, aT._nMerged); + tIsInvalid, aT._nMerged, aT._presence); // In non-verbose mode, invalid nodes can be hidden in collapsed sub-trees. // But it's good to always see them, so force this. @@ -1882,7 +2180,7 @@ function GhostWindow(aUnsafeURL) } GhostWindow.prototype = { - merge: function(r) { + merge: function(aR) { this._nMerged = this._nMerged ? this._nMerged + 1 : 2; } }; diff --git a/toolkit/components/aboutmemory/tests/Makefile.in b/toolkit/components/aboutmemory/tests/Makefile.in index b42e5d4d42f..ff4eb0b7ab0 100644 --- a/toolkit/components/aboutmemory/tests/Makefile.in +++ b/toolkit/components/aboutmemory/tests/Makefile.in @@ -14,6 +14,8 @@ include $(DEPTH)/config/autoconf.mk MOCHITEST_CHROME_FILES = \ memory-reports-good.json \ memory-reports-bad.json \ + memory-reports-diff1.json \ + memory-reports-diff2.json \ test_aboutcompartments.xul \ test_aboutmemory.xul \ test_aboutmemory2.xul \ diff --git a/toolkit/components/aboutmemory/tests/memory-reports-diff1.json b/toolkit/components/aboutmemory/tests/memory-reports-diff1.json new file mode 100644 index 00000000000..f651366b4fb --- /dev/null +++ b/toolkit/components/aboutmemory/tests/memory-reports-diff1.json @@ -0,0 +1,23 @@ +{ + "version": 1, + "hasMozMallocUsableSize": true, + "reports": [ + {"process": "P", "path": "explicit/xpcom/category-manager", "kind": 1, "units": 0, "amount": 56848, "description": "Desc."}, + {"process": "P", "path": "explicit/storage/prefixset/goog-phish-shavar", "kind": 1, "units": 0, "amount": 680000, "description": "Desc."}, + + {"process": "P", "path": "explicit/spell-check", "kind": 1, "units": 0, "amount": 4, "description": "Desc."}, + {"process": "P", "path": "explicit/spell-check", "kind": 1, "units": 0, "amount": 5, "description": "Desc."}, + + {"process": "P", "path": "page-faults-soft", "kind": 2, "units": 2, "amount": 61013, "description": "Desc."}, + + {"process": "P", "path": "foobar", "kind": 2, "units": 0, "amount": 100, "description": "Desc."}, + {"process": "P", "path": "zero1", "kind": 2, "units": 0, "amount": 0, "description": "Desc."}, + + {"process": "P2 (pid 22)", "path": "z 0x1234", "kind": 2, "units": 0, "amount": 33, "description": "Desc."}, + + {"process": "P3", "path": "p3", "kind": 2, "units": 0, "amount": 55, "description": "Desc."}, + + {"process": "P5", "path": "p5", "kind": 2, "units": 0, "amount": 0, "description": "Desc."} + ] +} + diff --git a/toolkit/components/aboutmemory/tests/memory-reports-diff2.json b/toolkit/components/aboutmemory/tests/memory-reports-diff2.json new file mode 100644 index 00000000000..07e88e88d43 --- /dev/null +++ b/toolkit/components/aboutmemory/tests/memory-reports-diff2.json @@ -0,0 +1,24 @@ +{ + "version": 1, + "hasMozMallocUsableSize": true, + "reports": [ + {"process": "P", "path": "explicit/xpcom/category-manager", "kind": 1, "units": 0, "amount": 56849, "description": "Desc."}, + {"process": "P", "path": "explicit/storage/prefixset/goog-phish-shavar", "kind": 1, "units": 0, "amount": 670000, "description": "Desc."}, + + {"process": "P", "path": "explicit/spell-check", "kind": 1, "units": 0, "amount": 3, "description": "Desc."}, + + {"process": "P", "path": "page-faults-soft", "kind": 2, "units": 2, "amount": 61013, "description": "Desc."}, + + {"process": "P", "path": "canvas-2d-pixel-bytes", "kind": 2, "units": 0, "amount": 1000, "description": "Desc."}, + {"process": "P", "path": "canvas-2d-pixel-bytes", "kind": 2, "units": 0, "amount": 2000, "description": "Desc."}, + + {"process": "P", "path": "foobaz", "kind": 2, "units": 0, "amount": 0, "description": "Desc."}, + + {"process": "P2 (pid 33)", "path": "z 0x5678", "kind": 2, "units": 0, "amount": 44, "description": "Desc."}, + + {"process": "P4", "path": "p4", "kind": 2, "units": 0, "amount": 66, "description": "Desc."}, + + {"process": "P6", "path": "p6", "kind": 2, "units": 0, "amount": 0, "description": "Desc."} + ] +} + diff --git a/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul b/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul index bf9c8fd658f..26c29a7017f 100644 --- a/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul +++ b/toolkit/components/aboutmemory/tests/test_aboutmemory3.xul @@ -72,9 +72,7 @@ ]]> - - - + "; let messageCount = 0; let panel = Panel({ @@ -132,7 +134,7 @@ exports["test Document Reload"] = function(assert, done) { onMessage: function (message) { messageCount++; if (messageCount == 1) { - assert.ok(/data:text\/html/.test(message), "First document had a content script"); + assert.ok(/data:text\/html/.test(message), "First document had a content script " + message); } else if (messageCount == 2) { assert.equal(message, "about:blank", "Second document too"); @@ -141,6 +143,7 @@ exports["test Document Reload"] = function(assert, done) { } } }); + assert.pass('Panel was created'); }; exports["test Parent Resize Hack"] = function(assert, done) { diff --git a/addon-sdk/source/test/test-tabs-common.js b/addon-sdk/source/test/test-tabs-common.js index 5ec93cb31e5..48283f92c01 100644 --- a/addon-sdk/source/test/test-tabs-common.js +++ b/addon-sdk/source/test/test-tabs-common.js @@ -381,3 +381,30 @@ exports.testImmediateClosing = function (test) { } }); } + +// TEST: tab.reload() +exports.testTabReload = function(test) { + test.waitUntilDone(); + + let url = "data:text/html;charset=utf-8,"; + + tabs.open({ + url: url, + onReady: function onReady(tab) { + tab.removeListener('ready', onReady); + + tab.once( + 'ready', + function onReload() { + test.pass("the tab was loaded again"); + test.assertEqual(tab.url, url, "the tab has the same URL"); + + // end test + tab.close(function() test.done()); + } + ); + + tab.reload(); + } + }); +}; diff --git a/addon-sdk/source/test/test-window-utils.js b/addon-sdk/source/test/test-window-utils.js index 52fdd579560..83d16142061 100644 --- a/addon-sdk/source/test/test-window-utils.js +++ b/addon-sdk/source/test/test-window-utils.js @@ -208,30 +208,20 @@ exports['test window watcher unregs 4 loading wins'] = function(assert, done) { } exports['test window watcher without untracker'] = function(assert, done) { - var myWindow; - var finished = false; - - var delegate = { + let myWindow; + let wt = new windowUtils.WindowTracker({ onTrack: function(window) { if (window == myWindow) { assert.pass("onTrack() called with our test window"); - timer.setTimeout(function() { - myWindow.close(); - if (!finished) { - finished = true; - myWindow = null; - wt.unload(); - done(); - } else { - assert.fail("onTrack() called multiple times."); - } - }, 1); + close(myWindow).then(function() { + wt.unload(); + done(); + }, assert.fail); } } - }; + }); - var wt = new windowUtils.WindowTracker(delegate); myWindow = makeEmptyWindow(); }; diff --git a/addon-sdk/source/test/test-xhr.js b/addon-sdk/source/test/test-xhr.js index 6cf585b55f9..e73dd1edebf 100644 --- a/addon-sdk/source/test/test-xhr.js +++ b/addon-sdk/source/test/test-xhr.js @@ -1,12 +1,13 @@ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + 'use strict' -var xhr = require("sdk/net/xhr"); -var timer = require("sdk/timers"); -var { Loader } = require("sdk/test/loader"); -var xulApp = require("sdk/system/xul-app"); +const xhr = require('sdk/net/xhr'); +const { Loader } = require('sdk/test/loader'); +const xulApp = require('sdk/system/xul-app'); +// TODO: rewrite test below /* Test is intentionally disabled until platform bug 707256 is fixed. exports.testAbortedXhr = function(test) { var req = new xhr.XMLHttpRequest(); @@ -16,67 +17,76 @@ exports.testAbortedXhr = function(test) { }; */ -exports.testLocalXhr = function(test) { +exports.testLocalXhr = function(assert, done) { var req = new xhr.XMLHttpRequest(); - req.overrideMimeType("text/plain"); - req.open("GET", module.uri); + let ready = false; + + req.overrideMimeType('text/plain'); + req.open('GET', module.uri); req.onreadystatechange = function() { if (req.readyState == 4 && (req.status == 0 || req.status == 200)) { - test.assertMatches(req.responseText, - /onreadystatechange/, - "XMLHttpRequest should get local files"); - timer.setTimeout( - function() { test.assertEqual(xhr.getRequestCount(), 0); - test.done(); }, - 0 - ); + ready = true; + assert.ok(req.responseText.match(/onreadystatechange/i), + 'XMLHttpRequest should get local files'); } }; + req.addEventListener('load', function onload() { + req.removeEventListener('load', onload); + assert.pass('addEventListener for load event worked'); + assert.ok(ready, 'onreadystatechange listener worked'); + assert.equal(xhr.getRequestCount(), 0, 'request count is 0'); + done(); + }); req.send(null); - test.assertEqual(xhr.getRequestCount(), 1); - test.waitUntilDone(4000); + + assert.equal(xhr.getRequestCount(), 1, 'request count is 1'); }; -exports.testUnload = function(test) { +exports.testUnload = function(assert) { var loader = Loader(module); - var sbxhr = loader.require("sdk/net/xhr"); + var sbxhr = loader.require('sdk/net/xhr'); var req = new sbxhr.XMLHttpRequest(); - req.overrideMimeType("text/plain"); + + req.overrideMimeType('text/plain'); req.open("GET", module.uri); req.send(null); - test.assertEqual(sbxhr.getRequestCount(), 1); + + assert.equal(sbxhr.getRequestCount(), 1, 'request count is 1'); loader.unload(); - test.assertEqual(sbxhr.getRequestCount(), 0); + assert.equal(sbxhr.getRequestCount(), 0, 'request count is 0'); }; -exports.testResponseHeaders = function(test) { +exports.testResponseHeaders = function(assert, done) { var req = new xhr.XMLHttpRequest(); - req.overrideMimeType("text/plain"); - req.open("GET", module.uri); + + req.overrideMimeType('text/plain'); + req.open('GET', module.uri); req.onreadystatechange = function() { if (req.readyState == 4 && (req.status == 0 || req.status == 200)) { var headers = req.getAllResponseHeaders(); - if (xulApp.versionInRange(xulApp.platformVersion, "13.0a1", "*")) { + if (xulApp.satisfiesVersion(xulApp.platformVersion, '>=13.0a1')) { headers = headers.split("\r\n"); - if(headers.length == 1) { + if (headers.length == 1) { headers = headers[0].split("\n"); } - for(let i in headers) { - if(headers[i] && headers[i].search("Content-Type") >= 0) { - test.assertEqual(headers[i], "Content-Type: text/plain", - "XHR's headers are valid"); + for (let i in headers) { + if (headers[i] && headers[i].search('Content-Type') >= 0) { + assert.equal(headers[i], 'Content-Type: text/plain', + 'XHR\'s headers are valid'); } } } else { - test.assert(headers === null || headers === "", - "XHR's headers are empty"); + assert.ok(headers === null || headers === '', + 'XHR\'s headers are empty'); } - test.done(); + + done(); } }; req.send(null); - test.assertEqual(xhr.getRequestCount(), 1); - test.waitUntilDone(4000); + + assert.equal(xhr.getRequestCount(), 1, 'request count is 1'); } +require('test').run(exports); diff --git a/addon-sdk/source/test/windows/test-firefox-windows.js b/addon-sdk/source/test/windows/test-firefox-windows.js index e6ab606952a..a6ae1367552 100644 --- a/addon-sdk/source/test/windows/test-firefox-windows.js +++ b/addon-sdk/source/test/windows/test-firefox-windows.js @@ -296,15 +296,6 @@ exports.testTrackWindows = function(test) { "activate 2", "global activate 2" ]; - function shutdown(window) { - if (this.length === 1) { - test.assertEqual(actions.join(), expects.join(), - "correct activate and deactivate sequence") - - test.done(); - } - } - function openWindow() { windows.push(browserWindows.open({ url: "data:text/html;charset=utf-8,testTrackWindows", @@ -312,18 +303,28 @@ exports.testTrackWindows = function(test) { onActivate: function(window) { let index = windows.indexOf(window); + test.assertEqual(actions.join(), expects.slice(0, index*4).join(), expects[index*4]); actions.push("activate " + index); - if (windows.length < 3) + if (windows.length < 3) { openWindow() - else - for each (let win in windows) - win.close(shutdown) + } + else { + let count = windows.length; + for each (let win in windows) { + win.close(function() { + if (--count == 0) { + test.done(); + } + }); + } + } }, onDeactivate: function(window) { let index = windows.indexOf(window); + test.assertEqual(actions.join(), expects.slice(0, index*4 + 2).join(), expects[index*4 + 2]); actions.push("deactivate " + index) } })); @@ -334,6 +335,8 @@ exports.testTrackWindows = function(test) { // only concerned with windows opened for this test if (index < 0) return; + + test.assertEqual(actions.join(), expects.slice(0, index*4 + 1).join(), expects[index*4 + 1]); actions.push("global activate " + index) }) @@ -342,6 +345,8 @@ exports.testTrackWindows = function(test) { // only concerned with windows opened for this test if (index < 0) return; + + test.assertEqual(actions.join(), expects.slice(0, index*4 + 3).join(), expects[index*4 + 3]); actions.push("global deactivate " + index) }) @@ -361,9 +366,7 @@ exports.testWindowOpenPrivateDefault = function(test) { test.assertEqual(tab.url, 'about:mozilla', 'opened correct tab'); test.assertEqual(isPrivate(tab), false, 'tab is not private'); - window.close(function() { - test.done(); - }); + window.close(test.done.bind(test)); }); } }); From 95e612bedbf6fd0625bbe04d0945e3e79a6149b6 Mon Sep 17 00:00:00 2001 From: Sam Foster Date: Fri, 26 Apr 2013 10:29:59 +0100 Subject: [PATCH 091/155] Bug 865478 - Add getItemsByUrl and removeItem methods to richgrid + tests. r=mbrubeck --- browser/metro/base/content/bindings/grid.xml | 33 +++++++++-- .../base/tests/mochitest/browser_tilegrid.xul | 13 +++++ .../base/tests/mochitest/browser_tiles.js | 56 ++++++++++++++++++- 3 files changed, 96 insertions(+), 6 deletions(-) diff --git a/browser/metro/base/content/bindings/grid.xml b/browser/metro/base/content/bindings/grid.xml index ee6b7e34060..7444dd65944 100644 --- a/browser/metro/base/content/bindings/grid.xml +++ b/browser/metro/base/content/bindings/grid.xml @@ -225,15 +225,29 @@ + + + + + + + + + @@ -241,7 +255,7 @@ if (!anItem) return -1; - return Array.prototype.indexOf.call(this.children, anItem); + return Array.indexOf(this.children, anItem); ]]> @@ -257,6 +271,15 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/browser/metro/base/tests/mochitest/browser_tiles.js b/browser/metro/base/tests/mochitest/browser_tiles.js index 3eb653b9e51..f94acbcf5b1 100644 --- a/browser/metro/base/tests/mochitest/browser_tiles.js +++ b/browser/metro/base/tests/mochitest/browser_tiles.js @@ -1,4 +1,4 @@ -let doc, win; +let doc; function test() { waitForExplicitFinish(); @@ -170,6 +170,60 @@ gTests.push({ } }); +gTests.push({ + desc: "getItemsByUrl", + run: function() { + let grid = doc.querySelector("#grid5"); + + is(grid.itemCount, 4, "4 items total"); + is(typeof grid.getItemsByUrl, "function", "getItemsByUrl is a function on the grid"); + + ['about:blank', 'http://bugzilla.mozilla.org/'].forEach(function(testUrl) { + let items = grid.getItemsByUrl(testUrl); + is(items.length, 2, "2 matching items in the test grid"); + is(items.item(0).url, testUrl, "Matched item has correct url property"); + is(items.item(1).url, testUrl, "Matched item has correct url property"); + }); + + let badUrl = 'http://gopher.well.com:70/'; + let items = grid.getItemsByUrl(badUrl); + is(items.length, 0, "0 items matched url: "+badUrl); + + } +}); + +gTests.push({ + desc: "removeItem", + run: function() { + let grid = doc.querySelector("#grid5"); + + is(grid.itemCount, 4, "4 items total"); + is(typeof grid.removeItem, "function", "removeItem is a function on the grid"); + + let arrangeStub = stubMethod(grid, "arrangeItems"); + let removedFirst = grid.removeItem( grid.children[0] ); + + is(arrangeStub.callCount, 1, "arrangeItems is called when we removeItem"); + + let removed2nd = grid.removeItem( grid.children[0], true); + is(removed2nd.getAttribute("label"), "2nd item", "the next item was returned"); + is(grid.itemCount, 2, "2 items remain"); + + // callCount should still be at 1 + is(arrangeStub.callCount, 1, "arrangeItems is not called when we pass the truthy skipArrange param"); + + let otherItem = grid.ownerDocument.querySelector("#grid6_item1"); + let removedFail = grid.removeItem(otherItem); + ok(!removedFail, "Falsy value returned when non-child item passed"); + is(grid.itemCount, 2, "2 items remain"); + + // callCount should still be at 1 + is(arrangeStub.callCount, 1, "arrangeItems is not called when nothing is matched"); + + arrangeStub.restore(); + } +}); + gTests.push({ desc: "selections (single)", run: function() { From 0524c01499f00652d1f5963a15d23532373cfa9a Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Fri, 26 Apr 2013 12:10:28 +0200 Subject: [PATCH 092/155] Bug 865406 - Disable IonMonkey LICM if a script bails out frequently. r=h4writer --- js/src/ion/Bailouts.cpp | 21 ++++++++++++++++++++- js/src/ion/Bailouts.h | 2 ++ js/src/ion/BaselineBailouts.cpp | 5 ++++- js/src/ion/Ion.cpp | 22 ++++++++++++++-------- js/src/ion/Ion.h | 7 +++++++ js/src/ion/IonCode.h | 16 ++++++++-------- js/src/jsscript.h | 2 ++ 7 files changed, 57 insertions(+), 18 deletions(-) diff --git a/js/src/ion/Bailouts.cpp b/js/src/ion/Bailouts.cpp index 145891ab9c3..842e545350c 100644 --- a/js/src/ion/Bailouts.cpp +++ b/js/src/ion/Bailouts.cpp @@ -244,7 +244,7 @@ ConvertFrames(JSContext *cx, IonActivation *activation, IonBailoutIterator &it) // Set a flag to avoid bailing out on every iteration or function call. Ion can // compile and run the script again after an invalidation. - it.ionScript()->setBailoutExpected(); + it.ionScript()->incNumBailouts(); it.script()->updateBaselineOrIonRaw(); // We use OffTheBooks instead of cx because at this time we cannot iterate @@ -686,3 +686,22 @@ ion::ThunkToInterpreter(Value *vp) return status; } +bool +ion::CheckFrequentBailouts(JSContext *cx, JSScript *script) +{ + // Invalidate if this script keeps bailing out without invalidation. Next time + // we compile this script LICM will be disabled. + + if (script->hasIonScript() && + script->ionScript()->numBailouts() >= js_IonOptions.frequentBailoutThreshold) + { + script->hadFrequentBailouts = true; + + IonSpew(IonSpew_Invalidate, "Invalidating due to too many bailouts"); + + if (!Invalidate(cx, script)) + return false; + } + + return true; +} diff --git a/js/src/ion/Bailouts.h b/js/src/ion/Bailouts.h index d9d514d9e10..73c8409f55b 100644 --- a/js/src/ion/Bailouts.h +++ b/js/src/ion/Bailouts.h @@ -228,6 +228,8 @@ uint32_t CachedShapeGuardFailure(); uint32_t FinishBailoutToBaseline(BaselineBailoutInfo *bailoutInfo); +bool CheckFrequentBailouts(JSContext *cx, JSScript *script); + } // namespace ion } // namespace js diff --git a/js/src/ion/BaselineBailouts.cpp b/js/src/ion/BaselineBailouts.cpp index fc1e6fac253..d021e06b8bf 100644 --- a/js/src/ion/BaselineBailouts.cpp +++ b/js/src/ion/BaselineBailouts.cpp @@ -1044,7 +1044,7 @@ ion::BailoutIonToBaseline(JSContext *cx, IonActivation *activation, IonBailoutIt IonSpew(IonSpew_BaselineBailouts, " Reading from snapshot offset %u size %u", iter.snapshotOffset(), iter.ionScript()->snapshotsSize()); - iter.ionScript()->setBailoutExpected(); + iter.ionScript()->incNumBailouts(); iter.script()->updateBaselineOrIonRaw(); // Allocate buffer to hold stack replacement data. @@ -1288,5 +1288,8 @@ ion::FinishBailoutToBaseline(BaselineBailoutInfo *bailoutInfo) JS_NOT_REACHED("Unknown bailout kind!"); } + if (!CheckFrequentBailouts(cx, outerScript)) + return false; + return true; } diff --git a/js/src/ion/Ion.cpp b/js/src/ion/Ion.cpp index 59b1f68137c..10c68f8e182 100644 --- a/js/src/ion/Ion.cpp +++ b/js/src/ion/Ion.cpp @@ -535,7 +535,7 @@ IonScript::IonScript() osrEntryOffset_(0), invalidateEpilogueOffset_(0), invalidateEpilogueDataOffset_(0), - bailoutExpected_(0), + numBailouts_(0), hasInvalidatedCallTarget_(false), runtimeData_(0), runtimeSize_(0), @@ -1009,14 +1009,20 @@ OptimizeMIR(MIRGenerator *mir) return false; if (js_IonOptions.licm) { - LICM licm(mir, graph); - if (!licm.analyze()) - return false; - IonSpewPass("LICM"); - AssertExtendedGraphCoherency(graph); + // LICM can hoist instructions from conditional branches and trigger + // repeated bailouts. Disable it if this script is known to bailout + // frequently. + JSScript *script = mir->info().script(); + if (!script || !script->hadFrequentBailouts) { + LICM licm(mir, graph); + if (!licm.analyze()) + return false; + IonSpewPass("LICM"); + AssertExtendedGraphCoherency(graph); - if (mir->shouldCancel("LICM")) - return false; + if (mir->shouldCancel("LICM")) + return false; + } } if (js_IonOptions.rangeAnalysis) { diff --git a/js/src/ion/Ion.h b/js/src/ion/Ion.h index d3df065f0d7..8c305a687d6 100644 --- a/js/src/ion/Ion.h +++ b/js/src/ion/Ion.h @@ -120,6 +120,12 @@ struct IonOptions // Default: 6,000 uint32_t osrPcMismatchesBeforeRecompile; + // Number of bailouts without invalidation before we set + // JSScript::hadFrequentBailouts and invalidate. + // + // Default: 10 + uint32_t frequentBailoutThreshold; + // How many actual arguments are accepted on the C stack. // // Default: 4,096 @@ -201,6 +207,7 @@ struct IonOptions usesBeforeCompileNoJaeger(40), usesBeforeInliningFactor(.125), osrPcMismatchesBeforeRecompile(6000), + frequentBailoutThreshold(10), maxStackArgs(4096), maxInlineDepth(3), smallFunctionMaxInlineDepth(10), diff --git a/js/src/ion/IonCode.h b/js/src/ion/IonCode.h index 0c60046942d..df32ae4c6b0 100644 --- a/js/src/ion/IonCode.h +++ b/js/src/ion/IonCode.h @@ -170,8 +170,8 @@ struct IonScript // per-platform if we want. uint32_t invalidateEpilogueDataOffset_; - // Flag set when we bailout, to avoid frequent bailouts. - uint32_t bailoutExpected_; + // Number of times this script bailed out without invalidation. + uint32_t numBailouts_; // Flag set when we bailed out in parallel execution and should ensure its // call targets are compiled. @@ -302,9 +302,6 @@ struct IonScript static inline size_t offsetOfOsrEntryOffset() { return offsetof(IonScript, osrEntryOffset_); } - static size_t offsetOfBailoutExpected() { - return offsetof(IonScript, bailoutExpected_); - } public: IonCode *method() const { @@ -354,11 +351,14 @@ struct IonScript JS_ASSERT(invalidateEpilogueDataOffset_); return invalidateEpilogueDataOffset_; } - void setBailoutExpected() { - bailoutExpected_ = 1; + void incNumBailouts() { + numBailouts_++; + } + uint32_t numBailouts() const { + return numBailouts_; } bool bailoutExpected() const { - return bailoutExpected_ ? true : false; + return numBailouts_ > 0; } void setHasInvalidatedCallTarget() { hasInvalidatedCallTarget_ = true; diff --git a/js/src/jsscript.h b/js/src/jsscript.h index 8c514862e9e..d9ddeebda67 100644 --- a/js/src/jsscript.h +++ b/js/src/jsscript.h @@ -504,8 +504,10 @@ class JSScript : public js::gc::Cell #endif #ifdef JS_ION bool failedShapeGuard:1; /* script has had hoisted shape guard fail */ + bool hadFrequentBailouts:1; #else bool failedShapeGuardPad:1; + bool hadFrequentBailoutsPad:1; #endif bool invalidatedIdempotentCache:1; /* idempotent cache has triggered invalidation */ bool isGenerator:1; /* is a generator */ From 812d9b5f5a89d0d926b60a1986d972bb86a160f2 Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Fri, 26 Apr 2013 12:17:25 +0200 Subject: [PATCH 093/155] Bug 864891 - b2g/chrome/content/forms.js can dispatch a 'change' event on the wrong window in a single process build. r=fabrice --- b2g/chrome/content/forms.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/b2g/chrome/content/forms.js b/b2g/chrome/content/forms.js index 0c11fb8760d..55f7ebb04df 100644 --- a/b2g/chrome/content/forms.js +++ b/b2g/chrome/content/forms.js @@ -351,7 +351,7 @@ let FormAssistant = { case "Forms:Input:Value": { target.value = json.value; - let event = content.document.createEvent('HTMLEvents'); + let event = target.ownerDocument.createEvent('HTMLEvents'); event.initEvent('input', true, false); target.dispatchEvent(event); break; @@ -377,7 +377,7 @@ let FormAssistant = { // only fire onchange event if any selected option is changed if (valueChanged) { - let event = content.document.createEvent('HTMLEvents'); + let event = target.ownerDocument.createEvent('HTMLEvents'); event.initEvent('change', true, true); target.dispatchEvent(event); } From f3510c8c3a1631b60e3bce61ea00462361273e79 Mon Sep 17 00:00:00 2001 From: Kevin Grandon Date: Fri, 26 Apr 2013 12:17:25 +0200 Subject: [PATCH 094/155] Bug 861496 - Replace #ifdef MOZ_SYS_MSG by a preference. r=fabrice --- b2g/app/b2g.js | 4 +- b2g/confvars.sh | 1 - configure.in | 9 ----- dom/activities/src/Activity.h | 7 +--- dom/apps/src/Webapps.jsm | 67 ++++++++++++++++++--------------- dom/base/Navigator.cpp | 20 ++++------ dom/base/Navigator.h | 3 +- dom/base/nsDOMClassInfo.cpp | 7 ++-- modules/libpref/src/init/all.js | 3 ++ 9 files changed, 58 insertions(+), 63 deletions(-) diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 24e8154ef9d..9656a1d34d7 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -517,6 +517,8 @@ pref("ui.click_hold_context_menus.delay", 750); // Enable device storage pref("device.storage.enabled", true); +// Enable system message +pref("dom.sysmsg.enabled", true); pref("media.plugins.enabled", false); pref("media.omx.enabled", true); @@ -673,4 +675,4 @@ pref("consoleservice.buffered", false); #ifdef MOZ_WIDGET_GONK // Performance testing suggests 2k is a better page size for SQLite. pref("toolkit.storage.pageSize", 2048); -#endif \ No newline at end of file +#endif diff --git a/b2g/confvars.sh b/b2g/confvars.sh index 21cc5e083d6..f86f2a454c7 100644 --- a/b2g/confvars.sh +++ b/b2g/confvars.sh @@ -47,7 +47,6 @@ MOZ_MEDIA_NAVIGATOR=1 MOZ_APP_ID={3c2e2abc-06d4-11e1-ac3b-374f68613e61} MOZ_EXTENSION_MANAGER=1 -MOZ_SYS_MSG=1 MOZ_TIME_MANAGER=1 MOZ_B2G_CERTDATA=1 diff --git a/configure.in b/configure.in index 71666cef3c2..3bc8c519fa1 100644 --- a/configure.in +++ b/configure.in @@ -4263,7 +4263,6 @@ MOZ_WEBSMS_BACKEND= MOZ_ANDROID_WALLPAPER= MOZ_ANDROID_BEAM= ACCESSIBILITY=1 -MOZ_SYS_MSG= MOZ_TIME_MANAGER= MOZ_PAY= MOZ_AUDIO_CHANNEL_MANAGER= @@ -7642,14 +7641,6 @@ if test -n "$MOZ_B2G_BT"; then fi AC_SUBST(MOZ_B2G_BT) -dnl ======================================================== -dnl = Enable Support for System Messages API -dnl ======================================================== -if test -n "$MOZ_SYS_MSG"; then - AC_DEFINE(MOZ_SYS_MSG) -fi -AC_SUBST(MOZ_SYS_MSG) - dnl ======================================================== dnl = Enable Support for Time Manager API dnl ======================================================== diff --git a/dom/activities/src/Activity.h b/dom/activities/src/Activity.h index 64e3eaba37d..4626e834782 100644 --- a/dom/activities/src/Activity.h +++ b/dom/activities/src/Activity.h @@ -8,6 +8,7 @@ #include "DOMRequest.h" #include "mozilla/dom/BindingDeclarations.h" #include "nsIActivityProxy.h" +#include "mozilla/Preferences.h" #define NS_DOMACTIVITY_CID \ {0x1c5b0930, 0xc90c, 0x4e9c, {0xaf, 0x4e, 0xb0, 0xb7, 0xa6, 0x59, 0xb4, 0xed}} @@ -28,11 +29,7 @@ public: static bool PrefEnabled() { -#ifdef MOZ_SYS_MSG - return true; -#else - return false; -#endif + return Preferences::GetBool("dom.sysmsg.enabled", false); } static already_AddRefed diff --git a/dom/apps/src/Webapps.jsm b/dom/apps/src/Webapps.jsm index c751670b644..b07104cf375 100644 --- a/dom/apps/src/Webapps.jsm +++ b/dom/apps/src/Webapps.jsm @@ -25,6 +25,14 @@ function debug(aMsg) { //dump("-*-*- Webapps.jsm : " + aMsg + "\n"); } +let cachedSysMsgPref = null; +function supportSystemMessages() { + if (_sysMsgPref === null) { + cachedSysMsgPref = Services.prefs.getBoolPref("dom.sysmsg.enabled"); + } + return cachedSysMsgPref; +} + // Minimum delay between two progress events while downloading, in ms. const MIN_PROGRESS_EVENT_DELAY = 1000; @@ -180,21 +188,21 @@ this.DOMApplicationRegistry = { for (let id in this.webapps) { ids.push({ id: id }); } -#ifdef MOZ_SYS_MSG - this._processManifestForIds(ids, aRunUpdate); -#else - // Read the CSPs. If MOZ_SYS_MSG is defined this is done on - // _processManifestForIds so as to not reading the manifests - // twice - this._readManifests(ids, (function readCSPs(aResults) { - aResults.forEach(function registerManifest(aResult) { - this.webapps[aResult.id].csp = aResult.manifest.csp || ""; - }, this); - }).bind(this)); + if (supportSystemMessages()) { + this._processManifestForIds(ids, aRunUpdate); + } else { + // Read the CSPs. If MOZ_SYS_MSG is defined this is done on + // _processManifestForIds so as to not reading the manifests + // twice + this._readManifests(ids, (function readCSPs(aResults) { + aResults.forEach(function registerManifest(aResult) { + this.webapps[aResult.id].csp = aResult.manifest.csp || ""; + }, this); + }).bind(this)); - // Nothing else to do but notifying we're ready. - this.notifyAppsRegistryReady(); -#endif + // Nothing else to do but notifying we're ready. + this.notifyAppsRegistryReady(); + } }, updatePermissionsForApp: function updatePermissionsForApp(aId) { @@ -439,7 +447,6 @@ this.DOMApplicationRegistry = { }).bind(this)); }, -#ifdef MOZ_SYS_MSG // |aEntryPoint| is either the entry_point name or the null in which case we // use the root of the manifest. _registerSystemMessagesForEntryPoint: function(aManifest, aApp, aEntryPoint) { @@ -657,7 +664,6 @@ this.DOMApplicationRegistry = { this._registerActivitiesForApps(appsToRegister, aRunUpdate); }).bind(this)); }, -#endif observe: function(aSubject, aTopic, aData) { if (aTopic == "xpcom-shutdown") { @@ -1284,16 +1290,17 @@ this.DOMApplicationRegistry = { updateAppHandlers: function(aOldManifest, aNewManifest, aApp) { debug("updateAppHandlers: old=" + aOldManifest + " new=" + aNewManifest); this.notifyAppsRegistryStart(); -#ifdef MOZ_SYS_MSG - if (aOldManifest) { - this._unregisterActivities(aOldManifest, aApp); + + if (supportSystemMessages()) { + if (aOldManifest) { + this._unregisterActivities(aOldManifest, aApp); + } + this._registerSystemMessages(aNewManifest, aApp); + this._registerActivities(aNewManifest, aApp, true); + } else { + // Nothing else to do but notifying we're ready. + this.notifyAppsRegistryReady(); } - this._registerSystemMessages(aNewManifest, aApp); - this._registerActivities(aNewManifest, aApp, true); -#else - // Nothing else to do but notifying we're ready. - this.notifyAppsRegistryReady(); -#endif }, checkForUpdate: function(aData, aMm) { @@ -2486,11 +2493,11 @@ this.DOMApplicationRegistry = { let appNote = JSON.stringify(AppsUtils.cloneAppObject(app)); appNote.id = id; -#ifdef MOZ_SYS_MSG - this._readManifests([{ id: id }], (function unregisterManifest(aResult) { - this._unregisterActivities(aResult[0].manifest, app); - }).bind(this)); -#endif + if (supportSystemMessages()) { + this._readManifests([{ id: id }], (function unregisterManifest(aResult) { + this._unregisterActivities(aResult[0].manifest, app); + }).bind(this)); + } let dir = this._getAppDir(id); try { diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp index 4d4eaa61bab..91e656c3f80 100644 --- a/dom/base/Navigator.cpp +++ b/dom/base/Navigator.cpp @@ -225,11 +225,9 @@ Navigator::Invalidate() mCameraManager = nullptr; -#ifdef MOZ_SYS_MSG if (mMessagesManager) { mMessagesManager = nullptr; } -#endif #ifdef MOZ_AUDIO_CHANNEL_MANAGER if (mAudioChannelManager) { @@ -1411,7 +1409,6 @@ Navigator::GetMozBluetooth(nsIDOMBluetoothManager** aBluetooth) //***************************************************************************** // nsNavigator::nsIDOMNavigatorSystemMessages //***************************************************************************** -#ifdef MOZ_SYS_MSG nsresult Navigator::EnsureMessagesManager() { @@ -1439,34 +1436,33 @@ Navigator::EnsureMessagesManager() return NS_OK; } -#endif NS_IMETHODIMP Navigator::MozHasPendingMessage(const nsAString& aType, bool *aResult) { -#ifdef MOZ_SYS_MSG + if (!Preferences::GetBool("dom.sysmsg.enabled", false)) { + return NS_ERROR_NOT_IMPLEMENTED; + } + *aResult = false; nsresult rv = EnsureMessagesManager(); NS_ENSURE_SUCCESS(rv, rv); return mMessagesManager->MozHasPendingMessage(aType, aResult); -#else - return NS_ERROR_NOT_IMPLEMENTED; -#endif } NS_IMETHODIMP Navigator::MozSetMessageHandler(const nsAString& aType, nsIDOMSystemMessageCallback *aCallback) { -#ifdef MOZ_SYS_MSG + if (!Preferences::GetBool("dom.sysmsg.enabled", false)) { + return NS_ERROR_NOT_IMPLEMENTED; + } + nsresult rv = EnsureMessagesManager(); NS_ENSURE_SUCCESS(rv, rv); return mMessagesManager->MozSetMessageHandler(aType, aCallback); -#else - return NS_ERROR_NOT_IMPLEMENTED; -#endif } //***************************************************************************** diff --git a/dom/base/Navigator.h b/dom/base/Navigator.h index 165e4024dd5..eede6887990 100644 --- a/dom/base/Navigator.h +++ b/dom/base/Navigator.h @@ -186,10 +186,9 @@ public: */ void OnNavigation(); -#ifdef MOZ_SYS_MSG // Helper to initialize mMessagesManager. nsresult EnsureMessagesManager(); -#endif + NS_DECL_NSIDOMNAVIGATORCAMERA private: diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 87f9583ca5d..b96529515ce 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -281,6 +281,8 @@ using mozilla::dom::workers::ResolveWorkerClasses; #include "nsIDOMMediaQueryList.h" +#include "mozilla/dom/Activity.h" + #include "nsDOMTouchEvent.h" #include "nsWrapperCacheInlines.h" @@ -1662,9 +1664,8 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMNavigatorBluetooth) #endif DOM_CLASSINFO_MAP_ENTRY(nsIDOMNavigatorCamera) -#ifdef MOZ_SYS_MSG - DOM_CLASSINFO_MAP_ENTRY(nsIDOMNavigatorSystemMessages) -#endif + DOM_CLASSINFO_MAP_CONDITIONAL_ENTRY(nsIDOMNavigatorSystemMessages, + Activity::PrefEnabled()) #ifdef MOZ_TIME_MANAGER DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozNavigatorTime) #endif diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 5297cad9e0f..19d5631801e 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -751,6 +751,9 @@ pref("dom.experimental_forms", false); // Don't enable yet: pref("dom.experimental_forms_range", true); +// Enables system messages and activities +pref("dom.sysmsg.enabled", false); + // Allocation Threshold for Workers pref("dom.workers.mem.gc_allocation_threshold_mb", 30); From 1f6cdaa595e545baa0107f1279452c3d9544b31b Mon Sep 17 00:00:00 2001 From: Vivien Nicolas <21@vingtetun.org> Date: Fri, 26 Apr 2013 12:17:25 +0200 Subject: [PATCH 095/155] Bug 847352 - Preload SystemMessageHandler.js. r=fabrice --- dom/ipc/preload.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dom/ipc/preload.js b/dom/ipc/preload.js index f9fcf1f46c6..bb361faf8ba 100644 --- a/dom/ipc/preload.js +++ b/dom/ipc/preload.js @@ -79,6 +79,12 @@ const BrowserElementIsPreloaded = true; /* Applications Specific Helper */ Cc["@mozilla.org/settingsManager;1"].getService(Ci["nsIDOMSettingsManager"]); + try { + if (Services.prefs.getBoolPref("dom.sysmsg.enabled")) { + Cc["@mozilla.org/system-message-manager;1"].getService(Ci["nsIDOMNavigatorSystemMessages"]); + } + } catch(e) { + } // This is a produc-specific file that's sometimes unavailable. try { From 2eb87829ec08e94cb64c4d2fc97fcaee0bf1ba60 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Fri, 26 Apr 2013 13:23:17 +0200 Subject: [PATCH 096/155] Backout changesets 8d69a81abff9:6c2e3ea6afa6 for M2 timeouts and crashtest, reftest leaks. --- b2g/app/b2g.js | 4 +- b2g/chrome/content/forms.js | 4 +- b2g/confvars.sh | 1 + configure.in | 9 +++++ dom/activities/src/Activity.h | 7 +++- dom/apps/src/Webapps.jsm | 67 +++++++++++++++------------------ dom/base/Navigator.cpp | 20 ++++++---- dom/base/Navigator.h | 3 +- dom/base/nsDOMClassInfo.cpp | 7 ++-- dom/ipc/preload.js | 6 --- modules/libpref/src/init/all.js | 3 -- 11 files changed, 65 insertions(+), 66 deletions(-) diff --git a/b2g/app/b2g.js b/b2g/app/b2g.js index 9656a1d34d7..24e8154ef9d 100644 --- a/b2g/app/b2g.js +++ b/b2g/app/b2g.js @@ -517,8 +517,6 @@ pref("ui.click_hold_context_menus.delay", 750); // Enable device storage pref("device.storage.enabled", true); -// Enable system message -pref("dom.sysmsg.enabled", true); pref("media.plugins.enabled", false); pref("media.omx.enabled", true); @@ -675,4 +673,4 @@ pref("consoleservice.buffered", false); #ifdef MOZ_WIDGET_GONK // Performance testing suggests 2k is a better page size for SQLite. pref("toolkit.storage.pageSize", 2048); -#endif +#endif \ No newline at end of file diff --git a/b2g/chrome/content/forms.js b/b2g/chrome/content/forms.js index 55f7ebb04df..0c11fb8760d 100644 --- a/b2g/chrome/content/forms.js +++ b/b2g/chrome/content/forms.js @@ -351,7 +351,7 @@ let FormAssistant = { case "Forms:Input:Value": { target.value = json.value; - let event = target.ownerDocument.createEvent('HTMLEvents'); + let event = content.document.createEvent('HTMLEvents'); event.initEvent('input', true, false); target.dispatchEvent(event); break; @@ -377,7 +377,7 @@ let FormAssistant = { // only fire onchange event if any selected option is changed if (valueChanged) { - let event = target.ownerDocument.createEvent('HTMLEvents'); + let event = content.document.createEvent('HTMLEvents'); event.initEvent('change', true, true); target.dispatchEvent(event); } diff --git a/b2g/confvars.sh b/b2g/confvars.sh index f86f2a454c7..21cc5e083d6 100644 --- a/b2g/confvars.sh +++ b/b2g/confvars.sh @@ -47,6 +47,7 @@ MOZ_MEDIA_NAVIGATOR=1 MOZ_APP_ID={3c2e2abc-06d4-11e1-ac3b-374f68613e61} MOZ_EXTENSION_MANAGER=1 +MOZ_SYS_MSG=1 MOZ_TIME_MANAGER=1 MOZ_B2G_CERTDATA=1 diff --git a/configure.in b/configure.in index 3bc8c519fa1..71666cef3c2 100644 --- a/configure.in +++ b/configure.in @@ -4263,6 +4263,7 @@ MOZ_WEBSMS_BACKEND= MOZ_ANDROID_WALLPAPER= MOZ_ANDROID_BEAM= ACCESSIBILITY=1 +MOZ_SYS_MSG= MOZ_TIME_MANAGER= MOZ_PAY= MOZ_AUDIO_CHANNEL_MANAGER= @@ -7641,6 +7642,14 @@ if test -n "$MOZ_B2G_BT"; then fi AC_SUBST(MOZ_B2G_BT) +dnl ======================================================== +dnl = Enable Support for System Messages API +dnl ======================================================== +if test -n "$MOZ_SYS_MSG"; then + AC_DEFINE(MOZ_SYS_MSG) +fi +AC_SUBST(MOZ_SYS_MSG) + dnl ======================================================== dnl = Enable Support for Time Manager API dnl ======================================================== diff --git a/dom/activities/src/Activity.h b/dom/activities/src/Activity.h index 4626e834782..64e3eaba37d 100644 --- a/dom/activities/src/Activity.h +++ b/dom/activities/src/Activity.h @@ -8,7 +8,6 @@ #include "DOMRequest.h" #include "mozilla/dom/BindingDeclarations.h" #include "nsIActivityProxy.h" -#include "mozilla/Preferences.h" #define NS_DOMACTIVITY_CID \ {0x1c5b0930, 0xc90c, 0x4e9c, {0xaf, 0x4e, 0xb0, 0xb7, 0xa6, 0x59, 0xb4, 0xed}} @@ -29,7 +28,11 @@ public: static bool PrefEnabled() { - return Preferences::GetBool("dom.sysmsg.enabled", false); +#ifdef MOZ_SYS_MSG + return true; +#else + return false; +#endif } static already_AddRefed diff --git a/dom/apps/src/Webapps.jsm b/dom/apps/src/Webapps.jsm index b07104cf375..c751670b644 100644 --- a/dom/apps/src/Webapps.jsm +++ b/dom/apps/src/Webapps.jsm @@ -25,14 +25,6 @@ function debug(aMsg) { //dump("-*-*- Webapps.jsm : " + aMsg + "\n"); } -let cachedSysMsgPref = null; -function supportSystemMessages() { - if (_sysMsgPref === null) { - cachedSysMsgPref = Services.prefs.getBoolPref("dom.sysmsg.enabled"); - } - return cachedSysMsgPref; -} - // Minimum delay between two progress events while downloading, in ms. const MIN_PROGRESS_EVENT_DELAY = 1000; @@ -188,21 +180,21 @@ this.DOMApplicationRegistry = { for (let id in this.webapps) { ids.push({ id: id }); } - if (supportSystemMessages()) { - this._processManifestForIds(ids, aRunUpdate); - } else { - // Read the CSPs. If MOZ_SYS_MSG is defined this is done on - // _processManifestForIds so as to not reading the manifests - // twice - this._readManifests(ids, (function readCSPs(aResults) { - aResults.forEach(function registerManifest(aResult) { - this.webapps[aResult.id].csp = aResult.manifest.csp || ""; - }, this); - }).bind(this)); +#ifdef MOZ_SYS_MSG + this._processManifestForIds(ids, aRunUpdate); +#else + // Read the CSPs. If MOZ_SYS_MSG is defined this is done on + // _processManifestForIds so as to not reading the manifests + // twice + this._readManifests(ids, (function readCSPs(aResults) { + aResults.forEach(function registerManifest(aResult) { + this.webapps[aResult.id].csp = aResult.manifest.csp || ""; + }, this); + }).bind(this)); - // Nothing else to do but notifying we're ready. - this.notifyAppsRegistryReady(); - } + // Nothing else to do but notifying we're ready. + this.notifyAppsRegistryReady(); +#endif }, updatePermissionsForApp: function updatePermissionsForApp(aId) { @@ -447,6 +439,7 @@ this.DOMApplicationRegistry = { }).bind(this)); }, +#ifdef MOZ_SYS_MSG // |aEntryPoint| is either the entry_point name or the null in which case we // use the root of the manifest. _registerSystemMessagesForEntryPoint: function(aManifest, aApp, aEntryPoint) { @@ -664,6 +657,7 @@ this.DOMApplicationRegistry = { this._registerActivitiesForApps(appsToRegister, aRunUpdate); }).bind(this)); }, +#endif observe: function(aSubject, aTopic, aData) { if (aTopic == "xpcom-shutdown") { @@ -1290,17 +1284,16 @@ this.DOMApplicationRegistry = { updateAppHandlers: function(aOldManifest, aNewManifest, aApp) { debug("updateAppHandlers: old=" + aOldManifest + " new=" + aNewManifest); this.notifyAppsRegistryStart(); - - if (supportSystemMessages()) { - if (aOldManifest) { - this._unregisterActivities(aOldManifest, aApp); - } - this._registerSystemMessages(aNewManifest, aApp); - this._registerActivities(aNewManifest, aApp, true); - } else { - // Nothing else to do but notifying we're ready. - this.notifyAppsRegistryReady(); +#ifdef MOZ_SYS_MSG + if (aOldManifest) { + this._unregisterActivities(aOldManifest, aApp); } + this._registerSystemMessages(aNewManifest, aApp); + this._registerActivities(aNewManifest, aApp, true); +#else + // Nothing else to do but notifying we're ready. + this.notifyAppsRegistryReady(); +#endif }, checkForUpdate: function(aData, aMm) { @@ -2493,11 +2486,11 @@ this.DOMApplicationRegistry = { let appNote = JSON.stringify(AppsUtils.cloneAppObject(app)); appNote.id = id; - if (supportSystemMessages()) { - this._readManifests([{ id: id }], (function unregisterManifest(aResult) { - this._unregisterActivities(aResult[0].manifest, app); - }).bind(this)); - } +#ifdef MOZ_SYS_MSG + this._readManifests([{ id: id }], (function unregisterManifest(aResult) { + this._unregisterActivities(aResult[0].manifest, app); + }).bind(this)); +#endif let dir = this._getAppDir(id); try { diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp index 91e656c3f80..4d4eaa61bab 100644 --- a/dom/base/Navigator.cpp +++ b/dom/base/Navigator.cpp @@ -225,9 +225,11 @@ Navigator::Invalidate() mCameraManager = nullptr; +#ifdef MOZ_SYS_MSG if (mMessagesManager) { mMessagesManager = nullptr; } +#endif #ifdef MOZ_AUDIO_CHANNEL_MANAGER if (mAudioChannelManager) { @@ -1409,6 +1411,7 @@ Navigator::GetMozBluetooth(nsIDOMBluetoothManager** aBluetooth) //***************************************************************************** // nsNavigator::nsIDOMNavigatorSystemMessages //***************************************************************************** +#ifdef MOZ_SYS_MSG nsresult Navigator::EnsureMessagesManager() { @@ -1436,33 +1439,34 @@ Navigator::EnsureMessagesManager() return NS_OK; } +#endif NS_IMETHODIMP Navigator::MozHasPendingMessage(const nsAString& aType, bool *aResult) { - if (!Preferences::GetBool("dom.sysmsg.enabled", false)) { - return NS_ERROR_NOT_IMPLEMENTED; - } - +#ifdef MOZ_SYS_MSG *aResult = false; nsresult rv = EnsureMessagesManager(); NS_ENSURE_SUCCESS(rv, rv); return mMessagesManager->MozHasPendingMessage(aType, aResult); +#else + return NS_ERROR_NOT_IMPLEMENTED; +#endif } NS_IMETHODIMP Navigator::MozSetMessageHandler(const nsAString& aType, nsIDOMSystemMessageCallback *aCallback) { - if (!Preferences::GetBool("dom.sysmsg.enabled", false)) { - return NS_ERROR_NOT_IMPLEMENTED; - } - +#ifdef MOZ_SYS_MSG nsresult rv = EnsureMessagesManager(); NS_ENSURE_SUCCESS(rv, rv); return mMessagesManager->MozSetMessageHandler(aType, aCallback); +#else + return NS_ERROR_NOT_IMPLEMENTED; +#endif } //***************************************************************************** diff --git a/dom/base/Navigator.h b/dom/base/Navigator.h index eede6887990..165e4024dd5 100644 --- a/dom/base/Navigator.h +++ b/dom/base/Navigator.h @@ -186,9 +186,10 @@ public: */ void OnNavigation(); +#ifdef MOZ_SYS_MSG // Helper to initialize mMessagesManager. nsresult EnsureMessagesManager(); - +#endif NS_DECL_NSIDOMNAVIGATORCAMERA private: diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index b96529515ce..87f9583ca5d 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -281,8 +281,6 @@ using mozilla::dom::workers::ResolveWorkerClasses; #include "nsIDOMMediaQueryList.h" -#include "mozilla/dom/Activity.h" - #include "nsDOMTouchEvent.h" #include "nsWrapperCacheInlines.h" @@ -1664,8 +1662,9 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMNavigatorBluetooth) #endif DOM_CLASSINFO_MAP_ENTRY(nsIDOMNavigatorCamera) - DOM_CLASSINFO_MAP_CONDITIONAL_ENTRY(nsIDOMNavigatorSystemMessages, - Activity::PrefEnabled()) +#ifdef MOZ_SYS_MSG + DOM_CLASSINFO_MAP_ENTRY(nsIDOMNavigatorSystemMessages) +#endif #ifdef MOZ_TIME_MANAGER DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozNavigatorTime) #endif diff --git a/dom/ipc/preload.js b/dom/ipc/preload.js index bb361faf8ba..f9fcf1f46c6 100644 --- a/dom/ipc/preload.js +++ b/dom/ipc/preload.js @@ -79,12 +79,6 @@ const BrowserElementIsPreloaded = true; /* Applications Specific Helper */ Cc["@mozilla.org/settingsManager;1"].getService(Ci["nsIDOMSettingsManager"]); - try { - if (Services.prefs.getBoolPref("dom.sysmsg.enabled")) { - Cc["@mozilla.org/system-message-manager;1"].getService(Ci["nsIDOMNavigatorSystemMessages"]); - } - } catch(e) { - } // This is a produc-specific file that's sometimes unavailable. try { diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 19d5631801e..5297cad9e0f 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -751,9 +751,6 @@ pref("dom.experimental_forms", false); // Don't enable yet: pref("dom.experimental_forms_range", true); -// Enables system messages and activities -pref("dom.sysmsg.enabled", false); - // Allocation Threshold for Workers pref("dom.workers.mem.gc_allocation_threshold_mb", 30); From eecc44edc5cff33dd4de011fd4115b4abf21cb9d Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Sun, 21 Apr 2013 14:56:06 +0300 Subject: [PATCH 097/155] Bug 859817 - Introduce already_AddRefed.downcast(); r=ehsan --- content/base/src/Text.cpp | 2 +- content/base/src/nsContentUtils.cpp | 2 +- docshell/base/nsDocShell.cpp | 2 +- dom/base/nsDOMWindowUtils.cpp | 2 +- dom/bindings/CallbackObject.h | 2 +- widget/gtk2/nsIdleServiceGTK.h | 7 +++---- xpcom/glue/nsCOMPtr.h | 26 ++++++++++++++++++++++++++ 7 files changed, 34 insertions(+), 9 deletions(-) diff --git a/content/base/src/Text.cpp b/content/base/src/Text.cpp index 783c29fa34c..b01842dd2c0 100644 --- a/content/base/src/Text.cpp +++ b/content/base/src/Text.cpp @@ -16,7 +16,7 @@ Text::SplitText(uint32_t aOffset, ErrorResult& rv) if (rv.Failed()) { return nullptr; } - return static_cast(newChild.forget().get()); + return newChild.forget().downcast(); } } // namespace dom diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index 6fb461cb668..1d01bd64e02 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -4233,7 +4233,7 @@ nsContentUtils::CreateContextualFragment(nsINode* aContextNode, nsCOMPtr frag; aRv = ParseFragmentXML(aFragment, document, tagStack, aPreventScriptExecution, getter_AddRefs(frag)); - return static_cast(frag.forget().get()); + return frag.forget().downcast(); } /* static */ diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index ffdc798c1f1..940aee81f8f 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -2760,7 +2760,7 @@ already_AddRefed nsDocShell::GetParentDocshell() { nsCOMPtr docshell = do_QueryInterface(GetAsSupports(mParent)); - return static_cast(docshell.forget().get()); + return docshell.forget().downcast(); } nsresult diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp index a5e7c4c2530..116b7dc87f0 100644 --- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -1293,7 +1293,7 @@ CanvasToImageSurface(nsIDOMHTMLCanvasElement* aCanvas) nsLayoutUtils::SurfaceFromElementResult result = nsLayoutUtils::SurfaceFromElement(node->AsElement(), nsLayoutUtils::SFE_WANT_IMAGE_SURFACE); - return static_cast(result.mSurface.forget().get()); + return result.mSurface.forget().downcast(); } NS_IMETHODIMP diff --git a/dom/bindings/CallbackObject.h b/dom/bindings/CallbackObject.h index c893ca9b6a1..d6b89d4e211 100644 --- a/dom/bindings/CallbackObject.h +++ b/dom/bindings/CallbackObject.h @@ -320,7 +320,7 @@ public: CallbackObjectHolderBase::ToXPCOMCallback(GetWebIDLCallback(), NS_GET_TEMPLATE_IID(XPCOMCallbackT)); // ToXPCOMCallback already did the right QI for us. - return static_cast(supp.forget().get()); + return supp.forget().downcast(); } // Try to return a WebIDLCallbackT version of this object. diff --git a/widget/gtk2/nsIdleServiceGTK.h b/widget/gtk2/nsIdleServiceGTK.h index c4d456f3ded..bd67a0ec5b9 100644 --- a/widget/gtk2/nsIdleServiceGTK.h +++ b/widget/gtk2/nsIdleServiceGTK.h @@ -31,14 +31,13 @@ public: static already_AddRefed GetInstance() { - nsIdleServiceGTK* idleService = - static_cast(nsIdleService::GetInstance().get()); + nsRefPtr idleService = + nsIdleService::GetInstance().downcast(); if (!idleService) { idleService = new nsIdleServiceGTK(); - NS_ADDREF(idleService); } - return idleService; + return idleService.forget(); } private: diff --git a/xpcom/glue/nsCOMPtr.h b/xpcom/glue/nsCOMPtr.h index 59fe0ad6791..f6a10d15aca 100644 --- a/xpcom/glue/nsCOMPtr.h +++ b/xpcom/glue/nsCOMPtr.h @@ -176,6 +176,32 @@ struct already_AddRefed return tmp; } + /** + * This helper provides a static_cast replacement for already_AddRefed, so + * if you have + * + * already_AddRefed F(); + * + * you can write + * + * already_AddRefed + * G() + * { + * return F().downcast(); + * } + * + * instead of + * + * return dont_AddRef(static_cast(F().get())); + */ + template + already_AddRefed downcast() + { + U* tmp = static_cast(mRawPtr); + mRawPtr = nullptr; + return already_AddRefed(tmp); + } + T* mRawPtr; }; From e0a4cd58481d0f04e62e3ce72493a60afa8a2936 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Mon, 22 Apr 2013 14:13:22 +0300 Subject: [PATCH 098/155] Bug 859817 - Make NS_NewAtom return already_AddRefed; r=bz --- content/base/src/nsAttrValue.cpp | 9 +++--- content/base/src/nsContentUtils.cpp | 8 +++--- .../content/src/SVGTransformListParser.cpp | 2 +- content/xslt/src/xml/txXMLUtils.cpp | 10 +++---- content/xslt/src/xpath/txExprParser.cpp | 8 +++--- .../src/xslt/txStylesheetCompileHandlers.cpp | 2 +- .../templates/src/nsXULTemplateBuilder.cpp | 2 +- editor/libeditor/html/nsHTMLCSSUtils.cpp | 2 +- intl/uconv/src/nsCharsetConverterManager.cpp | 2 +- js/xpconnect/src/XPCConvert.cpp | 10 +++---- parser/html/nsHtml5Atom.cpp | 1 + rdf/base/src/nsRDFContentSink.cpp | 2 +- xpcom/ds/nsAtomService.cpp | 4 +-- xpcom/ds/nsAtomTable.cpp | 28 ++++++++----------- xpcom/ds/nsIAtom.idl | 8 +++--- 15 files changed, 47 insertions(+), 51 deletions(-) diff --git a/content/base/src/nsAttrValue.cpp b/content/base/src/nsAttrValue.cpp index 6e113eb8c5a..dc0a2084d67 100644 --- a/content/base/src/nsAttrValue.cpp +++ b/content/base/src/nsAttrValue.cpp @@ -1229,9 +1229,9 @@ nsAttrValue::ParseAtom(const nsAString& aValue) { ResetIfSet(); - nsIAtom* atom = NS_NewAtom(aValue); + nsCOMPtr atom = NS_NewAtom(aValue); if (atom) { - SetPtrValueAndType(atom, eAtomBase); + SetPtrValueAndType(atom.forget().get(), eAtomBase); } } @@ -1712,9 +1712,10 @@ nsAttrValue::SetMiscAtomOrString(const nsAString* aValue) "Empty string?"); MiscContainer* cont = GetMiscContainer(); if (len <= NS_ATTRVALUE_MAX_STRINGLENGTH_ATOM) { - nsIAtom* atom = NS_NewAtom(*aValue); + nsCOMPtr atom = NS_NewAtom(*aValue); if (atom) { - cont->mStringBits = reinterpret_cast(atom) | eAtomBase; + cont->mStringBits = + reinterpret_cast(atom.forget().get()) | eAtomBase; } } else { nsStringBuffer* buf = GetStringBuffer(*aValue); diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index 1d01bd64e02..bbb219f250b 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -2535,11 +2535,11 @@ nsContentUtils::SplitQName(const nsIContent* aNamespaceResolver, if (*aNamespace == kNameSpaceID_Unknown) return NS_ERROR_FAILURE; - *aLocalName = NS_NewAtom(Substring(colon + 1, end)); + *aLocalName = NS_NewAtom(Substring(colon + 1, end)).get(); } else { *aNamespace = kNameSpaceID_None; - *aLocalName = NS_NewAtom(aQName); + *aLocalName = NS_NewAtom(aQName).get(); } NS_ENSURE_TRUE(aLocalName, NS_ERROR_OUT_OF_MEMORY); return NS_OK; @@ -2624,7 +2624,7 @@ nsContentUtils::SplitExpatName(const PRUnichar *aExpatName, nsIAtom **aPrefix, nameStart = (uriEnd + 1); if (nameEnd) { const PRUnichar *prefixStart = nameEnd + 1; - *aPrefix = NS_NewAtom(Substring(prefixStart, pos)); + *aPrefix = NS_NewAtom(Substring(prefixStart, pos)).get(); } else { nameEnd = pos; @@ -2637,7 +2637,7 @@ nsContentUtils::SplitExpatName(const PRUnichar *aExpatName, nsIAtom **aPrefix, nameEnd = pos; *aPrefix = nullptr; } - *aLocalName = NS_NewAtom(Substring(nameStart, nameEnd)); + *aLocalName = NS_NewAtom(Substring(nameStart, nameEnd)).get(); } // static diff --git a/content/svg/content/src/SVGTransformListParser.cpp b/content/svg/content/src/SVGTransformListParser.cpp index 145e2519dc2..4a30c45182c 100644 --- a/content/svg/content/src/SVGTransformListParser.cpp +++ b/content/svg/content/src/SVGTransformListParser.cpp @@ -85,7 +85,7 @@ SVGTransformListParser::GetTransformToken(nsIAtom** aKeyAtom, uint32_t len; if ((len = strlen(mTokenPos)) > 0) { - *aKeyAtom = NS_NewAtom(Substring(mTokenPos, mTokenPos + len)); + *aKeyAtom = NS_NewAtom(Substring(mTokenPos, mTokenPos + len)).get(); if (aAdvancePos) { mInputPos = mTokenPos + len; diff --git a/content/xslt/src/xml/txXMLUtils.cpp b/content/xslt/src/xml/txXMLUtils.cpp index bdf86d3ba09..a041fbe9761 100644 --- a/content/xslt/src/xml/txXMLUtils.cpp +++ b/content/xslt/src/xml/txXMLUtils.cpp @@ -88,7 +88,7 @@ XMLUtils::splitExpatName(const PRUnichar *aExpatName, nsIAtom **aPrefix, nameStart = (uriEnd + 1); if (nameEnd) { const PRUnichar *prefixStart = nameEnd + 1; - *aPrefix = NS_NewAtom(Substring(prefixStart, pos)); + *aPrefix = NS_NewAtom(Substring(prefixStart, pos)).get(); if (!*aPrefix) { return NS_ERROR_OUT_OF_MEMORY; } @@ -105,7 +105,7 @@ XMLUtils::splitExpatName(const PRUnichar *aExpatName, nsIAtom **aPrefix, *aPrefix = nullptr; } - *aLocalName = NS_NewAtom(Substring(nameStart, nameEnd)); + *aLocalName = NS_NewAtom(Substring(nameStart, nameEnd)).get(); return *aLocalName ? NS_OK : NS_ERROR_OUT_OF_MEMORY; } @@ -125,12 +125,12 @@ XMLUtils::splitQName(const nsAString& aName, nsIAtom** aPrefix, const PRUnichar *end; qName.EndReading(end); - *aPrefix = NS_NewAtom(Substring(qName.get(), colon)); - *aLocalName = NS_NewAtom(Substring(colon + 1, end)); + *aPrefix = NS_NewAtom(Substring(qName.get(), colon)).get(); + *aLocalName = NS_NewAtom(Substring(colon + 1, end)).get(); } else { *aPrefix = nullptr; - *aLocalName = NS_NewAtom(aName); + *aLocalName = NS_NewAtom(aName).get(); } return NS_OK; diff --git a/content/xslt/src/xpath/txExprParser.cpp b/content/xslt/src/xpath/txExprParser.cpp index 0cfb9ce61d0..80ad6e2322a 100644 --- a/content/xslt/src/xpath/txExprParser.cpp +++ b/content/xslt/src/xpath/txExprParser.cpp @@ -893,12 +893,12 @@ txExprParser::resolveQName(const nsAString& aQName, aNamespace = kNameSpaceID_None; int32_t idx = aQName.FindChar(':'); if (idx > 0) { - *aPrefix = NS_NewAtom(StringHead(aQName, (uint32_t)idx)); + *aPrefix = NS_NewAtom(StringHead(aQName, (uint32_t)idx)).get(); if (!*aPrefix) { return NS_ERROR_OUT_OF_MEMORY; } *aLocalName = NS_NewAtom(Substring(aQName, (uint32_t)idx + 1, - aQName.Length() - (idx + 1))); + aQName.Length() - (idx + 1))).get(); if (!*aLocalName) { NS_RELEASE(*aPrefix); return NS_ERROR_OUT_OF_MEMORY; @@ -910,10 +910,10 @@ txExprParser::resolveQName(const nsAString& aQName, if (aIsNameTest && aContext->caseInsensitiveNameTests()) { nsAutoString lcname; nsContentUtils::ASCIIToLower(aQName, lcname); - *aLocalName = NS_NewAtom(lcname); + *aLocalName = NS_NewAtom(lcname).get(); } else { - *aLocalName = NS_NewAtom(aQName); + *aLocalName = NS_NewAtom(aQName).get(); } if (!*aLocalName) { return NS_ERROR_OUT_OF_MEMORY; diff --git a/content/xslt/src/xslt/txStylesheetCompileHandlers.cpp b/content/xslt/src/xslt/txStylesheetCompileHandlers.cpp index 9a6e634a19c..515e0d91353 100644 --- a/content/xslt/src/xslt/txStylesheetCompileHandlers.cpp +++ b/content/xslt/src/xslt/txStylesheetCompileHandlers.cpp @@ -304,7 +304,7 @@ getAtomAttr(txStylesheetAttr* aAttributes, return rv; } - *aAtom = NS_NewAtom(attr->mValue); + *aAtom = NS_NewAtom(attr->mValue).get(); NS_ENSURE_TRUE(*aAtom, NS_ERROR_OUT_OF_MEMORY); return NS_OK; diff --git a/content/xul/templates/src/nsXULTemplateBuilder.cpp b/content/xul/templates/src/nsXULTemplateBuilder.cpp index a397e73e60e..1b684111be5 100644 --- a/content/xul/templates/src/nsXULTemplateBuilder.cpp +++ b/content/xul/templates/src/nsXULTemplateBuilder.cpp @@ -2138,7 +2138,7 @@ nsXULTemplateBuilder::DetermineRDFQueryRef(nsIContent* aQueryElement, nsIAtom** content->GetAttr(kNameSpaceID_None, nsGkAtoms::tag, tag); if (!tag.IsEmpty()) - *aTag = NS_NewAtom(tag); + *aTag = NS_NewAtom(tag).get(); } } diff --git a/editor/libeditor/html/nsHTMLCSSUtils.cpp b/editor/libeditor/html/nsHTMLCSSUtils.cpp index e06458c8a9e..4f5144b0cb3 100644 --- a/editor/libeditor/html/nsHTMLCSSUtils.cpp +++ b/editor/libeditor/html/nsHTMLCSSUtils.cpp @@ -706,7 +706,7 @@ nsHTMLCSSUtils::ParseLength(const nsAString & aString, float * aValue, nsIAtom * i++; } *aValue = value * sign; - *aUnit = NS_NewAtom(StringTail(aString, j-i)); + *aUnit = NS_NewAtom(StringTail(aString, j-i)).get(); } void diff --git a/intl/uconv/src/nsCharsetConverterManager.cpp b/intl/uconv/src/nsCharsetConverterManager.cpp index 022d6fb908e..f0e2b59f620 100644 --- a/intl/uconv/src/nsCharsetConverterManager.cpp +++ b/intl/uconv/src/nsCharsetConverterManager.cpp @@ -354,7 +354,7 @@ nsCharsetConverterManager::GetCharsetLangGroupRaw(const char * aCharset, if (NS_SUCCEEDED(rv)) { ToLowerCase(langGroup); // use lowercase for all language atoms - *aResult = NS_NewAtom(langGroup); + *aResult = NS_NewAtom(langGroup).get(); } return rv; diff --git a/js/xpconnect/src/XPCConvert.cpp b/js/xpconnect/src/XPCConvert.cpp index 4f0412d7579..a9ad8cce9d5 100644 --- a/js/xpconnect/src/XPCConvert.cpp +++ b/js/xpconnect/src/XPCConvert.cpp @@ -734,12 +734,10 @@ XPCConvert::JSData2Native(JSContext* cx, void* d, HandleValue s, return false; } uint32_t length = JS_GetStringLength(str); - nsIAtom* atom = NS_NewAtom(nsDependentSubstring(chars, - chars + length)); - if (!atom && pErr) - *pErr = NS_ERROR_OUT_OF_MEMORY; - *((nsISupports**)d) = atom; - return atom != nullptr; + nsCOMPtr atom = + NS_NewAtom(nsDependentSubstring(chars, chars + length)); + atom.forget((nsISupports**)d); + return true; } //else ... diff --git a/parser/html/nsHtml5Atom.cpp b/parser/html/nsHtml5Atom.cpp index bb3e0bb4f71..d68f7a866a4 100644 --- a/parser/html/nsHtml5Atom.cpp +++ b/parser/html/nsHtml5Atom.cpp @@ -3,6 +3,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsHtml5Atom.h" +#include "nsAutoPtr.h" nsHtml5Atom::nsHtml5Atom(const nsAString& aString) { diff --git a/rdf/base/src/nsRDFContentSink.cpp b/rdf/base/src/nsRDFContentSink.cpp index 1a4e02822d7..a984c998a04 100644 --- a/rdf/base/src/nsRDFContentSink.cpp +++ b/rdf/base/src/nsRDFContentSink.cpp @@ -1347,7 +1347,7 @@ RDFContentSinkImpl::SplitExpatName(const PRUnichar *aExpatName, } const nsDependentSubstring& nameSpaceURI = Substring(aExpatName, uriEnd); - *aLocalName = NS_NewAtom(Substring(nameStart, pos)); + *aLocalName = NS_NewAtom(Substring(nameStart, pos)).get(); return nameSpaceURI; } diff --git a/xpcom/ds/nsAtomService.cpp b/xpcom/ds/nsAtomService.cpp index d987119efa0..4c7d26162a7 100644 --- a/xpcom/ds/nsAtomService.cpp +++ b/xpcom/ds/nsAtomService.cpp @@ -14,7 +14,7 @@ nsAtomService::nsAtomService() nsresult nsAtomService::GetAtom(const nsAString& aString, nsIAtom ** aResult) { - *aResult = NS_NewAtom(aString); + *aResult = NS_NewAtom(aString).get(); if (!*aResult) return NS_ERROR_OUT_OF_MEMORY; @@ -36,7 +36,7 @@ nsAtomService::GetPermanentAtom(const nsAString& aString, nsIAtom ** aResult) NS_IMETHODIMP nsAtomService::GetAtomUTF8(const char *aValue, nsIAtom* *aResult) { - *aResult = NS_NewAtom(aValue); + *aResult = NS_NewAtom(aValue).get(); if (!*aResult) return NS_ERROR_OUT_OF_MEMORY; diff --git a/xpcom/ds/nsAtomTable.cpp b/xpcom/ds/nsAtomTable.cpp index 8196b991f07..4120dd27570 100644 --- a/xpcom/ds/nsAtomTable.cpp +++ b/xpcom/ds/nsAtomTable.cpp @@ -616,23 +616,22 @@ RegisterStaticAtoms(const nsStaticAtom* aAtoms, uint32_t aAtomCount) return NS_OK; } -nsIAtom* +already_AddRefed NS_NewAtom(const char* aUTF8String) { return NS_NewAtom(nsDependentCString(aUTF8String)); } -nsIAtom* +already_AddRefed NS_NewAtom(const nsACString& aUTF8String) { AtomTableEntry *he = GetAtomHashEntry(aUTF8String.Data(), aUTF8String.Length()); if (he->mAtom) { - nsIAtom* atom; - NS_ADDREF(atom = he->mAtom); + nsCOMPtr atom = he->mAtom; - return atom; + return atom.forget(); } // This results in an extra addref/release of the nsStringBuffer. @@ -640,38 +639,35 @@ NS_NewAtom(const nsACString& aUTF8String) // Actually, now there is, sort of: ForgetSharedBuffer. nsString str; CopyUTF8toUTF16(aUTF8String, str); - AtomImpl* atom = new AtomImpl(str, he->keyHash); + nsRefPtr atom = new AtomImpl(str, he->keyHash); he->mAtom = atom; - NS_ADDREF(atom); - return atom; + return atom.forget(); } -nsIAtom* +already_AddRefed NS_NewAtom(const PRUnichar* aUTF16String) { return NS_NewAtom(nsDependentString(aUTF16String)); } -nsIAtom* +already_AddRefed NS_NewAtom(const nsAString& aUTF16String) { AtomTableEntry *he = GetAtomHashEntry(aUTF16String.Data(), aUTF16String.Length()); if (he->mAtom) { - nsIAtom* atom; - NS_ADDREF(atom = he->mAtom); + nsCOMPtr atom = he->mAtom; - return atom; + return atom.forget(); } - AtomImpl* atom = new AtomImpl(aUTF16String, he->keyHash); + nsRefPtr atom = new AtomImpl(aUTF16String, he->keyHash); he->mAtom = atom; - NS_ADDREF(atom); - return atom; + return atom.forget(); } nsIAtom* diff --git a/xpcom/ds/nsIAtom.idl b/xpcom/ds/nsIAtom.idl index 3289f337653..e776122ca65 100644 --- a/xpcom/ds/nsIAtom.idl +++ b/xpcom/ds/nsIAtom.idl @@ -99,7 +99,7 @@ protected: * Find an atom that matches the given UTF-8 string. * The string is assumed to be zero terminated. Never returns null. */ -extern nsIAtom* NS_NewAtom(const char* aUTF8String); +extern already_AddRefed NS_NewAtom(const char* aUTF8String); inline already_AddRefed do_GetAtom(const char* aUTF8String) { return NS_NewAtom(aUTF8String); } @@ -107,7 +107,7 @@ inline already_AddRefed do_GetAtom(const char* aUTF8String) /** * Find an atom that matches the given UTF-8 string. Never returns null. */ -extern nsIAtom* NS_NewAtom(const nsACString& aUTF8String); +extern already_AddRefed NS_NewAtom(const nsACString& aUTF8String); inline already_AddRefed do_GetAtom(const nsACString& aUTF8String) { return NS_NewAtom(aUTF8String); } @@ -115,14 +115,14 @@ inline already_AddRefed do_GetAtom(const nsACString& aUTF8String) * Find an atom that matches the given UTF-16 string. * The string is assumed to be zero terminated. Never returns null. */ -extern nsIAtom* NS_NewAtom(const PRUnichar* aUTF16String); +extern already_AddRefed NS_NewAtom(const PRUnichar* aUTF16String); inline already_AddRefed do_GetAtom(const PRUnichar* aUTF16String) { return NS_NewAtom(aUTF16String); } /** * Find an atom that matches the given UTF-16 string. Never returns null. */ -extern nsIAtom* NS_NewAtom(const nsAString& aUTF16String); +extern already_AddRefed NS_NewAtom(const nsAString& aUTF16String); extern nsIAtom* NS_NewPermanentAtom(const nsAString& aUTF16String); inline already_AddRefed do_GetAtom(const nsAString& aUTF16String) { return NS_NewAtom(aUTF16String); } From 659b807986fea4898a78e7c61e06e988d7d14bc0 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Mon, 22 Apr 2013 14:15:59 +0300 Subject: [PATCH 099/155] Bug 859817 - Remove implicit conversions from raw pointer to already_AddRefed; r=Ms2ger --- .../src/base/nsAccessibilityService.cpp | 110 +++++++++--------- accessible/src/base/nsCoreUtils.cpp | 6 +- accessible/src/generic/Accessible.cpp | 4 +- accessible/src/generic/Accessible.h | 6 +- accessible/src/xul/XULElementAccessibles.cpp | 6 +- .../src/xul/XULFormControlAccessible.cpp | 7 +- .../src/xul/XULSelectControlAccessible.cpp | 4 +- accessible/src/xul/XULTreeAccessible.cpp | 4 +- chrome/src/nsChromeRegistry.cpp | 8 +- content/base/public/nsIDocument.h | 14 +-- content/base/src/Attr.cpp | 10 +- content/base/src/Element.cpp | 8 +- content/base/src/FragmentOrElement.cpp | 4 +- content/base/src/nsAttrAndChildArray.cpp | 2 +- content/base/src/nsAttrValue.cpp | 5 +- content/base/src/nsContentAreaDragDrop.cpp | 4 +- content/base/src/nsContentList.cpp | 12 +- content/base/src/nsContentUtils.cpp | 14 +-- content/base/src/nsDocument.cpp | 8 +- content/base/src/nsNodeInfoManager.cpp | 11 +- content/base/src/nsObjectLoadingContent.cpp | 5 +- content/base/src/nsRange.cpp | 19 ++- .../canvas/src/CanvasRenderingContext2D.cpp | 4 +- content/canvas/src/WebGLContext.cpp | 6 +- content/canvas/src/WebGLContextGL.cpp | 10 +- content/events/src/nsDOMTextEvent.cpp | 4 +- content/events/src/nsDOMUIEvent.cpp | 2 +- content/events/src/nsEventStateManager.cpp | 8 +- content/events/src/nsPrivateTextRange.cpp | 7 +- .../html/content/src/HTMLAnchorElement.cpp | 5 +- .../html/content/src/nsHTMLFormElement.cpp | 6 +- .../html/document/src/nsHTMLContentSink.cpp | 5 +- content/html/document/src/nsHTMLDocument.cpp | 24 ++-- .../synth/SpeechSynthesisUtterance.cpp | 6 +- .../webspeech/synth/nsSynthVoiceRegistry.cpp | 7 +- content/svg/content/src/SVGTests.cpp | 6 +- .../content/src/SVGTransformableElement.cpp | 2 +- content/xbl/src/nsXBLPrototypeBinding.cpp | 5 +- content/xbl/src/nsXBLPrototypeHandler.cpp | 16 +-- .../src/xpath/txMozillaXPathTreeWalker.cpp | 11 +- content/xul/content/src/nsXULElement.cpp | 11 +- .../xul/content/src/nsXULPopupListener.cpp | 4 +- content/xul/document/src/XULDocument.cpp | 10 +- dom/base/nsGlobalWindow.cpp | 14 +-- dom/base/nsJSEnvironment.cpp | 8 +- dom/plugins/base/nsNPAPIPluginInstance.cpp | 5 +- dom/plugins/base/nsPluginHost.cpp | 4 +- .../src/nsComposerCommandsUpdater.cpp | 4 +- editor/txmgr/src/nsTransactionStack.cpp | 13 +-- .../windowwatcher/src/nsWindowWatcher.cpp | 10 +- gfx/layers/ImageContainer.cpp | 2 +- gfx/layers/opengl/ImageLayerOGL.cpp | 7 +- gfx/thebes/gfxASurface.cpp | 8 +- gfx/thebes/gfxContext.cpp | 20 ++-- gfx/thebes/gfxFont.cpp | 38 +++--- gfx/thebes/gfxImageSurface.cpp | 2 +- gfx/thebes/gfxPlatform.cpp | 4 +- image/src/imgLoader.cpp | 4 +- image/src/imgLoader.h | 5 +- intl/locale/src/nsLanguageAtomService.cpp | 6 +- js/jsd/jsd_xpc.cpp | 4 +- layout/base/nsCSSFrameConstructor.cpp | 6 +- layout/base/nsPresContext.cpp | 7 +- layout/base/nsPresShell.cpp | 34 +++--- layout/forms/nsListControlFrame.cpp | 19 ++- layout/generic/nsFrame.cpp | 5 +- layout/generic/nsTextFrameThebes.cpp | 5 +- layout/printing/nsPrintEngine.cpp | 8 +- layout/style/StyleRule.cpp | 9 +- layout/style/nsCSSStyleSheet.cpp | 13 +-- layout/style/nsComputedDOMStyle.cpp | 4 +- layout/style/nsHTMLStyleSheet.cpp | 4 +- layout/style/nsRuleNode.cpp | 6 +- layout/style/nsStyleContext.cpp | 12 +- layout/style/nsStyleSet.cpp | 4 +- layout/svg/nsSVGFilterInstance.cpp | 4 +- layout/svg/nsSVGGradientFrame.cpp | 10 +- layout/svg/nsSVGMaskFrame.cpp | 5 +- .../src/nsLayoutDebuggingTools.cpp | 11 +- layout/xul/base/src/nsListBoxLayout.cpp | 5 +- layout/xul/base/src/nsSliderFrame.cpp | 5 +- layout/xul/grid/nsGridRowGroupLayout.cpp | 5 +- layout/xul/grid/nsGridRowLeafLayout.cpp | 5 +- layout/xul/tree/nsTreeBodyFrame.h | 5 +- .../webrtc/signaling/test/FakeMediaStreams.h | 5 +- netwerk/base/public/nsNetUtil.h | 25 ++-- .../base/src/nsSocketTransportService2.cpp | 5 +- parser/html/nsHtml5Module.cpp | 5 +- rdf/base/src/nsRDFXMLSerializer.cpp | 4 +- .../boot/src/nsSecureBrowserUIImpl.cpp | 8 +- security/manager/ssl/src/nsCertTree.cpp | 9 +- .../places/tests/cpp/places_test_harness.h | 6 +- toolkit/components/telemetry/Telemetry.cpp | 4 +- .../typeaheadfind/nsTypeAheadFind.cpp | 7 +- toolkit/system/dbus/nsDBusService.cpp | 5 +- toolkit/xre/nsAppRunner.cpp | 11 +- uriloader/base/nsDocLoader.cpp | 9 +- uriloader/exthandler/unix/nsGNOMERegistry.cpp | 4 +- .../exthandler/unix/nsOSHelperAppService.cpp | 38 +++--- widget/gtk2/nsWindow.cpp | 5 +- xpcom/base/nsAutoPtr.h | 2 +- xpcom/build/Services.cpp | 4 +- xpcom/build/nsXPComInit.cpp | 8 +- xpcom/components/nsComponentManager.cpp | 5 +- xpcom/glue/nsCOMPtr.h | 6 +- xpcom/glue/nsIWeakReferenceUtils.h | 2 +- xpcom/tests/TestRacingServiceManager.cpp | 4 +- 107 files changed, 399 insertions(+), 561 deletions(-) diff --git a/accessible/src/base/nsAccessibilityService.cpp b/accessible/src/base/nsAccessibilityService.cpp index 00253b51aa5..5af04262cce 100644 --- a/accessible/src/base/nsAccessibilityService.cpp +++ b/accessible/src/base/nsAccessibilityService.cpp @@ -303,11 +303,10 @@ nsAccessibilityService::CreatePluginAccessible(nsObjectFrame* aFrame, nsresult rv = pluginInstance->GetValueFromPlugin( NPPVpluginNativeAccessibleAtkPlugId, &plugId); if (NS_SUCCEEDED(rv) && !plugId.IsEmpty()) { - AtkSocketAccessible* socketAccessible = + nsRefPtr socketAccessible = new AtkSocketAccessible(aContent, aContext->Document(), plugId); - NS_ADDREF(socketAccessible); - return socketAccessible; + return socketAccessible.forget(); } #endif } @@ -1132,12 +1131,11 @@ nsAccessibilityService::CreateAccessibleByType(nsIContent* aContent, return nullptr; if (type == nsIAccessibleProvider::OuterDoc) { - Accessible* accessible = new OuterDocAccessible(aContent, aDoc); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = new OuterDocAccessible(aContent, aDoc); + return accessible.forget(); } - Accessible* accessible = nullptr; + nsRefPtr accessible; switch (type) { #ifdef MOZ_XUL @@ -1322,8 +1320,7 @@ nsAccessibilityService::CreateAccessibleByType(nsIContent* aContent, return nullptr; } - NS_IF_ADDREF(accessible); - return accessible; + return accessible.forget(); } already_AddRefed @@ -1335,10 +1332,9 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame, if (aContext->IsTableRow()) { if (nsCoreUtils::IsHTMLTableHeader(aContent) && aContext->GetContent() == aContent->GetParent()) { - Accessible* accessible = new HTMLTableHeaderCellAccessibleWrap(aContent, - document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLTableHeaderCellAccessibleWrap(aContent, document); + return accessible.forget(); } return nullptr; @@ -1347,41 +1343,40 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame, // This method assumes we're in an HTML namespace. nsIAtom* tag = aContent->Tag(); if (tag == nsGkAtoms::figcaption) { - Accessible* accessible = new HTMLFigcaptionAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLFigcaptionAccessible(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::figure) { - Accessible* accessible = new HTMLFigureAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLFigureAccessible(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::legend) { - Accessible* accessible = new HTMLLegendAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLLegendAccessible(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::option) { - Accessible* accessible = new HTMLSelectOptionAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLSelectOptionAccessible(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::optgroup) { - Accessible* accessible = + nsRefPtr accessible = new HTMLSelectOptGroupAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + return accessible.forget(); } if (tag == nsGkAtoms::ul || tag == nsGkAtoms::ol || tag == nsGkAtoms::dl) { - Accessible* accessible = new HTMLListAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLListAccessible(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::a) { @@ -1390,14 +1385,14 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame, nsRoleMapEntry* roleMapEntry = aria::GetRoleMap(aContent); if (roleMapEntry && roleMapEntry->role != roles::NOTHING && roleMapEntry->role != roles::LINK) { - Accessible* accessible = new HyperTextAccessibleWrap(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HyperTextAccessibleWrap(aContent, document); + return accessible.forget(); } - Accessible* accessible = new HTMLLinkAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLLinkAccessible(aContent, document); + return accessible.forget(); } if (aContext->IsList()) { @@ -1406,15 +1401,15 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame, // accessible for other elements styled as list items. if (aContext->GetContent() == aContent->GetParent()) { if (tag == nsGkAtoms::dt || tag == nsGkAtoms::li) { - Accessible* accessible = new HTMLLIAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLLIAccessible(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::dd) { - Accessible* accessible = new HyperTextAccessibleWrap(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HyperTextAccessibleWrap(aContent, document); + return accessible.forget(); } } @@ -1432,22 +1427,21 @@ nsAccessibilityService::CreateHTMLAccessibleByMarkup(nsIFrame* aFrame, tag == nsGkAtoms::h5 || tag == nsGkAtoms::h6 || tag == nsGkAtoms::q) { - Accessible* accessible = new HyperTextAccessibleWrap(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HyperTextAccessibleWrap(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::output) { - Accessible* accessible = new HTMLOutputAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new HTMLOutputAccessible(aContent, document); + return accessible.forget(); } if (tag == nsGkAtoms::progress) { - Accessible* accessible = + nsRefPtr accessible = new HTMLProgressMeterAccessible(aContent, document); - NS_ADDREF(accessible); - return accessible; + return accessible.forget(); } return nullptr; @@ -1663,15 +1657,15 @@ nsAccessibilityService::CreateAccessibleForXULTree(nsIContent* aContent, // Outline of list accessible. if (count == 1) { - Accessible* accessible = new XULTreeAccessible(aContent, aDoc, treeFrame); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new XULTreeAccessible(aContent, aDoc, treeFrame); + return accessible.forget(); } // Table or tree table accessible. - Accessible* accessible = new XULTreeGridAccessibleWrap(aContent, aDoc, treeFrame); - NS_ADDREF(accessible); - return accessible; + nsRefPtr accessible = + new XULTreeGridAccessibleWrap(aContent, aDoc, treeFrame); + return accessible.forget(); } #endif diff --git a/accessible/src/base/nsCoreUtils.cpp b/accessible/src/base/nsCoreUtils.cpp index f3584158c0b..2baaf14c2d9 100644 --- a/accessible/src/base/nsCoreUtils.cpp +++ b/accessible/src/base/nsCoreUtils.cpp @@ -517,9 +517,9 @@ nsCoreUtils::GetTreeBodyBoxObject(nsITreeBoxObject *aTreeBoxObj) if (!tcXULElm) return nullptr; - nsIBoxObject *boxObj = nullptr; - tcXULElm->GetBoxObject(&boxObj); - return boxObj; + nsCOMPtr boxObj; + tcXULElm->GetBoxObject(getter_AddRefs(boxObj)); + return boxObj.forget(); } already_AddRefed diff --git a/accessible/src/generic/Accessible.cpp b/accessible/src/generic/Accessible.cpp index 555d30de43b..41f6bfcf444 100644 --- a/accessible/src/generic/Accessible.cpp +++ b/accessible/src/generic/Accessible.cpp @@ -2847,9 +2847,7 @@ Accessible::SelectedItems() while ((selected = iter.Next())) selectedItems->AppendElement(selected, false); - nsIMutableArray* items = nullptr; - selectedItems.forget(&items); - return items; + return selectedItems.forget(); } uint32_t diff --git a/accessible/src/generic/Accessible.h b/accessible/src/generic/Accessible.h index 0eb3445909c..13212d64e5b 100644 --- a/accessible/src/generic/Accessible.h +++ b/accessible/src/generic/Accessible.h @@ -150,10 +150,8 @@ public: */ inline already_AddRefed DOMNode() const { - nsIDOMNode *DOMNode = nullptr; - if (GetNode()) - CallQueryInterface(GetNode(), &DOMNode); - return DOMNode; + nsCOMPtr DOMNode = do_QueryInterface(GetNode()); + return DOMNode.forget(); } /** diff --git a/accessible/src/xul/XULElementAccessibles.cpp b/accessible/src/xul/XULElementAccessibles.cpp index 289fda2dfb1..d3f98d9f13b 100644 --- a/accessible/src/xul/XULElementAccessibles.cpp +++ b/accessible/src/xul/XULElementAccessibles.cpp @@ -300,10 +300,10 @@ XULLinkAccessible::AnchorURIAt(uint32_t aAnchorIndex) nsCOMPtr baseURI = mContent->GetBaseURI(); nsIDocument* document = mContent->OwnerDoc(); - nsIURI* anchorURI = nullptr; - NS_NewURI(&anchorURI, href, + nsCOMPtr anchorURI; + NS_NewURI(getter_AddRefs(anchorURI), href, document->GetDocumentCharacterSet().get(), baseURI); - return anchorURI; + return anchorURI.forget(); } diff --git a/accessible/src/xul/XULFormControlAccessible.cpp b/accessible/src/xul/XULFormControlAccessible.cpp index b58d067a554..140250a64bd 100644 --- a/accessible/src/xul/XULFormControlAccessible.cpp +++ b/accessible/src/xul/XULFormControlAccessible.cpp @@ -864,9 +864,6 @@ XULTextFieldAccessible::GetInputField() const NS_ASSERTION(inputFieldDOMNode, "No input field for XULTextFieldAccessible"); - nsIContent* inputField = nullptr; - if (inputFieldDOMNode) - CallQueryInterface(inputFieldDOMNode, &inputField); - - return inputField; + nsCOMPtr inputField = do_QueryInterface(inputFieldDOMNode); + return inputField.forget(); } diff --git a/accessible/src/xul/XULSelectControlAccessible.cpp b/accessible/src/xul/XULSelectControlAccessible.cpp index 4a3e3c3bf44..5ccbb7de1e2 100644 --- a/accessible/src/xul/XULSelectControlAccessible.cpp +++ b/accessible/src/xul/XULSelectControlAccessible.cpp @@ -83,9 +83,7 @@ XULSelectControlAccessible::SelectedItems() } } - nsIMutableArray* items = nullptr; - selectedItems.forget(&items); - return items; + return selectedItems.forget(); } Accessible* diff --git a/accessible/src/xul/XULTreeAccessible.cpp b/accessible/src/xul/XULTreeAccessible.cpp index 2291a67106c..5d686c90aea 100644 --- a/accessible/src/xul/XULTreeAccessible.cpp +++ b/accessible/src/xul/XULTreeAccessible.cpp @@ -275,9 +275,7 @@ XULTreeAccessible::SelectedItems() } } - nsIMutableArray* items = nullptr; - selectedItems.forget(&items); - return items; + return selectedItems.forget(); } uint32_t diff --git a/chrome/src/nsChromeRegistry.cpp b/chrome/src/nsChromeRegistry.cpp index b1d3a7af88b..9f42314ceb5 100644 --- a/chrome/src/nsChromeRegistry.cpp +++ b/chrome/src/nsChromeRegistry.cpp @@ -133,8 +133,8 @@ nsChromeRegistry::GetService() if (!gChromeRegistry) return nullptr; } - NS_ADDREF(gChromeRegistry); - return gChromeRegistry; + nsCOMPtr registry = gChromeRegistry; + return registry.forget(); } nsresult @@ -632,8 +632,8 @@ already_AddRefed nsChromeRegistry::GetSingleton() { if (gChromeRegistry) { - NS_ADDREF(gChromeRegistry); - return gChromeRegistry; + nsRefPtr registry = gChromeRegistry; + return registry.forget(); } nsRefPtr cr; diff --git a/content/base/public/nsIDocument.h b/content/base/public/nsIDocument.h index 59309126377..c912db5e863 100644 --- a/content/base/public/nsIDocument.h +++ b/content/base/public/nsIDocument.h @@ -247,11 +247,8 @@ public: */ already_AddRefed GetDocumentLoadGroup() const { - nsILoadGroup *group = nullptr; - if (mDocumentLoadGroup) - CallQueryReferent(mDocumentLoadGroup.get(), &group); - - return group; + nsCOMPtr group = do_QueryReferent(mDocumentLoadGroup); + return group.forget(); } /** @@ -1080,11 +1077,8 @@ public: */ already_AddRefed GetContainer() const { - nsISupports* container = nullptr; - if (mDocumentContainer) - CallQueryReferent(mDocumentContainer.get(), &container); - - return container; + nsCOMPtr container = do_QueryReferent(mDocumentContainer); + return container.forget(); } /** diff --git a/content/base/src/Attr.cpp b/content/base/src/Attr.cpp index ba258af71fd..35fcbc031c5 100644 --- a/content/base/src/Attr.cpp +++ b/content/base/src/Attr.cpp @@ -133,7 +133,6 @@ Attr::GetName(nsAString& aName) already_AddRefed Attr::GetNameAtom(nsIContent* aContent) { - nsIAtom* result = nullptr; if (!mNsAware && mNodeInfo->NamespaceID() == kNameSpaceID_None && aContent->IsInHTMLDocument() && @@ -142,13 +141,10 @@ Attr::GetNameAtom(nsIContent* aContent) mNodeInfo->GetName(name); nsAutoString lowercaseName; nsContentUtils::ASCIIToLower(name, lowercaseName); - nsCOMPtr nameAtom = do_GetAtom(lowercaseName); - nameAtom.swap(result); - } else { - nsCOMPtr nameAtom = mNodeInfo->NameAtom(); - nameAtom.swap(result); + return do_GetAtom(lowercaseName); } - return result; + nsCOMPtr nameAtom = mNodeInfo->NameAtom(); + return nameAtom.forget(); } NS_IMETHODIMP diff --git a/content/base/src/Element.cpp b/content/base/src/Element.cpp index 1df4eff42bc..75b13d4f5bb 100644 --- a/content/base/src/Element.cpp +++ b/content/base/src/Element.cpp @@ -1443,17 +1443,17 @@ Element::GetExistingAttrNameFromQName(const nsAString& aStr) const return nullptr; } - nsINodeInfo* nodeInfo; + nsCOMPtr nodeInfo; if (name->IsAtom()) { nodeInfo = mNodeInfo->NodeInfoManager()-> GetNodeInfo(name->Atom(), nullptr, kNameSpaceID_None, - nsIDOMNode::ATTRIBUTE_NODE).get(); + nsIDOMNode::ATTRIBUTE_NODE); } else { - NS_ADDREF(nodeInfo = name->NodeInfo()); + nodeInfo = name->NodeInfo(); } - return nodeInfo; + return nodeInfo.forget(); } // static diff --git a/content/base/src/FragmentOrElement.cpp b/content/base/src/FragmentOrElement.cpp index 787987b2b41..853f9c1fe82 100644 --- a/content/base/src/FragmentOrElement.cpp +++ b/content/base/src/FragmentOrElement.cpp @@ -691,9 +691,7 @@ FragmentOrElement::GetChildren(uint32_t aFilter) } } - nsINodeList* returnList = nullptr; - list.forget(&returnList); - return returnList; + return list.forget(); } static nsIContent* diff --git a/content/base/src/nsAttrAndChildArray.cpp b/content/base/src/nsAttrAndChildArray.cpp index 3af0ca1fd4f..e986c8b540d 100644 --- a/content/base/src/nsAttrAndChildArray.cpp +++ b/content/base/src/nsAttrAndChildArray.cpp @@ -209,7 +209,7 @@ nsAttrAndChildArray::TakeChildAt(uint32_t aPos) memmove(pos, pos + 1, (childCount - aPos - 1) * sizeof(nsIContent*)); SetChildCount(childCount - 1); - return child; + return dont_AddRef(child); } int32_t diff --git a/content/base/src/nsAttrValue.cpp b/content/base/src/nsAttrValue.cpp index dc0a2084d67..42a01783e06 100644 --- a/content/base/src/nsAttrValue.cpp +++ b/content/base/src/nsAttrValue.cpp @@ -739,9 +739,8 @@ nsAttrValue::GetAsAtom() const case eAtom: { - nsIAtom* atom = GetAtomValue(); - NS_ADDREF(atom); - return atom; + nsCOMPtr atom = GetAtomValue(); + return atom.forget(); } default: diff --git a/content/base/src/nsContentAreaDragDrop.cpp b/content/base/src/nsContentAreaDragDrop.cpp index 88f4924931b..86763a14a9a 100644 --- a/content/base/src/nsContentAreaDragDrop.cpp +++ b/content/base/src/nsContentAreaDragDrop.cpp @@ -274,8 +274,8 @@ DragDataProducer::FindParentLinkNode(nsIContent* inNode) for (; content; content = content->GetParent()) { if (nsContentUtils::IsDraggableLink(content)) { - NS_ADDREF(content); - return content; + nsCOMPtr ret = content; + return ret.forget(); } } diff --git a/content/base/src/nsContentList.cpp b/content/base/src/nsContentList.cpp index 2bfb4c82187..8b2123517fa 100644 --- a/content/base/src/nsContentList.cpp +++ b/content/base/src/nsContentList.cpp @@ -196,7 +196,7 @@ NS_GetContentList(nsINode* aRootNode, { NS_ASSERTION(aRootNode, "content list has to have a root"); - nsContentList* list = nullptr; + nsRefPtr list; static PLDHashTableOps hash_table_ops = { @@ -255,9 +255,7 @@ NS_GetContentList(nsINode* aRootNode, } } - NS_ADDREF(list); - - return list; + return list.forget(); } #ifdef DEBUG @@ -319,7 +317,7 @@ GetFuncStringContentList(nsINode* aRootNode, { NS_ASSERTION(aRootNode, "content list has to have a root"); - nsCacheableFuncStringContentList* list = nullptr; + nsRefPtr list; static PLDHashTableOps hash_table_ops = { @@ -373,11 +371,9 @@ GetFuncStringContentList(nsINode* aRootNode, } } - NS_ADDREF(list); - // Don't cache these lists globally - return list; + return list.forget(); } already_AddRefed diff --git a/content/base/src/nsContentUtils.cpp b/content/base/src/nsContentUtils.cpp index bbb219f250b..f0a632d9f1d 100644 --- a/content/base/src/nsContentUtils.cpp +++ b/content/base/src/nsContentUtils.cpp @@ -5261,12 +5261,12 @@ nsContentUtils::HidePopupsInDocument(nsIDocument* aDocument) already_AddRefed nsContentUtils::GetDragSession() { - nsIDragSession* dragSession = nullptr; + nsCOMPtr dragSession; nsCOMPtr dragService = do_GetService("@mozilla.org/widget/dragservice;1"); if (dragService) - dragService->GetCurrentSession(&dragSession); - return dragSession; + dragService->GetCurrentSession(getter_AddRefs(dragSession)); + return dragSession.forget(); } /* static */ @@ -5836,15 +5836,13 @@ nsContentUtils::GetDocumentFromScriptContext(nsIScriptContext *aScriptContext) nsCOMPtr window = do_QueryInterface(aScriptContext->GetGlobalObject()); - nsIDocument *doc = nullptr; + nsCOMPtr doc; if (window) { nsCOMPtr domdoc; window->GetDocument(getter_AddRefs(domdoc)); - if (domdoc) { - CallQueryInterface(domdoc, &doc); - } + doc = do_QueryInterface(domdoc); } - return doc; + return doc.forget(); } /* static */ diff --git a/content/base/src/nsDocument.cpp b/content/base/src/nsDocument.cpp index d9fc826ad79..05b4b0cef23 100644 --- a/content/base/src/nsDocument.cpp +++ b/content/base/src/nsDocument.cpp @@ -7664,17 +7664,17 @@ nsDocument::RemovedFromDocShell() already_AddRefed nsDocument::GetLayoutHistoryState() const { - nsILayoutHistoryState* state = nullptr; + nsCOMPtr state; if (!mScriptGlobalObject) { - NS_IF_ADDREF(state = mLayoutHistoryState); + state = mLayoutHistoryState; } else { nsCOMPtr docShell(do_QueryReferent(mDocumentContainer)); if (docShell) { - docShell->GetLayoutHistoryState(&state); + docShell->GetLayoutHistoryState(getter_AddRefs(state)); } } - return state; + return state.forget(); } void diff --git a/content/base/src/nsNodeInfoManager.cpp b/content/base/src/nsNodeInfoManager.cpp index ae2a775e920..d387304f1b5 100644 --- a/content/base/src/nsNodeInfoManager.cpp +++ b/content/base/src/nsNodeInfoManager.cpp @@ -242,11 +242,9 @@ nsNodeInfoManager::GetNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, void *node = PL_HashTableLookup(mNodeInfoHash, &tmpKey); if (node) { - nsINodeInfo* nodeInfo = static_cast(node); + nsCOMPtr nodeInfo = static_cast(node); - NS_ADDREF(nodeInfo); - - return nodeInfo; + return nodeInfo.forget(); } nsRefPtr newNodeInfo = @@ -263,10 +261,7 @@ nsNodeInfoManager::GetNodeInfo(nsIAtom *aName, nsIAtom *aPrefix, NS_IF_ADDREF(mDocument); } - nsNodeInfo *nodeInfo = nullptr; - newNodeInfo.swap(nodeInfo); - - return nodeInfo; + return newNodeInfo.forget(); } diff --git a/content/base/src/nsObjectLoadingContent.cpp b/content/base/src/nsObjectLoadingContent.cpp index 831be08a705..4b4e76cc3f3 100644 --- a/content/base/src/nsObjectLoadingContent.cpp +++ b/content/base/src/nsObjectLoadingContent.cpp @@ -986,9 +986,8 @@ nsObjectLoadingContent::GetFrameLoader(nsIFrameLoader** aFrameLoader) NS_IMETHODIMP_(already_AddRefed) nsObjectLoadingContent::GetFrameLoader() { - nsFrameLoader* loader = mFrameLoader; - NS_IF_ADDREF(loader); - return loader; + nsRefPtr loader = mFrameLoader; + return loader.forget(); } NS_IMETHODIMP diff --git a/content/base/src/nsRange.cpp b/content/base/src/nsRange.cpp index f70237b87f2..98e0606b725 100644 --- a/content/base/src/nsRange.cpp +++ b/content/base/src/nsRange.cpp @@ -1533,22 +1533,17 @@ RangeSubtreeIterator::Init(nsIDOMRange *aRange) already_AddRefed RangeSubtreeIterator::GetCurrentNode() { - nsIDOMNode *node = nullptr; + nsCOMPtr node; if (mIterState == eUseStart && mStart) { - NS_ADDREF(node = mStart); - } else if (mIterState == eUseEnd && mEnd) - NS_ADDREF(node = mEnd); - else if (mIterState == eUseIterator && mIter) - { - nsINode* n = mIter->GetCurrentNode(); - - if (n) { - CallQueryInterface(n, &node); - } + node = mStart; + } else if (mIterState == eUseEnd && mEnd) { + node = mEnd; + } else if (mIterState == eUseIterator && mIter) { + node = do_QueryInterface(mIter->GetCurrentNode()); } - return node; + return node.forget(); } void diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index 535d9612a20..200c53d176b 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -3715,8 +3715,8 @@ CanvasRenderingContext2D::GetCanvasLayer(nsDisplayListBuilder* aBuilder, static_cast( aOldLayer->GetUserData(&g2DContextLayerUserData)); if (userData && userData->IsForContext(this)) { - NS_ADDREF(aOldLayer); - return aOldLayer; + nsRefPtr ret = aOldLayer; + return ret.forget(); } } diff --git a/content/canvas/src/WebGLContext.cpp b/content/canvas/src/WebGLContext.cpp index a86847918f6..5ebe4d6cece 100644 --- a/content/canvas/src/WebGLContext.cpp +++ b/content/canvas/src/WebGLContext.cpp @@ -837,8 +837,8 @@ WebGLContext::GetCanvasLayer(nsDisplayListBuilder* aBuilder, if (!mResetLayer && aOldLayer && aOldLayer->HasUserData(&gWebGLLayerUserData)) { - NS_ADDREF(aOldLayer); - return aOldLayer; + nsRefPtr ret = aOldLayer; + return ret.forget(); } nsRefPtr canvasLayer = aManager->CreateCanvasLayer(); @@ -880,7 +880,7 @@ WebGLContext::GetCanvasLayer(nsDisplayListBuilder* aBuilder, mResetLayer = false; - return canvasLayer.forget().get(); + return canvasLayer.forget(); } void diff --git a/content/canvas/src/WebGLContextGL.cpp b/content/canvas/src/WebGLContextGL.cpp index d04829d9a3d..53ebcbe6d0f 100644 --- a/content/canvas/src/WebGLContextGL.cpp +++ b/content/canvas/src/WebGLContextGL.cpp @@ -2816,16 +2816,15 @@ WebGLContext::GetUniformLocation(WebGLProgram *prog, const nsAString& name) MakeContextCurrent(); GLint intlocation = gl->fGetUniformLocation(progname, mappedName.get()); - WebGLUniformLocation *loc = nullptr; + nsRefPtr loc; if (intlocation >= 0) { WebGLUniformInfo info = prog->GetUniformInfoForMappedIdentifier(mappedName); loc = new WebGLUniformLocation(this, prog, intlocation, info); - NS_ADDREF(loc); } - return loc; + return loc.forget(); } JS::Value @@ -4674,10 +4673,9 @@ WebGLContext::GetShaderPrecisionFormat(WebGLenum shadertype, WebGLenum precision GLint range[2], precision; gl->fGetShaderPrecisionFormat(shadertype, precisiontype, range, &precision); - WebGLShaderPrecisionFormat *retShaderPrecisionFormat + nsRefPtr retShaderPrecisionFormat = new WebGLShaderPrecisionFormat(this, range[0], range[1], precision); - NS_ADDREF(retShaderPrecisionFormat); - return retShaderPrecisionFormat; + return retShaderPrecisionFormat.forget(); } void diff --git a/content/events/src/nsDOMTextEvent.cpp b/content/events/src/nsDOMTextEvent.cpp index 70a096a4aa1..debecec8841 100644 --- a/content/events/src/nsDOMTextEvent.cpp +++ b/content/events/src/nsDOMTextEvent.cpp @@ -67,9 +67,7 @@ NS_METHOD_(already_AddRefed) nsDOMTextEvent::GetInputRa { if (mEvent->message == NS_TEXT_TEXT) { nsRefPtr textRange = mTextRange; - nsPrivateTextRangeList *textRangePtr = nullptr; - textRange.swap(textRangePtr); - return textRangePtr; + return textRange.forget(); } return nullptr; } diff --git a/content/events/src/nsDOMUIEvent.cpp b/content/events/src/nsDOMUIEvent.cpp index 4f969c858a9..57c639daa82 100644 --- a/content/events/src/nsDOMUIEvent.cpp +++ b/content/events/src/nsDOMUIEvent.cpp @@ -274,7 +274,7 @@ nsDOMUIEvent::GetRangeParent() !nsContentUtils::CanAccessNativeAnon()) { return nullptr; } - return parent.forget().get(); + return parent.forget(); } } diff --git a/content/events/src/nsEventStateManager.cpp b/content/events/src/nsEventStateManager.cpp index 68ac316e6d6..dcc3678a84a 100644 --- a/content/events/src/nsEventStateManager.cpp +++ b/content/events/src/nsEventStateManager.cpp @@ -4616,20 +4616,20 @@ nsEventStateManager::GetEventTargetContent(nsEvent* aEvent) return content.forget(); } - nsIContent *content = nullptr; + nsCOMPtr content; nsIPresShell *presShell = mPresContext->GetPresShell(); if (presShell) { - content = presShell->GetEventTargetContent(aEvent).get(); + content = presShell->GetEventTargetContent(aEvent); } // Some events here may set mCurrentTarget but not set the corresponding // event target in the PresShell. if (!content && mCurrentTarget) { - mCurrentTarget->GetContentForEvent(aEvent, &content); + mCurrentTarget->GetContentForEvent(aEvent, getter_AddRefs(content)); } - return content; + return content.forget(); } static Element* diff --git a/content/events/src/nsPrivateTextRange.cpp b/content/events/src/nsPrivateTextRange.cpp index f6c59eb9190..0e0bc111e18 100644 --- a/content/events/src/nsPrivateTextRange.cpp +++ b/content/events/src/nsPrivateTextRange.cpp @@ -60,11 +60,6 @@ NS_METHOD_(uint16_t) nsPrivateTextRangeList::GetLength() NS_METHOD_(already_AddRefed) nsPrivateTextRangeList::Item(uint16_t aIndex) { nsRefPtr ret = mList.ElementAt(aIndex); - if (ret) { - nsPrivateTextRange *retPtr = nullptr; - ret.swap(retPtr); - return retPtr; - } - return nullptr; + return ret.forget(); } diff --git a/content/html/content/src/HTMLAnchorElement.cpp b/content/html/content/src/HTMLAnchorElement.cpp index a0463b99de1..21759089a02 100644 --- a/content/html/content/src/HTMLAnchorElement.cpp +++ b/content/html/content/src/HTMLAnchorElement.cpp @@ -339,10 +339,9 @@ HTMLAnchorElement::GetLinkState() const already_AddRefed HTMLAnchorElement::GetHrefURI() const { - nsIURI* uri = Link::GetCachedURI(); + nsCOMPtr uri = Link::GetCachedURI(); if (uri) { - NS_ADDREF(uri); - return uri; + return uri.forget(); } return GetHrefURIForAnchors(); diff --git a/content/html/content/src/nsHTMLFormElement.cpp b/content/html/content/src/nsHTMLFormElement.cpp index 2d72c99982f..7169e02be25 100644 --- a/content/html/content/src/nsHTMLFormElement.cpp +++ b/content/html/content/src/nsHTMLFormElement.cpp @@ -1388,9 +1388,9 @@ already_AddRefed nsHTMLFormElement::DoResolveName(const nsAString& aName, bool aFlushContent) { - nsISupports *result; - NS_IF_ADDREF(result = mControls->NamedItemInternal(aName, aFlushContent)); - return result; + nsCOMPtr result = + mControls->NamedItemInternal(aName, aFlushContent); + return result.forget(); } void diff --git a/content/html/document/src/nsHTMLContentSink.cpp b/content/html/document/src/nsHTMLContentSink.cpp index 6544793b397..cfea9986c32 100644 --- a/content/html/document/src/nsHTMLContentSink.cpp +++ b/content/html/document/src/nsHTMLContentSink.cpp @@ -495,10 +495,9 @@ CreateHTMLElement(uint32_t aNodeType, already_AddRefed aNodeInfo, NS_ASSERTION(cb != NS_NewHTMLNOTUSEDElement, "Don't know how to construct tag element!"); - nsGenericHTMLElement* result = cb(aNodeInfo, aFromParser); - NS_IF_ADDREF(result); + nsRefPtr result = cb(aNodeInfo, aFromParser); - return result; + return result.forget(); } //---------------------------------------------------------------------- diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp index 7c2d510520f..2e37901d83b 100644 --- a/content/html/document/src/nsHTMLDocument.cpp +++ b/content/html/document/src/nsHTMLDocument.cpp @@ -1470,35 +1470,35 @@ nsHTMLDocument::Open(JSContext* cx, // Note that aborting a parser leaves the parser "active" with its // insertion point "not undefined". We track this using mParserAborted, // because aborting a parser nulls out mParser. - NS_ADDREF_THIS(); - return this; + nsCOMPtr ret = this; + return ret.forget(); } // No calling document.open() without a script global object if (!mScriptGlobalObject) { - NS_ADDREF_THIS(); - return this; + nsCOMPtr ret = this; + return ret.forget(); } nsPIDOMWindow* outer = GetWindow(); if (!outer || (GetInnerWindow() != outer->GetCurrentInnerWindow())) { - NS_ADDREF_THIS(); - return this; + nsCOMPtr ret = this; + return ret.forget(); } // check whether we're in the middle of unload. If so, ignore this call. nsCOMPtr shell = do_QueryReferent(mDocumentContainer); if (!shell) { // We won't be able to create a parser anyway. - NS_ADDREF_THIS(); - return this; + nsCOMPtr ret = this; + return ret.forget(); } bool inUnload; shell->GetIsInUnload(&inUnload); if (inUnload) { - NS_ADDREF_THIS(); - return this; + nsCOMPtr ret = this; + return ret.forget(); } // Note: We want to use GetDocumentFromContext here because this document @@ -1563,8 +1563,8 @@ nsHTMLDocument::Open(JSContext* cx, if (NS_SUCCEEDED(cv->PermitUnload(false, &okToUnload)) && !okToUnload) { // We don't want to unload, so stop here, but don't throw an // exception. - NS_ADDREF_THIS(); - return this; + nsCOMPtr ret = this; + return ret.forget(); } } diff --git a/content/media/webspeech/synth/SpeechSynthesisUtterance.cpp b/content/media/webspeech/synth/SpeechSynthesisUtterance.cpp index b7581ae5a0f..32c62e3bb74 100644 --- a/content/media/webspeech/synth/SpeechSynthesisUtterance.cpp +++ b/content/media/webspeech/synth/SpeechSynthesisUtterance.cpp @@ -71,10 +71,10 @@ SpeechSynthesisUtterance::Constructor(GlobalObject& aGlobal, } MOZ_ASSERT(win->IsInnerWindow()); - SpeechSynthesisUtterance* object = new SpeechSynthesisUtterance(aText); - NS_ADDREF(object); + nsRefPtr object = + new SpeechSynthesisUtterance(aText); object->BindToOwner(win); - return object; + return object.forget(); } void diff --git a/content/media/webspeech/synth/nsSynthVoiceRegistry.cpp b/content/media/webspeech/synth/nsSynthVoiceRegistry.cpp index 84df421832a..24915e2537c 100644 --- a/content/media/webspeech/synth/nsSynthVoiceRegistry.cpp +++ b/content/media/webspeech/synth/nsSynthVoiceRegistry.cpp @@ -516,11 +516,11 @@ nsSynthVoiceRegistry::SpeakUtterance(SpeechSynthesisUtterance& aUtterance, aUtterance.mVoice->GetVoiceURI(uri); } - nsSpeechTask* task; + nsRefPtr task; if (XRE_GetProcessType() == GeckoProcessType_Content) { task = new SpeechTaskChild(&aUtterance); SpeechSynthesisRequestChild* actor = - new SpeechSynthesisRequestChild(static_cast(task)); + new SpeechSynthesisRequestChild(static_cast(task.get())); mSpeechSynthChild->SendPSpeechSynthesisRequestConstructor(actor, aUtterance.mText, lang, @@ -534,8 +534,7 @@ nsSynthVoiceRegistry::SpeakUtterance(SpeechSynthesisUtterance& aUtterance, aUtterance.Rate(), aUtterance.Pitch(), task); } - NS_IF_ADDREF(task); - return task; + return task.forget(); } void diff --git a/content/svg/content/src/SVGTests.cpp b/content/svg/content/src/SVGTests.cpp index 5e20d45d126..c08e0678415 100644 --- a/content/svg/content/src/SVGTests.cpp +++ b/content/svg/content/src/SVGTests.cpp @@ -34,7 +34,7 @@ SVGTests::RequiredFeatures() nsCOMPtr elem = do_QueryInterface(this); nsSVGElement* element = static_cast(elem.get()); return DOMSVGStringList::GetDOMWrapper( - &mStringListAttributes[FEATURES], element, true, FEATURES).get(); + &mStringListAttributes[FEATURES], element, true, FEATURES); } already_AddRefed @@ -43,7 +43,7 @@ SVGTests::RequiredExtensions() nsCOMPtr elem = do_QueryInterface(this); nsSVGElement* element = static_cast(elem.get()); return DOMSVGStringList::GetDOMWrapper( - &mStringListAttributes[EXTENSIONS], element, true, EXTENSIONS).get(); + &mStringListAttributes[EXTENSIONS], element, true, EXTENSIONS); } already_AddRefed @@ -52,7 +52,7 @@ SVGTests::SystemLanguage() nsCOMPtr elem = do_QueryInterface(this); nsSVGElement* element = static_cast(elem.get()); return DOMSVGStringList::GetDOMWrapper( - &mStringListAttributes[LANGUAGE], element, true, LANGUAGE).get(); + &mStringListAttributes[LANGUAGE], element, true, LANGUAGE); } bool diff --git a/content/svg/content/src/SVGTransformableElement.cpp b/content/svg/content/src/SVGTransformableElement.cpp index 03ee7dedbab..fde4735dfca 100644 --- a/content/svg/content/src/SVGTransformableElement.cpp +++ b/content/svg/content/src/SVGTransformableElement.cpp @@ -24,7 +24,7 @@ SVGTransformableElement::Transform() // We're creating a DOM wrapper, so we must tell GetAnimatedTransformList // to allocate the SVGAnimatedTransformList if it hasn't already done so: return SVGAnimatedTransformList::GetDOMWrapper( - GetAnimatedTransformList(DO_ALLOCATE), this).get(); + GetAnimatedTransformList(DO_ALLOCATE), this); } diff --git a/content/xbl/src/nsXBLPrototypeBinding.cpp b/content/xbl/src/nsXBLPrototypeBinding.cpp index 7b3d99758fc..9c802e7ac8a 100644 --- a/content/xbl/src/nsXBLPrototypeBinding.cpp +++ b/content/xbl/src/nsXBLPrototypeBinding.cpp @@ -317,9 +317,8 @@ nsXBLPrototypeBinding::SetBasePrototype(nsXBLPrototypeBinding* aBinding) already_AddRefed nsXBLPrototypeBinding::GetBindingElement() { - nsIContent* result = mBinding; - NS_IF_ADDREF(result); - return result; + nsCOMPtr result = mBinding; + return result.forget(); } void diff --git a/content/xbl/src/nsXBLPrototypeHandler.cpp b/content/xbl/src/nsXBLPrototypeHandler.cpp index 6b13d668b52..e0ec60da9ac 100644 --- a/content/xbl/src/nsXBLPrototypeHandler.cpp +++ b/content/xbl/src/nsXBLPrototypeHandler.cpp @@ -138,9 +138,7 @@ nsXBLPrototypeHandler::GetHandlerElement() { if (mType & NS_HANDLER_TYPE_XUL) { nsCOMPtr element = do_QueryReferent(mHandlerElement); - nsIContent* el = nullptr; - element.swap(el); - return el; + return element.forget(); } return nullptr; @@ -574,9 +572,8 @@ nsXBLPrototypeHandler::DispatchXULKeyCommand(nsIDOMEvent* aEvent) already_AddRefed nsXBLPrototypeHandler::GetEventName() { - nsIAtom* eventName = mEventName; - NS_IF_ADDREF(eventName); - return eventName; + nsCOMPtr eventName = mEventName; + return eventName.forget(); } already_AddRefed @@ -611,13 +608,12 @@ nsXBLPrototypeHandler::GetController(EventTarget* aTarget) // Return the first controller. // XXX This code should be checking the command name and using supportscommand and // iscommandenabled. - nsIController* controller; + nsCOMPtr controller; if (controllers) { - controllers->GetControllerAt(0, &controller); // return reference + controllers->GetControllerAt(0, getter_AddRefs(controller)); } - else controller = nullptr; - return controller; + return controller.forget(); } bool diff --git a/content/xslt/src/xpath/txMozillaXPathTreeWalker.cpp b/content/xslt/src/xpath/txMozillaXPathTreeWalker.cpp index e4ed3d38405..172b5d2e1b7 100644 --- a/content/xslt/src/xpath/txMozillaXPathTreeWalker.cpp +++ b/content/xslt/src/xpath/txMozillaXPathTreeWalker.cpp @@ -346,10 +346,8 @@ txXPathNodeUtils::getLocalName(const txXPathNode& aNode) if (aNode.isContent()) { if (aNode.mNode->IsElement()) { - nsIAtom* localName = aNode.Content()->Tag(); - NS_ADDREF(localName); - - return localName; + nsCOMPtr localName = aNode.Content()->Tag(); + return localName.forget(); } if (aNode.mNode->IsNodeOfType(nsINode::ePROCESSING_INSTRUCTION)) { @@ -363,11 +361,10 @@ txXPathNodeUtils::getLocalName(const txXPathNode& aNode) return nullptr; } - nsIAtom* localName = aNode.Content()-> + nsCOMPtr localName = aNode.Content()-> GetAttrNameAt(aNode.mIndex)->LocalName(); - NS_ADDREF(localName); - return localName; + return localName.forget(); } nsIAtom* diff --git a/content/xul/content/src/nsXULElement.cpp b/content/xul/content/src/nsXULElement.cpp index 45fdee98499..33d26fc9dd9 100644 --- a/content/xul/content/src/nsXULElement.cpp +++ b/content/xul/content/src/nsXULElement.cpp @@ -225,10 +225,8 @@ nsXULElement::Create(nsXULPrototypeElement* aPrototype, nsINodeInfo *aNodeInfo, bool aIsScriptable, bool aIsRoot) { nsCOMPtr ni = aNodeInfo; - nsXULElement *element = new nsXULElement(ni.forget()); + nsRefPtr element = new nsXULElement(ni.forget()); if (element) { - NS_ADDREF(element); - if (aPrototype->mHasIdAttribute) { element->SetHasID(); } @@ -259,7 +257,7 @@ nsXULElement::Create(nsXULPrototypeElement* aPrototype, nsINodeInfo *aNodeInfo, } } - return element; + return element.forget(); } nsresult @@ -1474,9 +1472,8 @@ nsXULElement::GetFrameLoader() if (!slots) return nullptr; - nsFrameLoader* loader = slots->mFrameLoader; - NS_IF_ADDREF(loader); - return loader; + nsRefPtr loader = slots->mFrameLoader; + return loader.forget(); } nsresult diff --git a/content/xul/content/src/nsXULPopupListener.cpp b/content/xul/content/src/nsXULPopupListener.cpp index c085bc8468c..e71c5261d0e 100644 --- a/content/xul/content/src/nsXULPopupListener.cpp +++ b/content/xul/content/src/nsXULPopupListener.cpp @@ -300,8 +300,8 @@ GetImmediateChild(nsIContent* aContent, nsIAtom *aTag) child; child = child->GetNextSibling()) { if (child->Tag() == aTag) { - NS_ADDREF(child); - return child; + nsCOMPtr ret = child; + return ret.forget(); } } diff --git a/content/xul/document/src/XULDocument.cpp b/content/xul/document/src/XULDocument.cpp index bf2cde40161..fdf8098f183 100644 --- a/content/xul/document/src/XULDocument.cpp +++ b/content/xul/document/src/XULDocument.cpp @@ -1249,7 +1249,7 @@ XULDocument::GetElementsByAttribute(const nsAString& aAttribute, { nsCOMPtr attrAtom(do_GetAtom(aAttribute)); void* attrValue = new nsString(aValue); - nsContentList *list = new nsContentList(this, + nsRefPtr list = new nsContentList(this, MatchAttribute, nsContentUtils::DestroyMatchString, attrValue, @@ -1257,8 +1257,7 @@ XULDocument::GetElementsByAttribute(const nsAString& aAttribute, attrAtom, kNameSpaceID_Unknown); - NS_ADDREF(list); - return list; + return list.forget(); } NS_IMETHODIMP @@ -1293,15 +1292,14 @@ XULDocument::GetElementsByAttributeNS(const nsAString& aNamespaceURI, } } - nsContentList *list = new nsContentList(this, + nsRefPtr list = new nsContentList(this, MatchAttribute, nsContentUtils::DestroyMatchString, attrValue, true, attrAtom, nameSpaceId); - NS_ADDREF(list); - return list; + return list.forget(); } NS_IMETHODIMP diff --git a/dom/base/nsGlobalWindow.cpp b/dom/base/nsGlobalWindow.cpp index be934c0cbb0..a3e3e6050ff 100644 --- a/dom/base/nsGlobalWindow.cpp +++ b/dom/base/nsGlobalWindow.cpp @@ -4828,18 +4828,16 @@ static already_AddRefed GetCallerDocShellTreeItem() { JSContext *cx = nsContentUtils::GetCurrentJSContext(); - nsIDocShellTreeItem *callerItem = nullptr; + nsCOMPtr callerItem; if (cx) { nsCOMPtr callerWebNav = do_GetInterface(nsJSUtils::GetDynamicScriptGlobal(cx)); - if (callerWebNav) { - CallQueryInterface(callerWebNav, &callerItem); - } + callerItem = do_QueryInterface(callerWebNav); } - return callerItem; + return callerItem.forget(); } bool @@ -4869,13 +4867,13 @@ nsGlobalWindow::GetMainWidget() { nsCOMPtr treeOwnerAsWin = GetTreeOwnerWindow(); - nsIWidget *widget = nullptr; + nsCOMPtr widget; if (treeOwnerAsWin) { - treeOwnerAsWin->GetMainWidget(&widget); + treeOwnerAsWin->GetMainWidget(getter_AddRefs(widget)); } - return widget; + return widget.forget(); } nsIWidget* diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index 991cefca561..38c2b339397 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -679,13 +679,9 @@ GetPromptFromContext(nsJSContext* ctx) nsIDocShell *docShell = win->GetDocShell(); NS_ENSURE_TRUE(docShell, nullptr); - nsCOMPtr ireq(do_QueryInterface(docShell)); - NS_ENSURE_TRUE(ireq, nullptr); - // Get the nsIPrompt interface from the docshell - nsIPrompt* prompt; - ireq->GetInterface(NS_GET_IID(nsIPrompt), (void**)&prompt); - return prompt; + nsCOMPtr prompt = do_GetInterface(docShell); + return prompt.forget(); } JSBool diff --git a/dom/plugins/base/nsNPAPIPluginInstance.cpp b/dom/plugins/base/nsNPAPIPluginInstance.cpp index 43368646989..7fddcf37cdb 100644 --- a/dom/plugins/base/nsNPAPIPluginInstance.cpp +++ b/dom/plugins/base/nsNPAPIPluginInstance.cpp @@ -354,10 +354,9 @@ nsNPAPIPluginInstance::GetDOMWindow() if (!doc) return nullptr; - nsPIDOMWindow *window = doc->GetWindow(); - NS_IF_ADDREF(window); + nsRefPtr window = doc->GetWindow(); - return window; + return window.forget(); } nsresult diff --git a/dom/plugins/base/nsPluginHost.cpp b/dom/plugins/base/nsPluginHost.cpp index 890cc1f623a..0d5b7dbb335 100644 --- a/dom/plugins/base/nsPluginHost.cpp +++ b/dom/plugins/base/nsPluginHost.cpp @@ -336,8 +336,8 @@ nsPluginHost::GetInst() NS_ADDREF(sInst); } - NS_ADDREF(sInst); - return sInst; + nsRefPtr inst = sInst; + return inst.forget(); } bool nsPluginHost::IsRunningPlugin(nsPluginTag * aPluginTag) diff --git a/editor/composer/src/nsComposerCommandsUpdater.cpp b/editor/composer/src/nsComposerCommandsUpdater.cpp index 39d46f25ef5..d02b158b86b 100644 --- a/editor/composer/src/nsComposerCommandsUpdater.cpp +++ b/editor/composer/src/nsComposerCommandsUpdater.cpp @@ -362,9 +362,7 @@ nsComposerCommandsUpdater::GetCommandUpdater() NS_ENSURE_TRUE(docShell, nullptr); nsCOMPtr manager = do_GetInterface(docShell); nsCOMPtr updater = do_QueryInterface(manager); - nsPICommandUpdater* retVal = nullptr; - updater.swap(retVal); - return retVal; + return updater.forget(); } #if 0 diff --git a/editor/txmgr/src/nsTransactionStack.cpp b/editor/txmgr/src/nsTransactionStack.cpp index ec8f43e1bc5..2c648a9778e 100644 --- a/editor/txmgr/src/nsTransactionStack.cpp +++ b/editor/txmgr/src/nsTransactionStack.cpp @@ -57,24 +57,23 @@ nsTransactionStack::PopBottom() already_AddRefed nsTransactionStack::Peek() { - nsTransactionItem* transaction = nullptr; + nsRefPtr transaction; if (mQue.GetSize()) { - NS_IF_ADDREF(transaction = static_cast(mQue.Last())); + transaction = static_cast(mQue.Last()); } - return transaction; + return transaction.forget(); } already_AddRefed nsTransactionStack::GetItem(int32_t aIndex) { - nsTransactionItem* transaction = nullptr; + nsRefPtr transaction; if (aIndex >= 0 && aIndex < mQue.GetSize()) { - NS_IF_ADDREF(transaction = - static_cast(mQue.ObjectAt(aIndex))); + transaction = static_cast(mQue.ObjectAt(aIndex)); } - return transaction; + return transaction.forget(); } void diff --git a/embedding/components/windowwatcher/src/nsWindowWatcher.cpp b/embedding/components/windowwatcher/src/nsWindowWatcher.cpp index f8c9bad6977..cec375592a9 100644 --- a/embedding/components/windowwatcher/src/nsWindowWatcher.cpp +++ b/embedding/components/windowwatcher/src/nsWindowWatcher.cpp @@ -1718,22 +1718,20 @@ already_AddRefed nsWindowWatcher::GetCallerTreeItem(nsIDocShellTreeItem* aParentItem) { JSContext *cx = nsContentUtils::GetCurrentJSContext(); - nsIDocShellTreeItem* callerItem = nullptr; + nsCOMPtr callerItem; if (cx) { nsCOMPtr callerWebNav = do_GetInterface(nsJSUtils::GetDynamicScriptGlobal(cx)); - if (callerWebNav) { - CallQueryInterface(callerWebNav, &callerItem); - } + callerItem = do_QueryInterface(callerWebNav); } if (!callerItem) { - NS_IF_ADDREF(callerItem = aParentItem); + callerItem = aParentItem; } - return callerItem; + return callerItem.forget(); } nsresult diff --git a/gfx/layers/ImageContainer.cpp b/gfx/layers/ImageContainer.cpp index 9dda1a744da..ad48b0876ce 100644 --- a/gfx/layers/ImageContainer.cpp +++ b/gfx/layers/ImageContainer.cpp @@ -530,7 +530,7 @@ PlanarYCbCrImage::GetAsSurface() mSurface = imageSurface; - return imageSurface.forget().get(); + return imageSurface.forget(); } already_AddRefed diff --git a/gfx/layers/opengl/ImageLayerOGL.cpp b/gfx/layers/opengl/ImageLayerOGL.cpp index 545e1d1c130..3640658d22a 100644 --- a/gfx/layers/opengl/ImageLayerOGL.cpp +++ b/gfx/layers/opengl/ImageLayerOGL.cpp @@ -97,10 +97,9 @@ GLTexture::Release() mContext->MakeCurrent(); mContext->fDeleteTextures(1, &mTexture); } else { - nsCOMPtr runnable = - new TextureDeleter(mContext.get(), mTexture); - mContext->DispatchToOwningThread(runnable); - mContext.forget(); + already_AddRefed context = mContext.forget(); + nsCOMPtr runnable = new TextureDeleter(context, mTexture); + context.get()->DispatchToOwningThread(runnable); } mTexture = 0; diff --git a/gfx/thebes/gfxASurface.cpp b/gfx/thebes/gfxASurface.cpp index d3c60a7d8cf..e632ef81d42 100644 --- a/gfx/thebes/gfxASurface.cpp +++ b/gfx/thebes/gfxASurface.cpp @@ -126,14 +126,13 @@ gfxASurface::SetSurfaceWrapper(cairo_surface_t *csurf, gfxASurface *asurf) already_AddRefed gfxASurface::Wrap (cairo_surface_t *csurf) { - gfxASurface *result; + nsRefPtr result; /* Do we already have a wrapper for this surface? */ result = GetSurfaceWrapper(csurf); if (result) { // fprintf(stderr, "Existing wrapper for %p -> %p\n", csurf, result); - NS_ADDREF(result); - return result; + return result.forget(); } /* No wrapper; figure out the surface type and create it */ @@ -177,8 +176,7 @@ gfxASurface::Wrap (cairo_surface_t *csurf) // fprintf(stderr, "New wrapper for %p -> %p\n", csurf, result); - NS_ADDREF(result); - return result; + return result.forget(); } void diff --git a/gfx/thebes/gfxContext.cpp b/gfx/thebes/gfxContext.cpp index 1170bd3f738..8563d1f1ca3 100644 --- a/gfx/thebes/gfxContext.cpp +++ b/gfx/thebes/gfxContext.cpp @@ -148,9 +148,8 @@ gfxContext::CurrentSurface(gfxFloat *dx, gfxFloat *dy) if (s == mSurface->CairoSurface()) { if (dx && dy) cairo_surface_get_device_offset(s, dx, dy); - gfxASurface *ret = mSurface; - NS_ADDREF(ret); - return ret; + nsRefPtr ret = mSurface; + return ret.forget(); } if (dx && dy) @@ -1374,14 +1373,13 @@ gfxContext::GetPattern() cairo_pattern_t *pat = cairo_get_source(mCairo); NS_ASSERTION(pat, "I was told this couldn't be null"); - gfxPattern *wrapper = nullptr; + nsRefPtr wrapper; if (pat) wrapper = new gfxPattern(pat); else wrapper = new gfxPattern(gfxRGBA(0,0,0,0)); - NS_IF_ADDREF(wrapper); - return wrapper; + return wrapper.forget(); } else { nsRefPtr pat; @@ -1557,10 +1555,9 @@ gfxContext::PopGroup() { if (mCairo) { cairo_pattern_t *pat = cairo_pop_group(mCairo); - gfxPattern *wrapper = new gfxPattern(pat); + nsRefPtr wrapper = new gfxPattern(pat); cairo_pattern_destroy(pat); - NS_IF_ADDREF(wrapper); - return wrapper; + return wrapper.forget(); } else { RefPtr src = mDT->Snapshot(); Point deviceOffset = CurrentState().deviceOffset; @@ -1664,10 +1661,9 @@ already_AddRefed gfxContext::GetFlattenedPath() { if (mCairo) { - gfxFlattenedPath *path = + nsRefPtr path = new gfxFlattenedPath(cairo_copy_path_flat(mCairo)); - NS_IF_ADDREF(path); - return path; + return path.forget(); } else { // XXX - Used by SVG, needs fixing. return NULL; diff --git a/gfx/thebes/gfxFont.cpp b/gfx/thebes/gfxFont.cpp index ccf93a5b6e1..9d362749590 100644 --- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -202,9 +202,7 @@ gfxFontEntry::FindOrMakeFont(const gfxFontStyle *aStyle, bool aNeedsBold) font = newFont; gfxFontCache::GetCache()->AddNew(font); } - gfxFont *f = nullptr; - font.swap(f); - return f; + return font.forget(); } bool @@ -1255,9 +1253,8 @@ gfxFontCache::Lookup(const gfxFontEntry *aFontEntry, if (!entry) return nullptr; - gfxFont *font = entry->mFont; - NS_ADDREF(font); - return font; + nsRefPtr font = entry->mFont; + return font.forget(); } void @@ -4395,11 +4392,10 @@ gfxFontGroup::FindFontForChar(uint32_t aCh, uint32_t aPrevCh, bool isVarSelector = gfxFontUtils::IsVarSelector(aCh); if (!isJoinControl && !wasJoinCauser && !isVarSelector) { - gfxFont *firstFont = mFonts[0].Font(); + nsRefPtr firstFont = mFonts[0].Font(); if (firstFont->HasCharacter(aCh)) { *aMatchType = gfxTextRange::kFontGroup; - firstFont->AddRef(); - return firstFont; + return firstFont.forget(); } // It's possible that another font in the family (e.g. regular face, // where the requested style was italic) will support the character @@ -4418,16 +4414,16 @@ gfxFontGroup::FindFontForChar(uint32_t aCh, uint32_t aPrevCh, // actually be rendered (see bug 716229) uint8_t category = GetGeneralCategory(aCh); if (category == HB_UNICODE_GENERAL_CATEGORY_CONTROL) { - aPrevMatchedFont->AddRef(); - return aPrevMatchedFont; + nsRefPtr ret = aPrevMatchedFont; + return ret.forget(); } // if this character is a join-control or the previous is a join-causer, // use the same font as the previous range if we can if (isJoinControl || wasJoinCauser) { if (aPrevMatchedFont->HasCharacter(aCh)) { - aPrevMatchedFont->AddRef(); - return aPrevMatchedFont; + nsRefPtr ret = aPrevMatchedFont; + return ret.forget(); } } } @@ -4437,8 +4433,8 @@ gfxFontGroup::FindFontForChar(uint32_t aCh, uint32_t aPrevCh, // otherwise the text run will be divided. if (isVarSelector) { if (aPrevMatchedFont) { - aPrevMatchedFont->AddRef(); - return aPrevMatchedFont; + nsRefPtr ret = aPrevMatchedFont; + return ret.forget(); } // VS alone. it's meaningless to search different fonts return nullptr; @@ -4475,8 +4471,8 @@ gfxFontGroup::FindFontForChar(uint32_t aCh, uint32_t aPrevCh, // -- before searching for something else check the font used for the previous character if (aPrevMatchedFont && aPrevMatchedFont->HasCharacter(aCh)) { *aMatchType = gfxTextRange::kSystemFallback; - aPrevMatchedFont->AddRef(); - return aPrevMatchedFont; + nsRefPtr ret = aPrevMatchedFont; + return ret.forget(); } // never fall back for characters from unknown scripts @@ -4637,7 +4633,7 @@ struct PrefFontCallbackData { already_AddRefed gfxFontGroup::WhichPrefFontSupportsChar(uint32_t aCh) { - gfxFont *font; + nsRefPtr font; // get the pref font list if it hasn't been set up already uint32_t unicodeRange = FindCharUnicodeRange(aCh); @@ -4647,8 +4643,7 @@ gfxFontGroup::WhichPrefFontSupportsChar(uint32_t aCh) if (mLastPrefFont && charLang == mLastPrefLang && mLastPrefFirstFont && mLastPrefFont->HasCharacter(aCh)) { font = mLastPrefFont; - NS_ADDREF(font); - return font; + return font.forget(); } // based on char lang and page lang, set up list of pref lang fonts to check @@ -4686,8 +4681,7 @@ gfxFontGroup::WhichPrefFontSupportsChar(uint32_t aCh) // pref font lookups if (family == mLastPrefFamily && mLastPrefFont->HasCharacter(aCh)) { font = mLastPrefFont; - NS_ADDREF(font); - return font; + return font.forget(); } bool needsBold; diff --git a/gfx/thebes/gfxImageSurface.cpp b/gfx/thebes/gfxImageSurface.cpp index a9bba251a67..50da5c90bb5 100644 --- a/gfx/thebes/gfxImageSurface.cpp +++ b/gfx/thebes/gfxImageSurface.cpp @@ -283,7 +283,7 @@ gfxImageSurface::GetSubimage(const gfxRect& aRect) new gfxSubimageSurface(this, subData, gfxIntSize((int)r.Width(), (int)r.Height())); - return image.forget().get(); + return image.forget(); } gfxSubimageSurface::gfxSubimageSurface(gfxImageSurface* aParent, diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 2e49aa2408e..1e0e89f4d49 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -513,9 +513,7 @@ gfxPlatform::OptimizeImage(gfxImageSurface *aSurface, tmpCtx.SetSource(aSurface); tmpCtx.Paint(); - gfxASurface *ret = optSurface; - NS_ADDREF(ret); - return ret; + return optSurface.forget(); } cairo_user_data_key_t kDrawTarget; diff --git a/image/src/imgLoader.cpp b/image/src/imgLoader.cpp index 03a1cf4cdec..5841828254e 100644 --- a/image/src/imgLoader.cpp +++ b/image/src/imgLoader.cpp @@ -611,9 +611,7 @@ already_AddRefed imgCacheQueue::Pop() mQueue.pop_back(); mSize -= entry->GetDataSize(); - imgCacheEntry *ret = entry; - NS_ADDREF(ret); - return ret; + return entry.forget(); } void imgCacheQueue::Refresh() diff --git a/image/src/imgLoader.h b/image/src/imgLoader.h index 49e1192186e..d1da88a6203 100644 --- a/image/src/imgLoader.h +++ b/image/src/imgLoader.h @@ -103,9 +103,8 @@ public: already_AddRefed GetRequest() const { - imgRequest *req = mRequest; - NS_ADDREF(req); - return req; + nsRefPtr req = mRequest; + return req.forget(); } bool Evicted() const diff --git a/intl/locale/src/nsLanguageAtomService.cpp b/intl/locale/src/nsLanguageAtomService.cpp index e47389e51f4..b14c34ed948 100644 --- a/intl/locale/src/nsLanguageAtomService.cpp +++ b/intl/locale/src/nsLanguageAtomService.cpp @@ -68,14 +68,10 @@ nsLanguageAtomService::LookupCharSet(const char *aCharSet, nsresult *aError) return nullptr; } - // transfer reference to raw pointer - nsIAtom *raw = nullptr; - langGroup.swap(raw); - if (aError) *aError = NS_OK; - return raw; + return langGroup.forget(); } nsIAtom* diff --git a/js/jsd/jsd_xpc.cpp b/js/jsd/jsd_xpc.cpp index b7010bf92dc..8568dd9e970 100644 --- a/js/jsd/jsd_xpc.cpp +++ b/js/jsd/jsd_xpc.cpp @@ -151,8 +151,8 @@ jsds_FindEphemeral (LiveEphemeral **listHead, void *key) { if (lv_record->key == key) { - NS_IF_ADDREF(lv_record->value); - return lv_record->value; + nsCOMPtr ret = lv_record->value; + return ret.forget(); } lv_record = reinterpret_cast (PR_NEXT_LINK(&lv_record->links)); diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 84894ee112d..6ecca0b3198 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -4145,14 +4145,14 @@ nsCSSFrameConstructor::BeginBuildingScrollFrame(nsFrameConstructorState& aState, // we used the style that was passed in. So resolve another one. nsStyleSet *styleSet = mPresShell->StyleSet(); - nsStyleContext* aScrolledChildStyle = - styleSet->ResolveAnonymousBoxStyle(aScrolledPseudo, contentStyle).get(); + nsRefPtr scrolledChildStyle = + styleSet->ResolveAnonymousBoxStyle(aScrolledPseudo, contentStyle); if (gfxScrollFrame) { gfxScrollFrame->SetInitialChildList(kPrincipalList, anonymousItems); } - return aScrolledChildStyle; + return scrolledChildStyle.forget(); } void diff --git a/layout/base/nsPresContext.cpp b/layout/base/nsPresContext.cpp index 3a1cdf978ca..97374157582 100644 --- a/layout/base/nsPresContext.cpp +++ b/layout/base/nsPresContext.cpp @@ -1460,11 +1460,8 @@ nsPresContext::SetContainer(nsISupports* aHandler) already_AddRefed nsPresContext::GetContainerInternal() const { - nsISupports *result = nullptr; - if (mContainer) - CallQueryReferent(mContainer.get(), &result); - - return result; + nsCOMPtr result = do_QueryReferent(mContainer); + return result.forget(); } already_AddRefed diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 2f47d6e3ce8..2b1f635d056 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -678,8 +678,8 @@ nsIPresShell::RemoveWeakFrameInternal(nsWeakFrame* aWeakFrame) already_AddRefed nsIPresShell::FrameSelection() { - NS_IF_ADDREF(mSelection); - return mSelection; + nsRefPtr ret = mSelection; + return ret.forget(); } //---------------------------------------------------------------------- @@ -2024,9 +2024,8 @@ PresShell::NotifyDestroyingFrame(nsIFrame* aFrame) already_AddRefed PresShell::GetCaret() const { - nsCaret* caret = mCaret; - NS_IF_ADDREF(caret); - return caret; + nsRefPtr caret = mCaret; + return caret.forget(); } void PresShell::MaybeInvalidateCaretPosition() @@ -4711,11 +4710,10 @@ PresShell::PaintRangePaintInfo(nsTArray >* aItems, aScreenRect->width = pixelArea.width; aScreenRect->height = pixelArea.height; - gfxImageSurface* surface = + nsRefPtr surface = new gfxImageSurface(gfxIntSize(pixelArea.width, pixelArea.height), gfxImageSurface::ImageFormatARGB32); if (surface->CairoStatus()) { - delete surface; return nullptr; } @@ -4774,8 +4772,7 @@ PresShell::PaintRangePaintInfo(nsTArray >* aItems, // restore the old selection display state frameSelection->SetDisplaySelection(oldDisplaySelection); - NS_ADDREF(surface); - return surface; + return surface.forget(); } already_AddRefed @@ -5673,20 +5670,16 @@ PresShell::GetEventTargetFrame() already_AddRefed PresShell::GetEventTargetContent(nsEvent* aEvent) { - nsIContent* content = GetCurrentEventContent(); - if (content) { - NS_ADDREF(content); - } else { + nsCOMPtr content = GetCurrentEventContent(); + if (!content) { nsIFrame* currentEventFrame = GetCurrentEventFrame(); if (currentEventFrame) { - currentEventFrame->GetContentForEvent(aEvent, &content); + currentEventFrame->GetContentForEvent(aEvent, getter_AddRefs(content)); NS_ASSERTION(!content || content->GetCurrentDoc() == mDocument, "handing out content from a different doc"); - } else { - content = nullptr; } } - return content; + return content.forget(); } void @@ -5802,9 +5795,10 @@ PresShell::GetFocusedDOMWindowInOurWindow() { nsCOMPtr rootWindow = GetRootWindow(); NS_ENSURE_TRUE(rootWindow, nullptr); - nsPIDOMWindow* focusedWindow; - nsFocusManager::GetFocusedDescendant(rootWindow, true, &focusedWindow); - return focusedWindow; + nsCOMPtr focusedWindow; + nsFocusManager::GetFocusedDescendant(rootWindow, true, + getter_AddRefs(focusedWindow)); + return focusedWindow.forget(); } void diff --git a/layout/forms/nsListControlFrame.cpp b/layout/forms/nsListControlFrame.cpp index 7b82123d0fa..9d0187dd263 100644 --- a/layout/forms/nsListControlFrame.cpp +++ b/layout/forms/nsListControlFrame.cpp @@ -1018,17 +1018,13 @@ nsListControlFrame::Init(nsIContent* aContent, already_AddRefed nsListControlFrame::GetOptionAsContent(nsIDOMHTMLOptionsCollection* aCollection, int32_t aIndex) { - nsIContent * content = nullptr; nsCOMPtr optionElement = GetOption(aCollection, aIndex); NS_ASSERTION(optionElement != nullptr, "could not get option element by index!"); - if (optionElement) { - CallQueryInterface(optionElement, &content); - } - - return content; + nsCOMPtr content = do_QueryInterface(optionElement); + return content.forget(); } already_AddRefed @@ -1047,13 +1043,13 @@ nsListControlFrame::GetOptionContent(int32_t aIndex) const already_AddRefed nsListControlFrame::GetOptions(nsIContent * aContent) { - nsIDOMHTMLOptionsCollection* options = nullptr; + nsCOMPtr options; nsCOMPtr selectElement = do_QueryInterface(aContent); if (selectElement) { - selectElement->GetOptions(&options); // AddRefs (1) + selectElement->GetOptions(getter_AddRefs(options)); } - return options; + return options.forget(); } already_AddRefed @@ -1065,10 +1061,9 @@ nsListControlFrame::GetOption(nsIDOMHTMLOptionsCollection* aCollection, NS_ASSERTION(node, "Item was successful, but node from collection was null!"); if (node) { - nsIDOMHTMLOptionElement* option = nullptr; - CallQueryInterface(node, &option); + nsCOMPtr option = do_QueryInterface(node); - return option; + return option.forget(); } } else { NS_ERROR("Couldn't get option by index from collection!"); diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index b05123fdc5b..65e715ddc91 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -5485,10 +5485,9 @@ nsFrame::GetSelectionController(nsPresContext *aPresContext, nsISelectionControl already_AddRefed nsIFrame::GetFrameSelection() { - nsFrameSelection* fs = + nsRefPtr fs = const_cast(GetConstFrameSelection()); - NS_IF_ADDREF(fs); - return fs; + return fs.forget(); } const nsFrameSelection* diff --git a/layout/generic/nsTextFrameThebes.cpp b/layout/generic/nsTextFrameThebes.cpp index b8423abd235..229a779501d 100644 --- a/layout/generic/nsTextFrameThebes.cpp +++ b/layout/generic/nsTextFrameThebes.cpp @@ -1706,9 +1706,8 @@ GetReferenceRenderingContext(nsTextFrame* aTextFrame, nsRenderingContext* aRC) return nullptr; } - gfxContext* ctx = tmp->ThebesContext(); - NS_ADDREF(ctx); - return ctx; + nsRefPtr ctx = tmp->ThebesContext(); + return ctx.forget(); } /** diff --git a/layout/printing/nsPrintEngine.cpp b/layout/printing/nsPrintEngine.cpp index 8b9ea4b6438..62de2a512bd 100644 --- a/layout/printing/nsPrintEngine.cpp +++ b/layout/printing/nsPrintEngine.cpp @@ -3115,15 +3115,15 @@ nsPrintEngine::FindFocusedDOMWindow() nsCOMPtr rootWindow = window->GetPrivateRoot(); NS_ENSURE_TRUE(rootWindow, nullptr); - nsPIDOMWindow* focusedWindow; - nsFocusManager::GetFocusedDescendant(rootWindow, true, &focusedWindow); + nsCOMPtr focusedWindow; + nsFocusManager::GetFocusedDescendant(rootWindow, true, + getter_AddRefs(focusedWindow)); NS_ENSURE_TRUE(focusedWindow, nullptr); if (IsWindowsInOurSubTree(focusedWindow)) { - return focusedWindow; + return focusedWindow.forget(); } - NS_IF_RELEASE(focusedWindow); return nullptr; } diff --git a/layout/style/StyleRule.cpp b/layout/style/StyleRule.cpp index e17fda70774..349452bb081 100644 --- a/layout/style/StyleRule.cpp +++ b/layout/style/StyleRule.cpp @@ -1408,12 +1408,7 @@ StyleRule::GetExistingDOMRule() StyleRule::DeclarationChanged(Declaration* aDecl, bool aHandleContainer) { - StyleRule* clone = new StyleRule(*this, aDecl); - if (!clone) { - return nullptr; - } - - NS_ADDREF(clone); // for return + nsRefPtr clone = new StyleRule(*this, aDecl); if (aHandleContainer) { nsCSSStyleSheet* sheet = GetStyleSheet(); @@ -1428,7 +1423,7 @@ StyleRule::DeclarationChanged(Declaration* aDecl, } } - return clone; + return clone.forget(); } /* virtual */ void diff --git a/layout/style/nsCSSStyleSheet.cpp b/layout/style/nsCSSStyleSheet.cpp index 245e114fcaf..48ff6948433 100644 --- a/layout/style/nsCSSStyleSheet.cpp +++ b/layout/style/nsCSSStyleSheet.cpp @@ -1573,13 +1573,12 @@ nsCSSStyleSheet::Clone(nsCSSStyleSheet* aCloneParent, nsIDocument* aCloneDocument, nsINode* aCloneOwningNode) const { - nsCSSStyleSheet* clone = new nsCSSStyleSheet(*this, - aCloneParent, - aCloneOwnerRule, - aCloneDocument, - aCloneOwningNode); - NS_IF_ADDREF(clone); - return clone; + nsRefPtr clone = new nsCSSStyleSheet(*this, + aCloneParent, + aCloneOwnerRule, + aCloneDocument, + aCloneOwningNode); + return clone.forget(); } #ifdef DEBUG diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 0523fb56a7f..743fe87a059 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -316,8 +316,8 @@ nsComputedDOMStyle::GetStyleContextForElementNoFlush(Element* aElement, // for this element. if (!result->HasPseudoElementData()) { // this function returns an addrefed style context - result->AddRef(); - return result; + nsRefPtr ret = result; + return ret.forget(); } } } diff --git a/layout/style/nsHTMLStyleSheet.cpp b/layout/style/nsHTMLStyleSheet.cpp index c85c2b0be23..de610795b56 100644 --- a/layout/style/nsHTMLStyleSheet.cpp +++ b/layout/style/nsHTMLStyleSheet.cpp @@ -455,8 +455,8 @@ nsHTMLStyleSheet::UniqueMappedAttributes(nsMappedAttributes* aMapped) // We added a new entry to the hashtable, so we have a new unique set. entry->mAttributes = aMapped; } - NS_ADDREF(entry->mAttributes); // for caller - return entry->mAttributes; + nsRefPtr ret = entry->mAttributes; + return ret.forget(); } void diff --git a/layout/style/nsRuleNode.cpp b/layout/style/nsRuleNode.cpp index 5248c236e41..49e5ba220cd 100644 --- a/layout/style/nsRuleNode.cpp +++ b/layout/style/nsRuleNode.cpp @@ -3616,7 +3616,8 @@ nsRuleNode::GetShadowData(const nsCSSValueList* aList, NS_ABORT_IF_FALSE(arrayLength > 0, "Non-null text-shadow list, yet we counted 0 items."); - nsCSSShadowArray* shadowList = new(arrayLength) nsCSSShadowArray(arrayLength); + nsRefPtr shadowList = + new(arrayLength) nsCSSShadowArray(arrayLength); if (!shadowList) return nullptr; @@ -3682,8 +3683,7 @@ nsRuleNode::GetShadowData(const nsCSSValueList* aList, } } - NS_ADDREF(shadowList); - return shadowList; + return shadowList.forget(); } const void* diff --git a/layout/style/nsStyleContext.cpp b/layout/style/nsStyleContext.cpp index d44b800d3fb..fdf6b764620 100644 --- a/layout/style/nsStyleContext.cpp +++ b/layout/style/nsStyleContext.cpp @@ -156,7 +156,7 @@ nsStyleContext::FindChildWithRules(const nsIAtom* aPseudoTag, uint32_t threshold = 10; // The # of siblings we're willing to examine // before just giving this whole thing up. - nsStyleContext* result = nullptr; + nsRefPtr result; nsStyleContext *list = aRuleNode->IsRoot() ? mEmptyChild : mChild; if (list) { @@ -191,12 +191,9 @@ nsStyleContext::FindChildWithRules(const nsIAtom* aPseudoTag, RemoveChild(result); AddChild(result); } - - // Add reference for the caller. - result->AddRef(); } - return result; + return result.forget(); } const void* nsStyleContext::GetCachedStyleData(nsStyleStructID aSID) @@ -720,12 +717,11 @@ NS_NewStyleContext(nsStyleContext* aParentContext, nsRuleNode* aRuleNode, bool aSkipFlexItemStyleFixup) { - nsStyleContext* context = + nsRefPtr context = new (aRuleNode->PresContext()) nsStyleContext(aParentContext, aPseudoTag, aPseudoType, aRuleNode, aSkipFlexItemStyleFixup); - context->AddRef(); - return context; + return context.forget(); } static inline void diff --git a/layout/style/nsStyleSet.cpp b/layout/style/nsStyleSet.cpp index 0096750e4fe..be71e89d8a2 100644 --- a/layout/style/nsStyleSet.cpp +++ b/layout/style/nsStyleSet.cpp @@ -1664,8 +1664,8 @@ nsStyleSet::ReparentStyleContext(nsStyleContext* aStyleContext, // This short-circuit is OK because we don't call TryStartingTransition // during style reresolution if the style context pointer hasn't changed. if (aStyleContext->GetParent() == aNewParentContext) { - aStyleContext->AddRef(); - return aStyleContext; + nsRefPtr ret = aStyleContext; + return ret.forget(); } nsIAtom* pseudoTag = aStyleContext->GetPseudo(); diff --git a/layout/svg/nsSVGFilterInstance.cpp b/layout/svg/nsSVGFilterInstance.cpp index 99893266a2b..8850be57f19 100644 --- a/layout/svg/nsSVGFilterInstance.cpp +++ b/layout/svg/nsSVGFilterInstance.cpp @@ -76,9 +76,7 @@ nsSVGFilterInstance::CreateImage() surface->SetDeviceOffset(gfxPoint(-mSurfaceRect.x, -mSurfaceRect.y)); - gfxImageSurface *retval = nullptr; - surface.swap(retval); - return retval; + return surface.forget(); } gfxRect diff --git a/layout/svg/nsSVGGradientFrame.cpp b/layout/svg/nsSVGGradientFrame.cpp index 0177f192d80..be6fea879e9 100644 --- a/layout/svg/nsSVGGradientFrame.cpp +++ b/layout/svg/nsSVGGradientFrame.cpp @@ -523,9 +523,8 @@ nsSVGLinearGradientFrame::CreateGradient() x2 = GetLengthValue(dom::SVGLinearGradientElement::ATTR_X2); y2 = GetLengthValue(dom::SVGLinearGradientElement::ATTR_Y2); - gfxPattern *pattern = new gfxPattern(x1, y1, x2, y2); - NS_IF_ADDREF(pattern); - return pattern; + nsRefPtr pattern = new gfxPattern(x1, y1, x2, y2); + return pattern.forget(); } // ------------------------------------------------------------------------- @@ -672,9 +671,8 @@ nsSVGRadialGradientFrame::CreateGradient() } } - gfxPattern *pattern = new gfxPattern(fx, fy, 0, cx, cy, r); - NS_IF_ADDREF(pattern); - return pattern; + nsRefPtr pattern = new gfxPattern(fx, fy, 0, cx, cy, r); + return pattern.forget(); } // ------------------------------------------------------------------------- diff --git a/layout/svg/nsSVGMaskFrame.cpp b/layout/svg/nsSVGMaskFrame.cpp index a1238006a24..90c39f27a51 100644 --- a/layout/svg/nsSVGMaskFrame.cpp +++ b/layout/svg/nsSVGMaskFrame.cpp @@ -126,10 +126,9 @@ nsSVGMaskFrame::ComputeMaskAlpha(nsRenderingContext *aContext, nsSVGUtils::ComputeAlphaMask(data, stride, rect, aOpacity); } - gfxPattern *retval = new gfxPattern(image); + nsRefPtr retval = new gfxPattern(image); retval->SetMatrix(matrix); - NS_IF_ADDREF(retval); - return retval; + return retval.forget(); } /* virtual */ void diff --git a/layout/tools/layout-debug/src/nsLayoutDebuggingTools.cpp b/layout/tools/layout-debug/src/nsLayoutDebuggingTools.cpp index d8860030a6f..b9d4f6d093d 100644 --- a/layout/tools/layout-debug/src/nsLayoutDebuggingTools.cpp +++ b/layout/tools/layout-debug/src/nsLayoutDebuggingTools.cpp @@ -37,9 +37,9 @@ doc_viewer(nsIDocShell *aDocShell) { if (!aDocShell) return nullptr; - nsIContentViewer *result = nullptr; - aDocShell->GetContentViewer(&result); - return result; + nsCOMPtr result; + aDocShell->GetContentViewer(getter_AddRefs(result)); + return result.forget(); } static already_AddRefed @@ -73,9 +73,8 @@ document(nsIDocShell *aDocShell) cv->GetDOMDocument(getter_AddRefs(domDoc)); if (!domDoc) return nullptr; - nsIDocument *result = nullptr; - CallQueryInterface(domDoc, &result); - return result; + nsCOMPtr result = do_QueryInterface(domDoc); + return result.forget(); } #endif diff --git a/layout/xul/base/src/nsListBoxLayout.cpp b/layout/xul/base/src/nsListBoxLayout.cpp index 7da88cbdd45..029e4754b47 100644 --- a/layout/xul/base/src/nsListBoxLayout.cpp +++ b/layout/xul/base/src/nsListBoxLayout.cpp @@ -207,7 +207,6 @@ nsListBoxLayout::LayoutInternal(nsIFrame* aBox, nsBoxLayoutState& aState) already_AddRefed NS_NewListBoxLayout() { - nsBoxLayout* layout = new nsListBoxLayout(); - NS_IF_ADDREF(layout); - return layout; + nsRefPtr layout = new nsListBoxLayout(); + return layout.forget(); } diff --git a/layout/xul/base/src/nsSliderFrame.cpp b/layout/xul/base/src/nsSliderFrame.cpp index b638cf3378c..743000907e8 100644 --- a/layout/xul/base/src/nsSliderFrame.cpp +++ b/layout/xul/base/src/nsSliderFrame.cpp @@ -49,9 +49,8 @@ int32_t nsSliderFrame::gSnapMultiplier; static already_AddRefed GetContentOfBox(nsIFrame *aBox) { - nsIContent* content = aBox->GetContent(); - NS_IF_ADDREF(content); - return content; + nsCOMPtr content = aBox->GetContent(); + return content.forget(); } nsIFrame* diff --git a/layout/xul/grid/nsGridRowGroupLayout.cpp b/layout/xul/grid/nsGridRowGroupLayout.cpp index cb2ce13f925..dfbc494788b 100644 --- a/layout/xul/grid/nsGridRowGroupLayout.cpp +++ b/layout/xul/grid/nsGridRowGroupLayout.cpp @@ -25,9 +25,8 @@ already_AddRefed NS_NewGridRowGroupLayout() { - nsBoxLayout* layout = new nsGridRowGroupLayout(); - NS_IF_ADDREF(layout); - return layout; + nsRefPtr layout = new nsGridRowGroupLayout(); + return layout.forget(); } nsGridRowGroupLayout::nsGridRowGroupLayout():nsGridRowLayout(), mRowCount(0) diff --git a/layout/xul/grid/nsGridRowLeafLayout.cpp b/layout/xul/grid/nsGridRowLeafLayout.cpp index 01dcc1c0285..94ca4b651a5 100644 --- a/layout/xul/grid/nsGridRowLeafLayout.cpp +++ b/layout/xul/grid/nsGridRowLeafLayout.cpp @@ -22,9 +22,8 @@ already_AddRefed NS_NewGridRowLeafLayout() { - nsBoxLayout* layout = new nsGridRowLeafLayout(); - NS_IF_ADDREF(layout); - return layout; + nsRefPtr layout = new nsGridRowLeafLayout(); + return layout.forget(); } nsGridRowLeafLayout::nsGridRowLeafLayout():nsGridRowLayout() diff --git a/layout/xul/tree/nsTreeBodyFrame.h b/layout/xul/tree/nsTreeBodyFrame.h index 52f13a57356..4acc5cb78a2 100644 --- a/layout/xul/tree/nsTreeBodyFrame.h +++ b/layout/xul/tree/nsTreeBodyFrame.h @@ -402,9 +402,8 @@ public: if (!aUnknownCol) return nullptr; - nsTreeColumn* col; - aUnknownCol->QueryInterface(NS_GET_IID(nsTreeColumn), (void**)&col); - return col; + nsCOMPtr col = do_QueryInterface(aUnknownCol); + return col.forget(); } /** diff --git a/media/webrtc/signaling/test/FakeMediaStreams.h b/media/webrtc/signaling/test/FakeMediaStreams.h index 69c25033158..8f1ed8b6292 100644 --- a/media/webrtc/signaling/test/FakeMediaStreams.h +++ b/media/webrtc/signaling/test/FakeMediaStreams.h @@ -198,11 +198,10 @@ public: CreateSourceStream(nsIDOMWindow* aWindow, uint32_t aHintContents) { Fake_SourceMediaStream *source = new Fake_SourceMediaStream(); - Fake_DOMMediaStream *ds = new Fake_DOMMediaStream(source); + nsRefPtr ds = new Fake_DOMMediaStream(source); ds->SetHintContents(aHintContents); - ds->AddRef(); - return ds; + return ds.forget(); } Fake_MediaStream *GetStream() { return mMediaStream; } diff --git a/netwerk/base/public/nsNetUtil.h b/netwerk/base/public/nsNetUtil.h index 3567a08f4b7..b51fda15986 100644 --- a/netwerk/base/public/nsNetUtil.h +++ b/netwerk/base/public/nsNetUtil.h @@ -1089,8 +1089,8 @@ NS_BufferOutputStream(nsIOutputStream *aOutputStream, if (NS_SUCCEEDED(rv)) return bos.forget(); - NS_ADDREF(aOutputStream); - return aOutputStream; + bos = aOutputStream; + return bos.forget(); } // returns an input stream compatible with nsIUploadChannel::SetUploadStream() @@ -1626,21 +1626,21 @@ NS_TryToMakeImmutable(nsIURI* uri, nsresult rv; nsCOMPtr util = do_GetNetUtil(&rv); - nsIURI* result = nullptr; + nsCOMPtr result; if (NS_SUCCEEDED(rv)) { NS_ASSERTION(util, "do_GetNetUtil lied"); - rv = util->ToImmutableURI(uri, &result); + rv = util->ToImmutableURI(uri, getter_AddRefs(result)); } if (NS_FAILED(rv)) { - NS_IF_ADDREF(result = uri); + result = uri; } if (outRv) { *outRv = rv; } - return result; + return result.forget(); } /** @@ -1664,22 +1664,23 @@ NS_URIChainHasFlags(nsIURI *uri, * value could be just the object passed in if it's not a nested URI. */ inline already_AddRefed -NS_GetInnermostURI(nsIURI *uri) +NS_GetInnermostURI(nsIURI* aURI) { - NS_PRECONDITION(uri, "Must have URI"); + NS_PRECONDITION(aURI, "Must have URI"); + + nsCOMPtr uri = aURI; nsCOMPtr nestedURI(do_QueryInterface(uri)); if (!nestedURI) { - NS_ADDREF(uri); - return uri; + return uri.forget(); } - nsresult rv = nestedURI->GetInnermostURI(&uri); + nsresult rv = nestedURI->GetInnermostURI(getter_AddRefs(uri)); if (NS_FAILED(rv)) { return nullptr; } - return uri; + return uri.forget(); } /** diff --git a/netwerk/base/src/nsSocketTransportService2.cpp b/netwerk/base/src/nsSocketTransportService2.cpp index fc4dad2d035..e73892f1902 100644 --- a/netwerk/base/src/nsSocketTransportService2.cpp +++ b/netwerk/base/src/nsSocketTransportService2.cpp @@ -101,9 +101,8 @@ already_AddRefed nsSocketTransportService::GetThreadSafely() { MutexAutoLock lock(mLock); - nsIThread* result = mThread; - NS_IF_ADDREF(result); - return result; + nsCOMPtr result = mThread; + return result.forget(); } NS_IMETHODIMP diff --git a/parser/html/nsHtml5Module.cpp b/parser/html/nsHtml5Module.cpp index 64b1072c1e5..f7c97509759 100644 --- a/parser/html/nsHtml5Module.cpp +++ b/parser/html/nsHtml5Module.cpp @@ -72,9 +72,8 @@ already_AddRefed nsHtml5Module::NewHtml5Parser() { NS_ABORT_IF_FALSE(sNsHtml5ModuleInitialized, "nsHtml5Module not initialized."); - nsIParser* rv = static_cast (new nsHtml5Parser()); - NS_ADDREF(rv); - return rv; + nsCOMPtr rv = new nsHtml5Parser(); + return rv.forget(); } // static diff --git a/rdf/base/src/nsRDFXMLSerializer.cpp b/rdf/base/src/nsRDFXMLSerializer.cpp index d528889d995..24b7cb4e082 100644 --- a/rdf/base/src/nsRDFXMLSerializer.cpp +++ b/rdf/base/src/nsRDFXMLSerializer.cpp @@ -200,9 +200,7 @@ nsRDFXMLSerializer::EnsureNewPrefix() ++iter; } } while (!isNewPrefix); - nsIAtom* outPrefix = nullptr; - prefix.swap(outPrefix); - return outPrefix; + return prefix.forget(); } // This converts a property resource (like diff --git a/security/manager/boot/src/nsSecureBrowserUIImpl.cpp b/security/manager/boot/src/nsSecureBrowserUIImpl.cpp index f679eb57a8c..7b9e5d2061c 100644 --- a/security/manager/boot/src/nsSecureBrowserUIImpl.cpp +++ b/security/manager/boot/src/nsSecureBrowserUIImpl.cpp @@ -245,18 +245,18 @@ nsSecureBrowserUIImpl::GetState(uint32_t* aState) already_AddRefed nsSecureBrowserUIImpl::ExtractSecurityInfo(nsIRequest* aRequest) { - nsISupports *retval = nullptr; + nsCOMPtr retval; nsCOMPtr channel(do_QueryInterface(aRequest)); if (channel) - channel->GetSecurityInfo(&retval); + channel->GetSecurityInfo(getter_AddRefs(retval)); if (!retval) { nsCOMPtr provider(do_QueryInterface(aRequest)); if (provider) - provider->GetSecurityInfo(&retval); + provider->GetSecurityInfo(getter_AddRefs(retval)); } - return retval; + return retval.forget(); } nsresult diff --git a/security/manager/ssl/src/nsCertTree.cpp b/security/manager/ssl/src/nsCertTree.cpp index c4bca1cc3c4..98a88c3c3a6 100644 --- a/security/manager/ssl/src/nsCertTree.cpp +++ b/security/manager/ssl/src/nsCertTree.cpp @@ -284,14 +284,13 @@ nsCertTree::GetCertAtIndex(int32_t index, int32_t *outAbsoluteCertOffset) if (!certdi) return nullptr; - nsIX509Cert *rawPtr = nullptr; + nsCOMPtr ret; if (certdi->mCert) { - rawPtr = certdi->mCert; + ret = certdi->mCert; } else if (certdi->mAddonInfo) { - rawPtr = certdi->mAddonInfo->mCert; + ret = certdi->mAddonInfo->mCert; } - NS_IF_ADDREF(rawPtr); - return rawPtr; + return ret.forget(); } // If the row at index is a cert, return that cert. Otherwise, return null. diff --git a/toolkit/components/places/tests/cpp/places_test_harness.h b/toolkit/components/places/tests/cpp/places_test_harness.h index d1336504b94..6b3ef744cc2 100644 --- a/toolkit/components/places/tests/cpp/places_test_harness.h +++ b/toolkit/components/places/tests/cpp/places_test_harness.h @@ -240,10 +240,10 @@ do_get_db() nsCOMPtr database = do_QueryInterface(history); do_check_true(database); - mozIStorageConnection* dbConn; - nsresult rv = database->GetDBConnection(&dbConn); + nsCOMPtr dbConn; + nsresult rv = database->GetDBConnection(getter_AddRefs(dbConn)); do_check_success(rv); - return dbConn; + return dbConn.forget(); } /** diff --git a/toolkit/components/telemetry/Telemetry.cpp b/toolkit/components/telemetry/Telemetry.cpp index ad66e0a3b7f..9a3921ae198 100644 --- a/toolkit/components/telemetry/Telemetry.cpp +++ b/toolkit/components/telemetry/Telemetry.cpp @@ -1863,8 +1863,8 @@ TelemetryImpl::CreateTelemetryInstance() // AddRef for the local reference NS_ADDREF(sTelemetry); // AddRef for the caller - NS_ADDREF(sTelemetry); - return sTelemetry; + nsCOMPtr ret = sTelemetry; + return ret.forget(); } void diff --git a/toolkit/components/typeaheadfind/nsTypeAheadFind.cpp b/toolkit/components/typeaheadfind/nsTypeAheadFind.cpp index ad31c4cbbb7..4cd4a23bdeb 100644 --- a/toolkit/components/typeaheadfind/nsTypeAheadFind.cpp +++ b/toolkit/components/typeaheadfind/nsTypeAheadFind.cpp @@ -1219,14 +1219,13 @@ nsTypeAheadFind::GetPresShell() if (!mPresShell) return nullptr; - nsIPresShell *shell = nullptr; - CallQueryReferent(mPresShell.get(), &shell); + nsCOMPtr shell = do_QueryReferent(mPresShell); if (shell) { nsPresContext *pc = shell->GetPresContext(); if (!pc || !nsCOMPtr(pc->GetContainer())) { - NS_RELEASE(shell); + return nullptr; } } - return shell; + return shell.forget(); } diff --git a/toolkit/system/dbus/nsDBusService.cpp b/toolkit/system/dbus/nsDBusService.cpp index 149611b90be..e5015e761b7 100644 --- a/toolkit/system/dbus/nsDBusService.cpp +++ b/toolkit/system/dbus/nsDBusService.cpp @@ -7,6 +7,7 @@ #include "nsDBusService.h" #include "nsComponentManagerUtils.h" +#include "nsAutoPtr.h" #include #include @@ -36,8 +37,8 @@ nsDBusService::Get() { if (!gSingleton) { gSingleton = new nsDBusService(); } - NS_IF_ADDREF(gSingleton); - return gSingleton; + nsRefPtr ret = gSingleton; + return ret.forget(); } nsresult diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index c6cf1cb6866..c6eb8171119 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -292,7 +292,7 @@ static already_AddRefed GetFileFromEnv(const char *name) { nsresult rv; - nsIFile *file = nullptr; + nsCOMPtr file; #ifdef XP_WIN WCHAR path[_MAX_PATH]; @@ -300,21 +300,22 @@ GetFileFromEnv(const char *name) path, _MAX_PATH)) return nullptr; - rv = NS_NewLocalFile(nsDependentString(path), true, &file); + rv = NS_NewLocalFile(nsDependentString(path), true, getter_AddRefs(file)); if (NS_FAILED(rv)) return nullptr; - return file; + return file.forget(); #else const char *arg = PR_GetEnv(name); if (!arg || !*arg) return nullptr; - rv = NS_NewNativeLocalFile(nsDependentCString(arg), true, &file); + rv = NS_NewNativeLocalFile(nsDependentCString(arg), true, + getter_AddRefs(file)); if (NS_FAILED(rv)) return nullptr; - return file; + return file.forget(); #endif } diff --git a/uriloader/base/nsDocLoader.cpp b/uriloader/base/nsDocLoader.cpp index 837a9cf6425..bd1dfcb258c 100644 --- a/uriloader/base/nsDocLoader.cpp +++ b/uriloader/base/nsDocLoader.cpp @@ -235,13 +235,8 @@ NS_IMETHODIMP nsDocLoader::GetInterface(const nsIID& aIID, void** aSink) already_AddRefed nsDocLoader::GetAsDocLoader(nsISupports* aSupports) { - if (!aSupports) { - return nullptr; - } - - nsDocLoader* ptr; - CallQueryInterface(aSupports, &ptr); - return ptr; + nsRefPtr ret = do_QueryObject(aSupports); + return ret.forget(); } /* static */ diff --git a/uriloader/exthandler/unix/nsGNOMERegistry.cpp b/uriloader/exthandler/unix/nsGNOMERegistry.cpp index 90e83c2ec2d..dfe76585328 100644 --- a/uriloader/exthandler/unix/nsGNOMERegistry.cpp +++ b/uriloader/exthandler/unix/nsGNOMERegistry.cpp @@ -186,7 +186,5 @@ nsGNOMERegistry::GetFromType(const nsACString& aMIMEType) mimeInfo->SetPreferredAction(nsIMIMEInfo::useSystemDefault); mimeInfo->SetDescription(NS_ConvertUTF8toUTF16(description)); - nsMIMEInfoBase* retval; - NS_ADDREF((retval = mimeInfo)); - return retval; + return mimeInfo.forget(); } diff --git a/uriloader/exthandler/unix/nsOSHelperAppService.cpp b/uriloader/exthandler/unix/nsOSHelperAppService.cpp index b03b2f58f36..3c41c780090 100644 --- a/uriloader/exthandler/unix/nsOSHelperAppService.cpp +++ b/uriloader/exthandler/unix/nsOSHelperAppService.cpp @@ -1270,10 +1270,11 @@ nsOSHelperAppService::GetFromExtension(const nsCString& aFileExt) { #ifdef MOZ_WIDGET_GTK2 LOG(("Looking in GNOME registry\n")); - nsMIMEInfoBase *gnomeInfo = nsGNOMERegistry::GetFromExtension(aFileExt).get(); + nsRefPtr gnomeInfo = + nsGNOMERegistry::GetFromExtension(aFileExt); if (gnomeInfo) { LOG(("Got MIMEInfo from GNOME registry\n")); - return gnomeInfo; + return gnomeInfo.forget(); } #endif @@ -1301,10 +1302,7 @@ nsOSHelperAppService::GetFromExtension(const nsCString& aFileExt) { } nsAutoCString mimeType(asciiMajorType + NS_LITERAL_CSTRING("/") + asciiMinorType); - nsMIMEInfoUnix* mimeInfo = new nsMIMEInfoUnix(mimeType); - if (!mimeInfo) - return nullptr; - NS_ADDREF(mimeInfo); + nsRefPtr mimeInfo = new nsMIMEInfoUnix(mimeType); mimeInfo->AppendExtension(aFileExt); nsHashtable typeOptions; // empty hash table @@ -1342,7 +1340,7 @@ nsOSHelperAppService::GetFromExtension(const nsCString& aFileExt) { mimeInfo->SetPreferredAction(nsIMIMEInfo::saveToDisk); } - return mimeInfo; + return mimeInfo.forget(); } already_AddRefed @@ -1389,17 +1387,17 @@ nsOSHelperAppService::GetFromType(const nsCString& aMIMEType) { NS_LossyConvertUTF16toASCII(mailcap_description).get())); #ifdef MOZ_WIDGET_GTK2 - nsMIMEInfoBase *gnomeInfo = nullptr; + nsRefPtr gnomeInfo; if (handler.IsEmpty()) { // No useful data yet. Check the GNOME registry. Unfortunately, newer // GNOME versions no longer have type-to-extension mappings, so we might // get back a MIMEInfo without any extensions set. In that case we'll have // to look in our mime.types files for the extensions. LOG(("Looking in GNOME registry\n")); - gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType).get(); + gnomeInfo = nsGNOMERegistry::GetFromType(aMIMEType); if (gnomeInfo && gnomeInfo->HasExtensions()) { LOG(("Got MIMEInfo from GNOME registry, and it has extensions set\n")); - return gnomeInfo; + return gnomeInfo.forget(); } } #endif @@ -1418,7 +1416,7 @@ nsOSHelperAppService::GetFromType(const nsCString& aMIMEType) { NS_ASSERTION(!gnomeInfo->HasExtensions(), "How'd that happen?"); gnomeInfo->SetFileExtensions(NS_ConvertUTF16toUTF8(extensions)); - return gnomeInfo; + return gnomeInfo.forget(); } #endif @@ -1466,10 +1464,7 @@ nsOSHelperAppService::GetFromType(const nsCString& aMIMEType) { return nullptr; } - nsMIMEInfoUnix* mimeInfo = new nsMIMEInfoUnix(aMIMEType); - if (!mimeInfo) - return nullptr; - NS_ADDREF(mimeInfo); + nsRefPtr mimeInfo = new nsMIMEInfoUnix(aMIMEType); mimeInfo->SetFileExtensions(NS_ConvertUTF16toUTF8(extensions)); if (! mime_types_description.IsEmpty()) { @@ -1492,7 +1487,7 @@ nsOSHelperAppService::GetFromType(const nsCString& aMIMEType) { mimeInfo->SetPreferredAction(nsIMIMEInfo::saveToDisk); } - return mimeInfo; + return mimeInfo.forget(); } @@ -1501,7 +1496,7 @@ nsOSHelperAppService::GetMIMEInfoFromOS(const nsACString& aType, const nsACString& aFileExt, bool *aFound) { *aFound = true; - nsMIMEInfoBase* retval = GetFromType(PromiseFlatCString(aType)).get(); + nsRefPtr retval = GetFromType(PromiseFlatCString(aType)); bool hasDefault = false; if (retval) retval->GetHasDefaultHandler(&hasDefault); @@ -1509,7 +1504,7 @@ nsOSHelperAppService::GetMIMEInfoFromOS(const nsACString& aType, nsRefPtr miByExt = GetFromExtension(PromiseFlatCString(aFileExt)); // If we had no extension match, but a type match, use that if (!miByExt && retval) - return retval; + return retval.forget(); // If we had an extension match but no type match, set the mimetype and use // it if (!retval && miByExt) { @@ -1517,19 +1512,18 @@ nsOSHelperAppService::GetMIMEInfoFromOS(const nsACString& aType, miByExt->SetMIMEType(aType); miByExt.swap(retval); - return retval; + return retval.forget(); } // If we got nothing, make a new mimeinfo if (!retval) { *aFound = false; retval = new nsMIMEInfoUnix(aType); if (retval) { - NS_ADDREF(retval); if (!aFileExt.IsEmpty()) retval->AppendExtension(aFileExt); } - return retval; + return retval.forget(); } // Copy the attributes of retval (mimeinfo from type) onto miByExt, to @@ -1542,7 +1536,7 @@ nsOSHelperAppService::GetMIMEInfoFromOS(const nsACString& aType, miByExt.swap(retval); } - return retval; + return retval.forget(); } NS_IMETHODIMP diff --git a/widget/gtk2/nsWindow.cpp b/widget/gtk2/nsWindow.cpp index 2e19a7461de..f4ebc20983c 100644 --- a/widget/gtk2/nsWindow.cpp +++ b/widget/gtk2/nsWindow.cpp @@ -5940,7 +5940,7 @@ nsWindow::GetSurfaceForGdkDrawable(GdkDrawable* aDrawable, Display* xDisplay = DisplayOfScreen(xScreen); Drawable xDrawable = gdk_x11_drawable_get_xid(aDrawable); - gfxASurface* result = nullptr; + nsRefPtr result; if (visual) { Visual* xVisual = gdk_x11_visual_get_xvisual(visual); @@ -5967,8 +5967,7 @@ nsWindow::GetSurfaceForGdkDrawable(GdkDrawable* aDrawable, gfxIntSize(aSize.width, aSize.height)); } - NS_IF_ADDREF(result); - return result; + return result.forget(); } #endif diff --git a/xpcom/base/nsAutoPtr.h b/xpcom/base/nsAutoPtr.h index c349d29a5ef..e33eaebe227 100644 --- a/xpcom/base/nsAutoPtr.h +++ b/xpcom/base/nsAutoPtr.h @@ -983,7 +983,7 @@ class nsRefPtr { T* temp = 0; swap(temp); - return temp; + return already_AddRefed(temp); } template diff --git a/xpcom/build/Services.cpp b/xpcom/build/Services.cpp index dd57a6b521c..16d3e848a2b 100644 --- a/xpcom/build/Services.cpp +++ b/xpcom/build/Services.cpp @@ -38,8 +38,8 @@ using namespace mozilla::services; nsCOMPtr os = do_GetService(CONTRACT_ID); \ g##NAME = os.forget().get(); \ } \ - NS_IF_ADDREF(g##NAME); \ - return g##NAME; \ + nsRefPtr ret = g##NAME; \ + return ret.forget(); \ } \ NS_EXPORT_(already_AddRefed) \ mozilla::services::_external_Get##NAME() \ diff --git a/xpcom/build/nsXPComInit.cpp b/xpcom/build/nsXPComInit.cpp index 62a10d57401..1576aa39cd1 100644 --- a/xpcom/build/nsXPComInit.cpp +++ b/xpcom/build/nsXPComInit.cpp @@ -257,16 +257,16 @@ static already_AddRefed CreateINIParserFactory(const mozilla::Module& module, const mozilla::Module::CIDEntry& entry) { - nsIFactory* f = new nsINIParserFactory(); - f->AddRef(); - return f; + nsCOMPtr f = new nsINIParserFactory(); + return f.forget(); } static already_AddRefed CreateUnicharStreamFactory(const mozilla::Module& module, const mozilla::Module::CIDEntry& entry) { - return nsSimpleUnicharStreamFactory::GetInstance(); + return already_AddRefed( + nsSimpleUnicharStreamFactory::GetInstance()); } #define COMPONENT(NAME, Ctor) static NS_DEFINE_CID(kNS_##NAME##_CID, NS_##NAME##_CID); diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp index b2d7d6d8077..64b47687f22 100644 --- a/xpcom/components/nsComponentManager.cpp +++ b/xpcom/components/nsComponentManager.cpp @@ -1797,9 +1797,8 @@ nsFactoryEntry::GetFactory() factory.swap(mFactory); } } - nsIFactory* factory = mFactory; - factory->AddRef(); - return factory; + nsCOMPtr factory = mFactory; + return factory.forget(); } size_t diff --git a/xpcom/glue/nsCOMPtr.h b/xpcom/glue/nsCOMPtr.h index f6a10d15aca..29b486d5648 100644 --- a/xpcom/glue/nsCOMPtr.h +++ b/xpcom/glue/nsCOMPtr.h @@ -173,7 +173,7 @@ struct already_AddRefed { U* tmp = mRawPtr; mRawPtr = NULL; - return tmp; + return already_AddRefed(tmp); } /** @@ -781,7 +781,7 @@ class nsCOMPtr MOZ_FINAL { T* temp = 0; swap(temp); - return temp; + return already_AddRefed(temp); } template @@ -1088,7 +1088,7 @@ class nsCOMPtr { nsISupports* temp = 0; swap(temp); - return temp; + return already_AddRefed(temp); } void diff --git a/xpcom/glue/nsIWeakReferenceUtils.h b/xpcom/glue/nsIWeakReferenceUtils.h index a54704380c2..5da00862148 100644 --- a/xpcom/glue/nsIWeakReferenceUtils.h +++ b/xpcom/glue/nsIWeakReferenceUtils.h @@ -76,7 +76,7 @@ inline already_AddRefed do_GetWeakReference( nsISupports* aRawPtr, nsresult* error = 0 ) { - return NS_GetWeakReference(aRawPtr, error); + return dont_AddRef(NS_GetWeakReference(aRawPtr, error)); } inline diff --git a/xpcom/tests/TestRacingServiceManager.cpp b/xpcom/tests/TestRacingServiceManager.cpp index 86dc084af21..67562d9de07 100644 --- a/xpcom/tests/TestRacingServiceManager.cpp +++ b/xpcom/tests/TestRacingServiceManager.cpp @@ -225,8 +225,8 @@ CreateFactory(const mozilla::Module& module, const mozilla::Module::CIDEntry& en gFactory = new Factory(); NS_ADDREF(gFactory); } - NS_ADDREF(gFactory); - return gFactory; + nsCOMPtr ret = gFactory; + return ret.forget(); } static const mozilla::Module::CIDEntry kLocalCIDs[] = { From adb8ad49b00cd68900974337c92a196c83d6addd Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Fri, 26 Apr 2013 12:41:29 +0100 Subject: [PATCH 100/155] bug 864107 - constrain restored window dimensions to available screen area. r=ttaubert --- .../sessionstore/src/SessionStore.jsm | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/browser/components/sessionstore/src/SessionStore.jsm b/browser/components/sessionstore/src/SessionStore.jsm index 793ab128607..1257cf274fb 100644 --- a/browser/components/sessionstore/src/SessionStore.jsm +++ b/browser/components/sessionstore/src/SessionStore.jsm @@ -83,6 +83,8 @@ Cu.import("resource://gre/modules/commonjs/sdk/core/promise.js", this); XPCOMUtils.defineLazyServiceGetter(this, "gSessionStartup", "@mozilla.org/browser/sessionstartup;1", "nsISessionStartup"); +XPCOMUtils.defineLazyServiceGetter(this, "gScreenManager", + "@mozilla.org/gfx/screenmanager;1", "nsIScreenManager"); // List of docShell capabilities to (re)store. These are automatically // retrieved from a given docShell if not already collected before. @@ -3579,6 +3581,31 @@ let SessionStoreInternal = { var _this = this; function win_(aName) { return _this._getWindowDimension(win, aName); } + // find available space on the screen where this window is being placed + let screen = gScreenManager.screenForRect(aLeft, aTop, aWidth, aHeight); + if (screen) { + let screenLeft = {}, screenTop = {}, screenWidth = {}, screenHeight = {}; + screen.GetAvailRectDisplayPix(screenLeft, screenTop, screenWidth, screenHeight); + // constrain the dimensions to the actual space available + if (aWidth > screenWidth.value) { + aWidth = screenWidth.value; + } + if (aHeight > screenHeight.value) { + aHeight = screenHeight.value; + } + // and then pull the window within the screen's bounds + if (aLeft < screenLeft.value) { + aLeft = screenLeft.value; + } else if (aLeft + aWidth > screenLeft.value + screenWidth.value) { + aLeft = screenLeft.value + screenWidth.value - aWidth; + } + if (aTop < screenTop.value) { + aTop = screenTop.value; + } else if (aTop + aHeight > screenTop.value + screenHeight.value) { + aTop = screenTop.value + screenHeight.value - aHeight; + } + } + // only modify those aspects which aren't correct yet if (aWidth && aHeight && (aWidth != win_("width") || aHeight != win_("height"))) { aWindow.resizeTo(aWidth, aHeight); From b325be5d235ee39c6616e1d40a52e977065af0c2 Mon Sep 17 00:00:00 2001 From: Gene Lian Date: Fri, 26 Apr 2013 16:02:51 +0800 Subject: [PATCH 101/155] Bug 865992 - B2G MMS: the read count is wrong after updating the thread containing notification indication. r=vicamo a=leo+ --- .../src/ril/MobileMessageDatabaseService.js | 34 +++++++++++-------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/dom/mobilemessage/src/ril/MobileMessageDatabaseService.js b/dom/mobilemessage/src/ril/MobileMessageDatabaseService.js index 86358b5e5a1..36629b21c6e 100644 --- a/dom/mobilemessage/src/ril/MobileMessageDatabaseService.js +++ b/dom/mobilemessage/src/ril/MobileMessageDatabaseService.js @@ -855,13 +855,10 @@ MobileMessageDatabaseService.prototype = { saveRecord: function saveRecord(aMessageRecord, aAddresses, aCallback) { let isOverriding = (aMessageRecord.id !== undefined); - let oldThreadId = 0; if (!isOverriding) { // Assign a new id. this.lastMessageId += 1; aMessageRecord.id = this.lastMessageId; - } else { - oldThreadId = aMessageRecord.threadId; } if (DEBUG) debug("Going to store " + JSON.stringify(aMessageRecord)); @@ -910,19 +907,28 @@ MobileMessageDatabaseService.prototype = { for each (let id in participantIds) { aMessageRecord.participantIdsIndex.push([id, timestamp]); } - // Really add to message store. - messageStore.put(aMessageRecord); - // If the overriding message is going to be saved into another - // thread which is different from the original one containing the - // overrided message, we need to update the original thread info. - if (isOverriding && threadId != oldThreadId) { - self.updateThreadByMessageChange(messageStore, - threadStore, - oldThreadId, - aMessageRecord.id, - aMessageRecord.read); + if (!isOverriding) { + // Really add to message store. + messageStore.put(aMessageRecord); + return; } + + // If we're going to override an old message, we need to update the + // info of the original thread containing the overridden message. + // To get the original thread ID and read status of the overridden + // message record, we need to retrieve it before overriding it. + messageStore.get(aMessageRecord.id).onsuccess = function(event) { + let oldMessageRecord = event.target.result; + messageStore.put(aMessageRecord); + if (oldMessageRecord) { + self.updateThreadByMessageChange(messageStore, + threadStore, + oldMessageRecord.threadId, + aMessageRecord.id, + oldMessageRecord.read); + } + }; }; let timestamp = aMessageRecord.timestamp; From 42c9f9c6866b55efdf11b04be6637f95d69384e7 Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Fri, 26 Apr 2013 14:05:08 +0200 Subject: [PATCH 102/155] Bug 863018 part 1 - Fix regalloc issue with useFixed/tempFixed and safepoints. r=bhackett --- js/src/ion/LiveRangeAllocator.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/js/src/ion/LiveRangeAllocator.cpp b/js/src/ion/LiveRangeAllocator.cpp index 154c2767204..91cbb6dca63 100644 --- a/js/src/ion/LiveRangeAllocator.cpp +++ b/js/src/ion/LiveRangeAllocator.cpp @@ -462,6 +462,19 @@ LiveRangeAllocator::init() return true; } +static void +AddRegisterToSafepoint(LSafepoint *safepoint, AnyRegister reg, const LDefinition &def) +{ + safepoint->addLiveRegister(reg); + + JS_ASSERT(def.type() == LDefinition::GENERAL || + def.type() == LDefinition::DOUBLE || + def.type() == LDefinition::OBJECT); + + if (def.type() == LDefinition::OBJECT) + safepoint->addGcRegister(reg.gpr()); +} + /* * This function builds up liveness intervals for all virtual registers * defined in the function. Additionally, it populates the liveIn array with @@ -618,6 +631,11 @@ LiveRangeAllocator::buildLivenessInfo() AnyRegister reg = temp->output()->toRegister(); if (!addFixedRangeAtHead(reg, inputOf(*ins), outputOf(*ins))) return false; + + // Fixed intervals are not added to safepoints, so do it + // here. + if (LSafepoint *safepoint = ins->safepoint()) + AddRegisterToSafepoint(safepoint, reg, *temp); } else { JS_ASSERT(!ins->isCall()); if (!vregs[temp].getInterval(0)->addRangeAtHead(inputOf(*ins), outputOf(*ins))) @@ -680,6 +698,12 @@ LiveRangeAllocator::buildLivenessInfo() if (!addFixedRangeAtHead(reg, inputOf(*ins), outputOf(*ins))) return false; to = inputOf(*ins); + + // Fixed intervals are not added to safepoints, so do it + // here. + LSafepoint *safepoint = ins->safepoint(); + if (!ins->isCall() && safepoint) + AddRegisterToSafepoint(safepoint, reg, *vregs[use].def()); } else { to = use->usedAtStart() ? inputOf(*ins) : outputOf(*ins); } From 80c213b18fac4bc389e10e356863ad8012d7b678 Mon Sep 17 00:00:00 2001 From: Jan de Mooij Date: Fri, 26 Apr 2013 14:08:54 +0200 Subject: [PATCH 103/155] Bug 863018 part 2 - Add JSShortString path back to ConcatStrings and LConcat. r=luke --- js/src/ion/CodeGenerator.cpp | 134 +++++++++++++++--- js/src/ion/Ion.cpp | 16 ++- js/src/ion/IonCompartment.h | 11 ++ js/src/ion/IonMacroAssembler.cpp | 6 + js/src/ion/IonMacroAssembler.h | 1 + js/src/ion/LIR-Common.h | 21 ++- js/src/ion/Lowering.cpp | 9 +- js/src/ion/arm/Assembler-arm.h | 2 +- js/src/ion/arm/MacroAssembler-arm.h | 3 + js/src/ion/x64/Assembler-x64.h | 14 ++ js/src/ion/x64/MacroAssembler-x64.h | 4 + js/src/ion/x86/Assembler-x86.h | 1 + js/src/ion/x86/MacroAssembler-x86.h | 4 + .../jit-test/tests/ion/string-concat-short.js | 13 ++ js/src/vm/String.cpp | 18 +++ js/src/vm/String.h | 4 + 16 files changed, 233 insertions(+), 28 deletions(-) create mode 100644 js/src/jit-test/tests/ion/string-concat-short.js diff --git a/js/src/ion/CodeGenerator.cpp b/js/src/ion/CodeGenerator.cpp index 42c2b40051a..510a13857e8 100644 --- a/js/src/ion/CodeGenerator.cpp +++ b/js/src/ion/CodeGenerator.cpp @@ -3548,52 +3548,152 @@ CodeGenerator::visitConcat(LConcat *lir) Register rhs = ToRegister(lir->rhs()); Register output = ToRegister(lir->output()); - Register temp = ToRegister(lir->temp()); + + JS_ASSERT(lhs == CallTempReg0); + JS_ASSERT(rhs == CallTempReg1); + JS_ASSERT(ToRegister(lir->temp1()) == CallTempReg2); + JS_ASSERT(ToRegister(lir->temp2()) == CallTempReg3); + JS_ASSERT(ToRegister(lir->temp3()) == CallTempReg4); + JS_ASSERT(ToRegister(lir->temp4()) == CallTempReg5); + JS_ASSERT(output == CallTempReg6); OutOfLineCode *ool = oolCallVM(ConcatStringsInfo, lir, (ArgList(), lhs, rhs), StoreRegisterTo(output)); if (!ool) return false; - Label done; + IonCode *stringConcatStub = gen->ionCompartment()->stringConcatStub(); + masm.call(stringConcatStub); + masm.branchTestPtr(Assembler::Zero, output, output, ool->entry()); + + masm.bind(ool->rejoin()); + return true; +} + +static void +CopyStringChars(MacroAssembler &masm, Register to, Register from, Register len, Register scratch) +{ + // Copy |len| jschars from |from| to |to|. Assumes len > 0 (checked below in + // debug builds), and when done |to| must point to the next available char. + +#ifdef DEBUG + Label ok; + masm.branch32(Assembler::GreaterThan, len, Imm32(0), &ok); + masm.breakpoint(); + masm.bind(&ok); +#endif + + JS_STATIC_ASSERT(sizeof(jschar) == 2); + + Label start; + masm.bind(&start); + masm.load16ZeroExtend(Address(from, 0), scratch); + masm.store16(scratch, Address(to, 0)); + masm.addPtr(Imm32(2), from); + masm.addPtr(Imm32(2), to); + masm.sub32(Imm32(1), len); + masm.j(Assembler::NonZero, &start); +} + +IonCode * +IonCompartment::generateStringConcatStub(JSContext *cx) +{ + MacroAssembler masm(cx); + + Register lhs = CallTempReg0; + Register rhs = CallTempReg1; + Register temp1 = CallTempReg2; + Register temp2 = CallTempReg3; + Register temp3 = CallTempReg4; + Register temp4 = CallTempReg5; + Register output = CallTempReg6; + + Label failure; // If lhs is empty, return rhs. Label leftEmpty; - masm.loadStringLength(lhs, temp); - masm.branchTest32(Assembler::Zero, temp, temp, &leftEmpty); + masm.loadStringLength(lhs, temp1); + masm.branchTest32(Assembler::Zero, temp1, temp1, &leftEmpty); // If rhs is empty, return lhs. Label rightEmpty; - masm.loadStringLength(rhs, output); - masm.branchTest32(Assembler::Zero, output, output, &rightEmpty); + masm.loadStringLength(rhs, temp2); + masm.branchTest32(Assembler::Zero, temp2, temp2, &rightEmpty); - // Ensure total length <= JSString::MAX_LENGTH. - masm.add32(output, temp); - masm.branch32(Assembler::Above, temp, Imm32(JSString::MAX_LENGTH), ool->entry()); + masm.add32(temp1, temp2); + + // Check if we can use a JSShortString. + Label isShort; + masm.branch32(Assembler::BelowOrEqual, temp2, Imm32(JSShortString::MAX_SHORT_LENGTH), + &isShort); + + // Ensure result length <= JSString::MAX_LENGTH. + masm.branch32(Assembler::Above, temp1, Imm32(JSString::MAX_LENGTH), &failure); // Allocate a new rope. - masm.newGCString(output, ool->entry()); + masm.newGCString(output, &failure); // Store lengthAndFlags. JS_STATIC_ASSERT(JSString::ROPE_FLAGS == 0); - masm.lshiftPtr(Imm32(JSString::LENGTH_SHIFT), temp); - masm.storePtr(temp, Address(output, JSString::offsetOfLengthAndFlags())); + masm.lshiftPtr(Imm32(JSString::LENGTH_SHIFT), temp2); + masm.storePtr(temp2, Address(output, JSString::offsetOfLengthAndFlags())); // Store left and right nodes. masm.storePtr(lhs, Address(output, JSRope::offsetOfLeft())); masm.storePtr(rhs, Address(output, JSRope::offsetOfRight())); - masm.jump(&done); + masm.ret(); masm.bind(&leftEmpty); masm.mov(rhs, output); - masm.jump(&done); + masm.ret(); masm.bind(&rightEmpty); masm.mov(lhs, output); + masm.ret(); - masm.bind(&done); - masm.bind(ool->rejoin()); - return true; + masm.bind(&isShort); + + // State: lhs length in temp1, result length in temp2. + + // Ensure both strings are linear (flags != 0). + JS_STATIC_ASSERT(JSString::ROPE_FLAGS == 0); + masm.branchTestPtr(Assembler::Zero, Address(lhs, JSString::offsetOfLengthAndFlags()), + Imm32(JSString::FLAGS_MASK), &failure); + masm.branchTestPtr(Assembler::Zero, Address(rhs, JSString::offsetOfLengthAndFlags()), + Imm32(JSString::FLAGS_MASK), &failure); + + // Allocate a JSShortString. + masm.newGCShortString(output, &failure); + + // Set lengthAndFlags. + masm.lshiftPtr(Imm32(JSString::LENGTH_SHIFT), temp2); + masm.orPtr(Imm32(JSString::FIXED_FLAGS), temp2); + masm.storePtr(temp2, Address(output, JSString::offsetOfLengthAndFlags())); + + // Set chars pointer, keep in temp2 for copy loop below. + masm.computeEffectiveAddress(Address(output, JSShortString::offsetOfInlineStorage()), temp2); + masm.storePtr(temp2, Address(output, JSShortString::offsetOfChars())); + + // Copy lhs chars. Temp1 still holds the lhs length. Note that this + // advances temp2 to point to the next char. + masm.loadPtr(Address(lhs, JSString::offsetOfChars()), temp3); + CopyStringChars(masm, temp2, temp3, temp1, temp4); + + // Copy rhs chars. + masm.loadPtr(Address(rhs, JSString::offsetOfChars()), temp3); + masm.loadStringLength(rhs, temp1); + CopyStringChars(masm, temp2, temp3, temp1, temp4); + + // Null-terminate. + masm.store16(Imm32(0), Address(temp2, 0)); + masm.ret(); + + masm.bind(&failure); + masm.movePtr(ImmWord((void *)NULL), output); + masm.ret(); + + Linker linker(masm); + return linker.newCode(cx, JSC::OTHER_CODE); } typedef bool (*CharCodeAtFn)(JSContext *, HandleString, int32_t, uint32_t *); diff --git a/js/src/ion/Ion.cpp b/js/src/ion/Ion.cpp index 10c68f8e182..a894fdb9ee2 100644 --- a/js/src/ion/Ion.cpp +++ b/js/src/ion/Ion.cpp @@ -183,9 +183,6 @@ IonRuntime::initialize(JSContext *cx) { AutoEnterAtomsCompartment ac(cx); - if (!cx->compartment->ensureIonCompartmentExists(cx)) - return false; - IonContext ictx(cx, NULL); AutoFlushCache afc("IonRuntime::initialize"); @@ -193,6 +190,9 @@ IonRuntime::initialize(JSContext *cx) if (!execAlloc_) return false; + if (!cx->compartment->ensureIonCompartmentExists(cx)) + return false; + functionWrappers_ = cx->new_(cx); if (!functionWrappers_ || !functionWrappers_->init()) return false; @@ -284,7 +284,8 @@ IonRuntime::freeOsrTempData() IonCompartment::IonCompartment(IonRuntime *rt) : rt(rt), stubCodes_(NULL), - baselineCallReturnAddr_(NULL) + baselineCallReturnAddr_(NULL), + stringConcatStub_(NULL) { } @@ -300,6 +301,11 @@ IonCompartment::initialize(JSContext *cx) stubCodes_ = cx->new_(cx); if (!stubCodes_ || !stubCodes_->init()) return false; + + stringConcatStub_ = generateStringConcatStub(cx); + if (!stringConcatStub_) + return false; + return true; } @@ -354,6 +360,8 @@ IonCompartment::mark(JSTracer *trc, JSCompartment *compartment) // Free temporary OSR buffer. rt->freeOsrTempData(); + + MarkIonCodeRoot(trc, &stringConcatStub_, "stringConcatStub"); } void diff --git a/js/src/ion/IonCompartment.h b/js/src/ion/IonCompartment.h index 472cf55fba5..76536cac636 100644 --- a/js/src/ion/IonCompartment.h +++ b/js/src/ion/IonCompartment.h @@ -197,6 +197,13 @@ class IonCompartment // Allocated space for optimized baseline stubs. OptimizedICStubSpace optimizedStubSpace_; + // Stub to concatenate two strings inline. Note that it can't be + // stored in IonRuntime because masm.newGCString bakes in + // zone-specific pointers. + IonCode *stringConcatStub_; + + IonCode *generateStringConcatStub(JSContext *cx); + public: IonCode *getVMWrapper(const VMFunction &f); @@ -284,6 +291,10 @@ class IonCompartment return rt->debugTrapHandler(cx); } + IonCode *stringConcatStub() { + return stringConcatStub_; + } + AutoFlushCache *flusher() { return rt->flusher(); } diff --git a/js/src/ion/IonMacroAssembler.cpp b/js/src/ion/IonMacroAssembler.cpp index 4742e816df8..5055193dda5 100644 --- a/js/src/ion/IonMacroAssembler.cpp +++ b/js/src/ion/IonMacroAssembler.cpp @@ -463,6 +463,12 @@ MacroAssembler::newGCString(const Register &result, Label *fail) newGCThing(result, js::gc::FINALIZE_STRING, fail); } +void +MacroAssembler::newGCShortString(const Register &result, Label *fail) +{ + newGCThing(result, js::gc::FINALIZE_SHORT_STRING, fail); +} + void MacroAssembler::parNewGCThing(const Register &result, const Register &threadContextReg, diff --git a/js/src/ion/IonMacroAssembler.h b/js/src/ion/IonMacroAssembler.h index 405760e6b36..cb0c833cc5d 100644 --- a/js/src/ion/IonMacroAssembler.h +++ b/js/src/ion/IonMacroAssembler.h @@ -580,6 +580,7 @@ class MacroAssembler : public MacroAssemblerSpecific void newGCThing(const Register &result, gc::AllocKind allocKind, Label *fail); void newGCThing(const Register &result, JSObject *templateObject, Label *fail); void newGCString(const Register &result, Label *fail); + void newGCShortString(const Register &result, Label *fail); void parNewGCThing(const Register &result, const Register &threadContextReg, diff --git a/js/src/ion/LIR-Common.h b/js/src/ion/LIR-Common.h index abbc5aaa215..6e381646f1d 100644 --- a/js/src/ion/LIR-Common.h +++ b/js/src/ion/LIR-Common.h @@ -2243,15 +2243,19 @@ class LBinaryV : public LCallInstructionHelper }; // Adds two string, returning a string. -class LConcat : public LInstructionHelper<1, 2, 1> +class LConcat : public LInstructionHelper<1, 2, 4> { public: LIR_HEADER(Concat) - LConcat(const LAllocation &lhs, const LAllocation &rhs, const LDefinition &temp) { + LConcat(const LAllocation &lhs, const LAllocation &rhs, const LDefinition &temp1, + const LDefinition &temp2, const LDefinition &temp3, const LDefinition &temp4) { setOperand(0, lhs); setOperand(1, rhs); - setTemp(0, temp); + setTemp(0, temp1); + setTemp(1, temp2); + setTemp(2, temp3); + setTemp(3, temp4); } const LAllocation *lhs() { @@ -2260,9 +2264,18 @@ class LConcat : public LInstructionHelper<1, 2, 1> const LAllocation *rhs() { return this->getOperand(1); } - const LDefinition *temp() { + const LDefinition *temp1() { return this->getTemp(0); } + const LDefinition *temp2() { + return this->getTemp(1); + } + const LDefinition *temp3() { + return this->getTemp(2); + } + const LDefinition *temp4() { + return this->getTemp(3); + } }; // Get uint16 character code from a string. diff --git a/js/src/ion/Lowering.cpp b/js/src/ion/Lowering.cpp index c2407718d6a..78001f5a40f 100644 --- a/js/src/ion/Lowering.cpp +++ b/js/src/ion/Lowering.cpp @@ -1307,8 +1307,13 @@ LIRGenerator::visitConcat(MConcat *ins) JS_ASSERT(rhs->type() == MIRType_String); JS_ASSERT(ins->type() == MIRType_String); - LConcat *lir = new LConcat(useRegister(lhs), useRegister(rhs), temp()); - if (!define(lir, ins)) + LConcat *lir = new LConcat(useFixed(lhs, CallTempReg0), + useFixed(rhs, CallTempReg1), + tempFixed(CallTempReg2), + tempFixed(CallTempReg3), + tempFixed(CallTempReg4), + tempFixed(CallTempReg5)); + if (!defineFixed(lir, ins, LAllocation(AnyRegister(CallTempReg6)))) return false; return assignSafepoint(lir, ins); } diff --git a/js/src/ion/arm/Assembler-arm.h b/js/src/ion/arm/Assembler-arm.h index 80f1b773725..68acd6338f1 100644 --- a/js/src/ion/arm/Assembler-arm.h +++ b/js/src/ion/arm/Assembler-arm.h @@ -55,7 +55,7 @@ static const Register CallTempReg2 = r7; static const Register CallTempReg3 = r8; static const Register CallTempReg4 = r0; static const Register CallTempReg5 = r1; - +static const Register CallTempReg6 = r2; static const Register IntArgReg0 = r0; static const Register IntArgReg1 = r1; diff --git a/js/src/ion/arm/MacroAssembler-arm.h b/js/src/ion/arm/MacroAssembler-arm.h index cbd46d0c1c8..54e8ea5d552 100644 --- a/js/src/ion/arm/MacroAssembler-arm.h +++ b/js/src/ion/arm/MacroAssembler-arm.h @@ -853,6 +853,9 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM void branchTestPtr(Condition cond, const Register &lhs, const Imm32 rhs, Label *label) { branchTest32(cond, lhs, rhs, label); } + void branchTestPtr(Condition cond, const Address &lhs, Imm32 imm, Label *label) { + branchTest32(cond, lhs, imm, label); + } void branchPtr(Condition cond, Register lhs, Register rhs, Label *label) { branch32(cond, lhs, rhs, label); } diff --git a/js/src/ion/x64/Assembler-x64.h b/js/src/ion/x64/Assembler-x64.h index 37837bcd80a..2621dab8319 100644 --- a/js/src/ion/x64/Assembler-x64.h +++ b/js/src/ion/x64/Assembler-x64.h @@ -82,6 +82,7 @@ static const Register CallTempReg2 = rbx; static const Register CallTempReg3 = rcx; static const Register CallTempReg4 = rsi; static const Register CallTempReg5 = rdx; +static const Register CallTempReg6 = rbp; // Different argument registers for WIN64 #if defined(_WIN64) @@ -626,6 +627,19 @@ class Assembler : public AssemblerX86Shared void testq(const Register &lhs, const Register &rhs) { masm.testq_rr(rhs.code(), lhs.code()); } + void testq(const Operand &lhs, Imm32 rhs) { + switch (lhs.kind()) { + case Operand::REG: + masm.testq_i32r(rhs.value, lhs.reg()); + break; + case Operand::REG_DISP: + masm.testq_i32m(rhs.value, lhs.disp(), lhs.base()); + break; + default: + JS_NOT_REACHED("unexpected operand kind"); + break; + } + } void jmp(void *target, Relocation::Kind reloc = Relocation::HARDCODED) { JmpSrc src = masm.jmp(); diff --git a/js/src/ion/x64/MacroAssembler-x64.h b/js/src/ion/x64/MacroAssembler-x64.h index 8b21e4500f2..4d5a5372826 100644 --- a/js/src/ion/x64/MacroAssembler-x64.h +++ b/js/src/ion/x64/MacroAssembler-x64.h @@ -510,6 +510,10 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared testq(lhs, imm); j(cond, label); } + void branchTestPtr(Condition cond, const Address &lhs, Imm32 imm, Label *label) { + testq(Operand(lhs), imm); + j(cond, label); + } void decBranchPtr(Condition cond, const Register &lhs, Imm32 imm, Label *label) { subPtr(imm, lhs); j(cond, label); diff --git a/js/src/ion/x86/Assembler-x86.h b/js/src/ion/x86/Assembler-x86.h index 3099f80a9b6..9f4046c2ccc 100644 --- a/js/src/ion/x86/Assembler-x86.h +++ b/js/src/ion/x86/Assembler-x86.h @@ -54,6 +54,7 @@ static const Register CallTempReg2 = ebx; static const Register CallTempReg3 = ecx; static const Register CallTempReg4 = esi; static const Register CallTempReg5 = edx; +static const Register CallTempReg6 = ebp; // We have no arg regs, so our NonArgRegs are just our CallTempReg* static const Register CallTempNonArgRegs[] = { edi, eax, ebx, ecx, esi, edx }; diff --git a/js/src/ion/x86/MacroAssembler-x86.h b/js/src/ion/x86/MacroAssembler-x86.h index 8c2a88d39d6..698c1f83ba1 100644 --- a/js/src/ion/x86/MacroAssembler-x86.h +++ b/js/src/ion/x86/MacroAssembler-x86.h @@ -544,6 +544,10 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared testl(lhs, imm); j(cond, label); } + void branchTestPtr(Condition cond, const Address &lhs, Imm32 imm, Label *label) { + testl(Operand(lhs), imm); + j(cond, label); + } void decBranchPtr(Condition cond, const Register &lhs, Imm32 imm, Label *label) { subPtr(imm, lhs); j(cond, label); diff --git a/js/src/jit-test/tests/ion/string-concat-short.js b/js/src/jit-test/tests/ion/string-concat-short.js new file mode 100644 index 00000000000..a0108df0445 --- /dev/null +++ b/js/src/jit-test/tests/ion/string-concat-short.js @@ -0,0 +1,13 @@ +function f() { + var res = 0; + for (var i=0; i<100; i++) { + var s = "test" + i; + res += s.length; + assertEq(s[0], "t"); + assertEq(s[3], "t"); + if (i > 90) + assertEq(s[4], "9"); + } + return res; +} +assertEq(f(), 590); diff --git a/js/src/vm/String.cpp b/js/src/vm/String.cpp index dc62d96247e..1bb9b86c641 100644 --- a/js/src/vm/String.cpp +++ b/js/src/vm/String.cpp @@ -319,6 +319,24 @@ js::ConcatStrings(JSContext *cx, if (!JSString::validateLength(cxIfCanGC, wholeLength)) return NULL; + if (JSShortString::lengthFits(wholeLength)) { + JSShortString *str = js_NewGCShortString(cx); + if (!str) + return NULL; + const jschar *leftChars = left->getChars(cx); + if (!leftChars) + return NULL; + const jschar *rightChars = right->getChars(cx); + if (!rightChars) + return NULL; + + jschar *buf = str->init(wholeLength); + PodCopy(buf, leftChars, leftLen); + PodCopy(buf + leftLen, rightChars, rightLen); + buf[wholeLength] = 0; + return str; + } + return JSRope::new_(cx, left, right, wholeLength); } diff --git a/js/src/vm/String.h b/js/src/vm/String.h index a0c8514509c..e02cbc88ba3 100644 --- a/js/src/vm/String.h +++ b/js/src/vm/String.h @@ -677,6 +677,10 @@ class JSInlineString : public JSFlatString static bool lengthFits(size_t length) { return length <= MAX_INLINE_LENGTH; } + + static size_t offsetOfInlineStorage() { + return offsetof(JSInlineString, d.inlineStorage); + } }; JS_STATIC_ASSERT(sizeof(JSInlineString) == sizeof(JSString)); From f91dcacccd5975be30fcc3bb33270ed2ff16a61a Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Thu, 25 Apr 2013 15:15:58 -0400 Subject: [PATCH 104/155] bug 846864 - Fix source server support. r=khuey --- toolkit/crashreporter/tools/symbolstore.py | 3 +- .../crashreporter/tools/unit-symbolstore.py | 53 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/toolkit/crashreporter/tools/symbolstore.py b/toolkit/crashreporter/tools/symbolstore.py index 044410b4625..78b54958643 100755 --- a/toolkit/crashreporter/tools/symbolstore.py +++ b/toolkit/crashreporter/tools/symbolstore.py @@ -149,6 +149,7 @@ class HGRepoInfo: repository, or you have not specified SRCSRV_ROOT, or the clone is corrupt.""") % path sys.exit(1) self.rev = rev + self.root = root self.cleanroot = cleanroot def GetFileInfo(self, file): @@ -161,7 +162,7 @@ class HGFileInfo(VCSFileInfo): self.file = os.path.relpath(file, repo.path) def GetRoot(self): - return self.repo.path + return self.repo.root def GetCleanRoot(self): return self.repo.cleanroot diff --git a/toolkit/crashreporter/tools/unit-symbolstore.py b/toolkit/crashreporter/tools/unit-symbolstore.py index 4bdacac09de..4c8c252353d 100644 --- a/toolkit/crashreporter/tools/unit-symbolstore.py +++ b/toolkit/crashreporter/tools/unit-symbolstore.py @@ -241,6 +241,59 @@ class TestRepoManifest(HelperMixin, unittest.TestCase): self.assertEqual("git:example.com/bar/something_else:src3.c:00000000", symbolstore.GetVCSFilename(file3, d.srcdirs)[0]) +if platform.system() in ("Windows", "Microsoft"): + class TestSourceServer(HelperMixin, unittest.TestCase): + @patch("subprocess.call") + @patch("subprocess.Popen") + def test_HGSERVER(self, mock_Popen, mock_call): + """ + Test that HGSERVER gets set correctly in the source server index. + """ + symbolpath = os.path.join(self.test_dir, "symbols") + os.makedirs(symbolpath) + srcdir = os.path.join(self.test_dir, "srcdir") + os.makedirs(os.path.join(srcdir, ".hg")) + sourcefile = os.path.join(srcdir, "foo.c") + test_files = add_extension(["foo"]) + self.add_test_files(test_files) + # srcsrv needs PDBSTR_PATH set + os.environ["PDBSTR_PATH"] = "pdbstr" + # mock calls to `dump_syms`, `hg parent` and + # `hg showconfig paths.default` + mock_Popen.return_value.stdout = iter([ + "MODULE os x86 %s %s" % ("X" * 33, test_files[0]), + "FILE 0 %s" % sourcefile, + "PUBLIC xyz 123" + ]) + mock_communicate = mock_Popen.return_value.communicate + mock_communicate.side_effect = [("abcd1234", ""), + ("http://example.com/repo", ""), + ] + # And mock the call to pdbstr to capture the srcsrv stream data. + global srcsrv_stream + srcsrv_stream = None + def mock_pdbstr(args, cwd="", **kwargs): + for arg in args: + if arg.startswith("-i:"): + global srcsrv_stream + srcsrv_stream = open(os.path.join(cwd, arg[3:]), 'r').read() + return 0 + mock_call.side_effect = mock_pdbstr + d = symbolstore.GetPlatformSpecificDumper(dump_syms="dump_syms", + symbol_path=symbolpath, + srcdirs=[srcdir], + vcsinfo=True, + srcsrv=True, + copy_debug=True) + # stub out CopyDebug + d.CopyDebug = lambda *args: True + d.Process(self.test_dir) + d.Finish(stop_pool=False) + self.assertNotEqual(srcsrv_stream, None) + hgserver = [x.rstrip() for x in srcsrv_stream.splitlines() if x.startswith("HGSERVER=")] + self.assertEqual(len(hgserver), 1) + self.assertEqual(hgserver[0].split("=")[1], "http://example.com/repo") + if __name__ == '__main__': # use the multiprocessing.dummy module to use threading wrappers so # that our mocking/module-patching works From 9e7bcd0729f412019d6d9568034b7a346db23501 Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Thu, 25 Apr 2013 15:16:09 -0400 Subject: [PATCH 105/155] bug 865183 - Allow chrome callers to call navigator.getUserMediaDevices. r=bz,smaug --- dom/base/Navigator.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dom/base/Navigator.cpp b/dom/base/Navigator.cpp index 4d4eaa61bab..629c2ca4c7b 100644 --- a/dom/base/Navigator.cpp +++ b/dom/base/Navigator.cpp @@ -1113,7 +1113,7 @@ Navigator::MozGetUserMediaDevices(nsIGetUserMediaDevicesSuccessCallback* aOnSucc } // Check if the caller is chrome privileged, bail if not - if (!nsContentUtils::IsChromeDoc(win->GetExtantDoc())) { + if (!nsContentUtils::IsCallerChrome()) { return NS_ERROR_FAILURE; } From a83eeea8077002d7f16ce3f706da321ba773268f Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Thu, 25 Apr 2013 15:16:24 -0400 Subject: [PATCH 106/155] Bug 863715 - Allow uploading full crashreporter symbol package via mozconfig option. r=glandium --- configure.in | 1 + toolkit/mozapps/installer/packager.mk | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/configure.in b/configure.in index 71666cef3c2..d7dcbcf9130 100644 --- a/configure.in +++ b/configure.in @@ -8585,6 +8585,7 @@ AC_SUBST(MOZ_ANDROID_ANR_REPORTER) AC_SUBST(MOZ_ONLY_TOUCH_EVENTS) AC_SUBST(MOZ_CRASHREPORTER) AC_SUBST(MOZ_CRASHREPORTER_INJECTOR) +AC_SUBST(MOZ_CRASHREPORTER_UPLOAD_FULL_SYMBOLS) AC_SUBST(MOZ_MAINTENANCE_SERVICE) AC_SUBST(MOZ_STUB_INSTALLER) AC_SUBST(MOZ_VERIFY_MAR_SIGNATURE) diff --git a/toolkit/mozapps/installer/packager.mk b/toolkit/mozapps/installer/packager.mk index e25caee4cd5..71abbb2fba3 100644 --- a/toolkit/mozapps/installer/packager.mk +++ b/toolkit/mozapps/installer/packager.mk @@ -738,6 +738,11 @@ UPLOAD_FILES= \ $(call QUOTED_WILDCARD,$(PKG_JSSHELL)) \ $(if $(UPLOAD_EXTRA_FILES), $(foreach f, $(UPLOAD_EXTRA_FILES), $(wildcard $(DIST)/$(f)))) +ifdef MOZ_CRASHREPORTER_UPLOAD_FULL_SYMBOLS +UPLOAD_FILES += \ + $(call QUOTED_WILDCARD,$(DIST)/$(PKG_PATH)$(SYMBOL_FULL_ARCHIVE_BASENAME).zip) +endif + SIGN_CHECKSUM_CMD= ifdef MOZ_SIGN_CMD # If we're signing with gpg, we'll have a bunch of extra detached signatures to From 4d49a0cf905120c94910fb8e727f8f337b46d8cb Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Fri, 26 Apr 2013 08:43:19 -0400 Subject: [PATCH 107/155] Bug 860867 - Disable loop vectorization optimizations in the JS engine for clang to prevent it from generating bad code; r=glandium --- js/src/configure.in | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/js/src/configure.in b/js/src/configure.in index a56a3c9dc16..e555507aa75 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -1524,6 +1524,9 @@ case "$target" in MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@' MOZ_OPTIMIZE_FLAGS="-O3 -fno-stack-protector" + if test -n "$CLANG_CXX"; then + MOZ_OPTIMIZE_FLAGS="$MOZ_OPTIMIZE_FLAGS -fno-vectorize" + fi CFLAGS="$CFLAGS -fno-common" CXXFLAGS="$CXXFLAGS -fno-common" DLL_SUFFIX=".dylib" @@ -1617,6 +1620,9 @@ ia64*-hpux*) MOZ_GFX_OPTIMIZE_MOBILE=1 MOZ_OPTIMIZE_FLAGS="-O3 -freorder-blocks -fno-reorder-functions" + if test -n "$CLANG_CXX"; then + MOZ_OPTIMIZE_FLAGS="$MOZ_OPTIMIZE_FLAGS -fno-vectorize" + fi # The Maemo builders don't know about this flag MOZ_ARM_VFP_FLAGS="-mfpu=vfp" ;; @@ -1639,6 +1645,9 @@ ia64*-hpux*) MOZ_OPTIMIZE_FLAGS="-O3 -freorder-blocks $MOZ_OPTIMIZE_SIZE_TWEAK" MOZ_DEBUG_FLAGS="-g" fi + if test -n "$CLANG_CXX"; then + MOZ_OPTIMIZE_FLAGS="$MOZ_OPTIMIZE_FLAGS -fno-vectorize" + fi TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"' From 06b6fd09a74155d27d6968c9d7cad6ef01684ecd Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Fri, 26 Apr 2013 14:12:08 +0100 Subject: [PATCH 108/155] Bug 864960 - Parallax transition to open/close the tabs tray (r=mfinkle) --- mobile/android/base/BrowserApp.java | 17 ++-------- mobile/android/base/TabsPanel.java | 52 +++++++++++++++++++++++++---- 2 files changed, 49 insertions(+), 20 deletions(-) diff --git a/mobile/android/base/BrowserApp.java b/mobile/android/base/BrowserApp.java index 5025291f23c..fe52d2df6a8 100644 --- a/mobile/android/base/BrowserApp.java +++ b/mobile/android/base/BrowserApp.java @@ -959,6 +959,8 @@ abstract public class BrowserApp extends GeckoApp PropertyAnimator.Property.SCROLL_X, -width); } else { + mTabsPanel.prepareTabsAnimation(mMainLayoutAnimator); + mMainLayoutAnimator.attach(mMainLayout, PropertyAnimator.Property.SCROLL_Y, -height); @@ -981,24 +983,10 @@ abstract public class BrowserApp extends GeckoApp @Override public void onPropertyAnimationStart() { mBrowserToolbar.updateTabs(true); - - // Although the tabs panel is not animating per se, it will be re-drawn several - // times while the main/gecko layout slides to left/top. Adding a hardware layer - // here considerably improves the frame rate of the animation. - if (Build.VERSION.SDK_INT >= 11) - mTabsPanel.setLayerType(View.LAYER_TYPE_HARDWARE, null); - else - mTabsPanel.setDrawingCacheEnabled(true); } @Override public void onPropertyAnimationEnd() { - // Destroy the hardware layer used during the animation - if (Build.VERSION.SDK_INT >= 11) - mTabsPanel.setLayerType(View.LAYER_TYPE_NONE, null); - else - mTabsPanel.setDrawingCacheEnabled(false); - if (mTabsPanel.isShown()) { if (hasTabsSideBar()) { setSidebarMargin(mTabsPanel.getWidth()); @@ -1014,6 +1002,7 @@ abstract public class BrowserApp extends GeckoApp } mBrowserToolbar.refreshBackground(); + mTabsPanel.finishTabsAnimation(); if (hasTabsSideBar()) mBrowserToolbar.adjustTabsAnimation(true); diff --git a/mobile/android/base/TabsPanel.java b/mobile/android/base/TabsPanel.java index c2321ea192a..f634db2bb38 100644 --- a/mobile/android/base/TabsPanel.java +++ b/mobile/android/base/TabsPanel.java @@ -10,6 +10,7 @@ import org.mozilla.gecko.widget.IconTabWidget; import android.content.Context; import android.content.res.Resources; import android.graphics.Rect; +import android.os.Build; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; @@ -45,6 +46,7 @@ public class TabsPanel extends LinearLayout private Context mContext; private GeckoApp mActivity; + private RelativeLayout mHeader; private TabsListContainer mTabsContainer; private PanelView mPanel; private PanelView mPanelNormal; @@ -79,6 +81,7 @@ public class TabsPanel extends LinearLayout } private void initialize() { + mHeader = (RelativeLayout) findViewById(R.id.tabs_panel_header); mTabsContainer = (TabsListContainer) findViewById(R.id.tabs_container); mPanelNormal = (TabsTray) findViewById(R.id.normal_tabs); @@ -151,7 +154,6 @@ public class TabsPanel extends LinearLayout listContainer.getWindowVisibleDisplayFrame(windowRect); int windowHeight = windowRect.bottom - windowRect.top; - // The web content area should have at least 1.5x the height of the action bar. // The tabs panel shouldn't take less than 50% of the screen height and can take // up to 80% of the window height. @@ -336,11 +338,7 @@ public class TabsPanel extends LinearLayout if (mVisible) { mVisible = false; dispatchLayoutChange(0, 0); - - if (mPanel != null) { - mPanel.hide(); - mPanel = null; - } + mPanel = null; } } @@ -375,6 +373,48 @@ public class TabsPanel extends LinearLayout return mCurrentPanel; } + public void prepareTabsAnimation(PropertyAnimator animator) { + // Not worth doing this on pre-Honeycomb without proper + // hardware accelerated animations. + if (Build.VERSION.SDK_INT < 11) { + return; + } + + final Resources resources = getContext().getResources(); + final int toolbarHeight = resources.getDimensionPixelSize(R.dimen.browser_toolbar_height); + + if (mVisible) { + AnimatorProxy proxy = AnimatorProxy.create(mHeader); + proxy.setTranslationY(-toolbarHeight); + + proxy = AnimatorProxy.create(mTabsContainer); + proxy.setTranslationY((float) (-toolbarHeight)); + proxy.setAlpha(0); + } + + animator.attach(mTabsContainer, + PropertyAnimator.Property.ALPHA, + mVisible ? 1.0f : 0.0f); + animator.attach(mHeader, + PropertyAnimator.Property.TRANSLATION_Y, + mVisible ? 0 : -toolbarHeight); + animator.attach(mTabsContainer, + PropertyAnimator.Property.TRANSLATION_Y, + mVisible ? 0 : -toolbarHeight); + + mHeader.setLayerType(View.LAYER_TYPE_HARDWARE, null); + mTabsContainer.setLayerType(View.LAYER_TYPE_HARDWARE, null); + } + + public void finishTabsAnimation() { + if (Build.VERSION.SDK_INT < 11) { + return; + } + + mHeader.setLayerType(View.LAYER_TYPE_NONE, null); + mTabsContainer.setLayerType(View.LAYER_TYPE_NONE, null); + } + public void setTabsLayoutChangeListener(TabsLayoutChangeListener listener) { mLayoutChangeListener = listener; } From b8d1e99bdd2de73ce986e7d2cd36efc15243e15d Mon Sep 17 00:00:00 2001 From: Glenna Buford Date: Fri, 26 Apr 2013 10:10:59 -0400 Subject: [PATCH 109/155] Bug 746983 - Remove unused local variable in nsDeviceContextAndroid, clean up whitespace, and fix grammar in comment. r=blassey --- widget/android/nsDeviceContextAndroid.cpp | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/widget/android/nsDeviceContextAndroid.cpp b/widget/android/nsDeviceContextAndroid.cpp index 431a81ea323..8ed677f9be5 100644 --- a/widget/android/nsDeviceContextAndroid.cpp +++ b/widget/android/nsDeviceContextAndroid.cpp @@ -15,28 +15,27 @@ NS_IMPL_ISUPPORTS1(nsDeviceContextSpecAndroid, nsIDeviceContextSpec) NS_IMETHODIMP nsDeviceContextSpecAndroid::GetSurfaceForPrinter(gfxASurface** aSurface) { - nsAutoCString tmpDir(getenv("TMPDIR")); - nsresult rv = + nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(mTempFile)); NS_ENSURE_SUCCESS(rv, rv); - - nsAutoCString filename("tmp-printing.pdf"); + + nsAutoCString filename("tmp-printing.pdf"); mTempFile->AppendNative(filename); rv = mTempFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0660); - NS_ENSURE_SUCCESS(rv, rv); - + NS_ENSURE_SUCCESS(rv, rv); + nsCOMPtr stream = do_CreateInstance("@mozilla.org/network/file-output-stream;1"); rv = stream->Init(mTempFile, -1, -1, 0); - NS_ENSURE_SUCCESS(rv, rv); + NS_ENSURE_SUCCESS(rv, rv); nsRefPtr surface; - // XXX: what should we do hear for size? screen size? + // XXX: what should we do here for size? screen size? gfxSize surfaceSize(480, 800); surface = new gfxPDFSurface(stream, surfaceSize); - - + + NS_ABORT_IF_FALSE(surface, "valid address expected"); surface.swap(*aSurface); return NS_OK; From 01729f196d402d0764840bf8baa4a148c07bf308 Mon Sep 17 00:00:00 2001 From: Yura Zenevich Date: Fri, 26 Apr 2013 10:10:59 -0400 Subject: [PATCH 110/155] Bug 862570 - Add a preference for an observer listening for test.osfile.web-workers-shutdown. r=yoric --- .../components/osfile/osfile_async_front.jsm | 58 +++++++++++++-- .../tests/mochi/main_test_osfile_async.js | 73 +++++++++++++++---- 2 files changed, 109 insertions(+), 22 deletions(-) diff --git a/toolkit/components/osfile/osfile_async_front.jsm b/toolkit/components/osfile/osfile_async_front.jsm index d70642adb9c..0dc57cdd097 100644 --- a/toolkit/components/osfile/osfile_async_front.jsm +++ b/toolkit/components/osfile/osfile_async_front.jsm @@ -178,10 +178,34 @@ Object.defineProperty(OS.Shared, "DEBUG", { } }); +// Observer topics used for monitoring shutdown +const WEB_WORKERS_SHUTDOWN_TOPIC = "web-workers-shutdown"; +const TEST_WEB_WORKERS_SHUTDOWN_TOPIC = "test.osfile.web-workers-shutdown"; + +// Preference used to configure test shutdown observer. +const PREF_OSFILE_TEST_SHUTDOWN_OBSERVER = + "toolkit.osfile.test.shutdown.observer"; + +/** + * Safely attempt removing a test shutdown observer. + */ +let removeTestObserver = function removeTestObserver() { + try { + Services.obs.removeObserver(webWorkersShutdownObserver, + TEST_WEB_WORKERS_SHUTDOWN_TOPIC); + } catch (ex) { + // There was no observer to remove. + } +}; + /** * An observer function to be used to monitor web-workers-shutdown events. */ -let webWorkersShutdownObserver = function webWorkersShutdownObserver() { +let webWorkersShutdownObserver = function webWorkersShutdownObserver(aSubject, aTopic) { + if (aTopic == WEB_WORKERS_SHUTDOWN_TOPIC) { + Services.obs.removeObserver(webWorkersShutdownObserver, WEB_WORKERS_SHUTDOWN_TOPIC); + removeTestObserver(); + } // Send a "System_shutdown" message to the worker. Scheduler.post("System_shutdown").then(function onSuccess(opened) { let msg = ""; @@ -200,14 +224,32 @@ let webWorkersShutdownObserver = function webWorkersShutdownObserver() { }); }; -// Attaching an observer listening to the "web-workers-shutdown". -Services.obs.addObserver(webWorkersShutdownObserver, "web-workers-shutdown", - false); -// Attaching the same observer listening to the -// "test.osfile.web-workers-shutdown". -// Note: This is used for testing purposes. Services.obs.addObserver(webWorkersShutdownObserver, - "test.osfile.web-workers-shutdown", false); + WEB_WORKERS_SHUTDOWN_TOPIC, false); + +// Attaching an observer for PREF_OSFILE_TEST_SHUTDOWN_OBSERVER to enable or +// disable the test shutdown event observer. +// Note: By default the PREF_OSFILE_TEST_SHUTDOWN_OBSERVER is unset. +// Note: This is meant to be used for testing purposes only. +Services.prefs.addObserver(PREF_OSFILE_TEST_SHUTDOWN_OBSERVER, + function prefObserver() { + let addObserver; + try { + addObserver = Services.prefs.getBoolPref( + PREF_OSFILE_TEST_SHUTDOWN_OBSERVER); + } catch (x) { + // In case PREF_OSFILE_TEST_SHUTDOWN_OBSERVER was cleared. + addObserver = false; + } + if (addObserver) { + // Attaching an observer listening to the TEST_WEB_WORKERS_SHUTDOWN_TOPIC. + Services.obs.addObserver(webWorkersShutdownObserver, + TEST_WEB_WORKERS_SHUTDOWN_TOPIC, false); + } else { + // Removing the observer. + removeTestObserver(); + } + }, false); /** * Representation of a file, with asynchronous methods. diff --git a/toolkit/components/osfile/tests/mochi/main_test_osfile_async.js b/toolkit/components/osfile/tests/mochi/main_test_osfile_async.js index 6218a6281bf..38ae0679530 100644 --- a/toolkit/components/osfile/tests/mochi/main_test_osfile_async.js +++ b/toolkit/components/osfile/tests/mochi/main_test_osfile_async.js @@ -820,13 +820,26 @@ let test_system_shutdown = maketest("system_shutdown", function system_shutdown( return Task.spawn(function () { // Save original DEBUG value. let originalDebug = OS.Shared.DEBUG; + // Count the number of times the leaks are logged. + let logCounter = 0; // Create a console listener. function inDebugTest(resource, f) { return Task.spawn(function task() { let originalDebug = OS.Shared.DEBUG; OS.Shared.TEST = true; OS.Shared.DEBUG = true; + let waitObservation = Promise.defer(); + // Unregister a listener, reset DEBUG and TEST both when the promise is + // resolved or rejected. + let cleanUp = function cleanUp() { + Services.console.unregisterListener(listener); + OS.Shared.DEBUG = originalDebug; + OS.Shared.TEST = false; + test.info("Unregistered listener for resource " + resource); + }; + waitObservation.promise.then(cleanUp, cleanUp); + let listener = { observe: function (aMessage) { test.info("Waiting for a console message mentioning resource " + resource); @@ -843,6 +856,10 @@ let test_system_shutdown = maketest("system_shutdown", function system_shutdown( "detected.") >= 0, "Noticing file descriptors leaks, as expected."); let found = aMessage.message.indexOf(resource) >= 0; if (found) { + if (++logCounter > 2) { + test.fail("test.osfile.web-workers-shutdown observer should only " + + "be activated 2 times."); + } test.ok(true, "Leaked resource is correctly listed in the log."); setTimeout(function() { waitObservation.resolve(); }); } else { @@ -852,30 +869,58 @@ let test_system_shutdown = maketest("system_shutdown", function system_shutdown( }; Services.console.registerListener(listener); f(); + // If listener does not resolve webObservation in timely manner (100MS), + // reject it. + setTimeout(function() { + test.info("waitObservation timeout exceeded."); + waitObservation.reject(); + }, 100); yield waitObservation.promise; - Services.console.unregisterListener(listener); - OS.Shared.DEBUG = originalDebug; - OS.Shared.TEST = false; - test.info("Unregistered listener for resource " + resource); }); } + // Enable test shutdown observer. + Services.prefs.setBoolPref("toolkit.osfile.test.shutdown.observer", true); + let currentDir = yield OS.File.getCurrentDirectory(); test.info("Testing for leaks of directory iterator " + currentDir); let iterator = new OS.File.DirectoryIterator(currentDir); - yield inDebugTest(currentDir, function() { - Services.obs.notifyObservers(null, "test.osfile.web-workers-shutdown", - null); - }); + try { + yield inDebugTest(currentDir, function() { + Services.obs.notifyObservers(null, "test.osfile.web-workers-shutdown", + null); + }); + test.ok(true, "Log messages observervation promise resolved as expected."); + } catch (ex) { + test.fail("Log messages observervation promise was rejected."); + } yield iterator.close(); + let testFileDescriptorsLeaks = function testFileDescriptorsLeaks(shouldResolve) { + return Task.spawn(function task() { + let openedFile = yield OS.File.open(EXISTING_FILE); + try { + yield inDebugTest(EXISTING_FILE, function() { + Services.obs.notifyObservers(null, "test.osfile.web-workers-shutdown", + null); + }); + test.ok(shouldResolve, + "Log message observervation promise resolved as expected."); + } catch (ex) { + test.ok(!shouldResolve, + "Log message observervation promise was rejected as expected."); + } + yield openedFile.close(); + }); + }; + test.info("Testing for leaks of file " + EXISTING_FILE); - let openedFile = yield OS.File.open(EXISTING_FILE); - yield inDebugTest(EXISTING_FILE, function() { - Services.obs.notifyObservers(null, "test.osfile.web-workers-shutdown", - null); - }); - yield openedFile.close(); + yield testFileDescriptorsLeaks(true); + + // Disable test shutdown observer. + Services.prefs.clearUserPref("toolkit.osfile.test.shutdown.observer"); + // Nothing should be logged since the test shutdown observer is unregistered. + yield testFileDescriptorsLeaks(false); }); }); From 6dee0b730ea5d86d4436c9b5e11e788fcbc5bca3 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Fri, 26 Apr 2013 10:10:59 -0400 Subject: [PATCH 111/155] Bug 863242 - Use switch statement in BrowserApp.getPreferences(). r=mleibovic --- mobile/android/chrome/content/browser.js | 26 ++++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 0fea188cc52..07961dd7bd6 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -958,20 +958,20 @@ var BrowserApp = { Services.prefs.addObserver(prefName, this, false); } - // The plugin pref is actually two separate prefs, so - // we need to handle it differently - if (prefName == "plugin.enable") { - // Use a string type for java's ListPreference - pref.type = "string"; - pref.value = PluginHelper.getPluginPreference(); - prefs.push(pref); - continue; - } else if (prefName == "privacy.masterpassword.enabled") { + switch (prefName) { + // The plugin pref is actually two separate prefs, so + // we need to handle it differently + case "plugin.enable": + pref.type = "string";// Use a string type for java's ListPreference + pref.value = PluginHelper.getPluginPreference(); + prefs.push(pref); + continue; // Master password is not a "real" pref - pref.type = "bool"; - pref.value = MasterPassword.enabled; - prefs.push(pref); - continue; + case "privacy.masterpassword.enabled": + pref.type = "bool"; + pref.value = MasterPassword.enabled; + prefs.push(pref); + continue; } try { From acfc53f209c45e27741388a99b47bc4a2a5bf544 Mon Sep 17 00:00:00 2001 From: Tetsuharu OHZEKI Date: Fri, 26 Apr 2013 10:10:59 -0400 Subject: [PATCH 112/155] Bug 863242 - Add a preference setting "accept tracking me" to Fennec. r=mleibovic --- .../base/locales/en-US/android_strings.dtd | 6 ++- .../android/base/resources/values/arrays.xml | 10 ++++ .../resources/xml/preferences_privacy.xml | 9 ++-- mobile/android/base/strings.xml.in | 6 ++- mobile/android/chrome/content/browser.js | 48 +++++++++++++++++++ 5 files changed, 73 insertions(+), 6 deletions(-) diff --git a/mobile/android/base/locales/en-US/android_strings.dtd b/mobile/android/base/locales/en-US/android_strings.dtd index fc44885cf1e..e40dab6cc74 100644 --- a/mobile/android/base/locales/en-US/android_strings.dtd +++ b/mobile/android/base/locales/en-US/android_strings.dtd @@ -69,7 +69,6 @@ - @@ -83,6 +82,11 @@ + + + + + diff --git a/mobile/android/base/resources/values/arrays.xml b/mobile/android/base/resources/values/arrays.xml index 7616021e378..8f63654b3d4 100644 --- a/mobile/android/base/resources/values/arrays.xml +++ b/mobile/android/base/resources/values/arrays.xml @@ -46,6 +46,16 @@ 0 1 2 + + + @string/pref_donottrack_disallow_tracking + @string/pref_donottrack_allow_tracking + @string/pref_donottrack_no_pref + + + 1 + 2 + 0 @string/awesomebar_bookmarks_title diff --git a/mobile/android/base/resources/xml/preferences_privacy.xml b/mobile/android/base/resources/xml/preferences_privacy.xml index 582f5f0b22e..5fcb80f09f5 100644 --- a/mobile/android/base/resources/xml/preferences_privacy.xml +++ b/mobile/android/base/resources/xml/preferences_privacy.xml @@ -25,10 +25,11 @@ gecko:entryKeys="@array/pref_private_data_keys" gecko:initialValues="@array/pref_private_data_values" /> - + &pref_header_privacy; &pref_header_content; &pref_about_firefox; - &pref_do_not_track; &pref_telemetry; &pref_remember_signons; @@ -93,6 +92,11 @@ &pref_cookies_not_accept_foreign; &pref_cookies_disabled; + &pref_donottrack_menu; + &pref_donottrack_disallow_tracking; + &pref_donottrack_allow_tracking; + &pref_donottrack_no_pref; + &pref_char_encoding; &pref_char_encoding_on; &pref_char_encoding_off; diff --git a/mobile/android/chrome/content/browser.js b/mobile/android/chrome/content/browser.js index 07961dd7bd6..59276ad7e3b 100644 --- a/mobile/android/chrome/content/browser.js +++ b/mobile/android/chrome/content/browser.js @@ -138,6 +138,12 @@ const kDefaultCSSViewportHeight = 480; const kViewportRemeasureThrottle = 500; +const kDoNotTrackPrefState = Object.freeze({ + NO_PREF: "0", + DISALLOW_TRACKING: "1", + ALLOW_TRACKING: "2", +}); + function dump(a) { Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService).logStringMessage(a); } @@ -972,6 +978,28 @@ var BrowserApp = { pref.value = MasterPassword.enabled; prefs.push(pref); continue; + /* + * Handle Do-not-track preference + * + * "privacy.donottrackheader" is not "real" pref name. + * This pref name is used in the setting menu, and + * this is passed when initializing the setting menu. + */ + case "privacy.donottrackheader": { + pref.type = "string"; + + let enableDNT = Services.prefs.getBoolPref("privacy.donottrackheader.enabled"); + if (!enableDNT) { + pref.value = kDoNotTrackPrefState.NO_PREF; + } else { + let dntState = Services.prefs.getIntPref("privacy.donottrackheader.value"); + pref.value = (dntState === 0) ? kDoNotTrackPrefState.ALLOW_TRACKING : + kDoNotTrackPrefState.DISALLOW_TRACKING; + } + + prefs.push(pref); + continue; + } } try { @@ -1066,6 +1094,26 @@ var BrowserApp = { else MasterPassword.setPassword(json.value); return; + } else if (json.name === "privacy.donottrackheader") { + // "privacy.donottrackheader" is not "real" pref name, it's used in the setting menu. + switch (json.value) { + case kDoNotTrackPrefState.NO_PREF: + // Don't tell anything about tracking me + Services.prefs.setBoolPref("privacy.donottrackheader.enabled", false); + Services.prefs.clearUserPref("privacy.donottrackheader.value"); + break; + case kDoNotTrackPrefState.ALLOW_TRACKING: + // Accept tracking me + Services.prefs.setBoolPref("privacy.donottrackheader.enabled", true); + Services.prefs.setIntPref("privacy.donottrackheader.value", 0); + break; + case kDoNotTrackPrefState.DISALLOW_TRACKING: + // Not accept tracking me + Services.prefs.setBoolPref("privacy.donottrackheader.enabled", true); + Services.prefs.setIntPref("privacy.donottrackheader.value", 1); + break; + } + return; } else if (json.name == SearchEngines.PREF_SUGGEST_ENABLED) { // Enabling or disabling suggestions will prevent future prompts Services.prefs.setBoolPref(SearchEngines.PREF_SUGGEST_PROMPTED, true); From 5b7dde4e4935fb3035e01f315fe818a6fd7f8628 Mon Sep 17 00:00:00 2001 From: Garrett Robinson Date: Fri, 26 Apr 2013 10:10:59 -0400 Subject: [PATCH 113/155] Bug 865344 - Add a localization comment for BlockMixedDisplayContent and BlockMixedActiveContent. r=smaug --- dom/locales/en-US/chrome/security/security.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/dom/locales/en-US/chrome/security/security.properties b/dom/locales/en-US/chrome/security/security.properties index 93f8387f7c3..66bf86ab8a9 100644 --- a/dom/locales/en-US/chrome/security/security.properties +++ b/dom/locales/en-US/chrome/security/security.properties @@ -1,4 +1,5 @@ # Mixed Content Blocker +# LOCALIZATION NOTE: "%1$S" is the URI of the blocked mixed content resource BlockMixedDisplayContent = Blocked loading mixed display content "%1$S" BlockMixedActiveContent = Blocked loading mixed active content "%1$S" From bc040e83d4e7e39b03f8f3bfa6aceca05c2b90ab Mon Sep 17 00:00:00 2001 From: Brian O'Keefe Date: Fri, 26 Apr 2013 10:11:00 -0400 Subject: [PATCH 114/155] Bug 865445 - Add 'configure' command to mach to rebuild the backend. r=gps --- python/mozbuild/mozbuild/mach_commands.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/python/mozbuild/mozbuild/mach_commands.py b/python/mozbuild/mozbuild/mach_commands.py index a789597a905..142f257d1f8 100644 --- a/python/mozbuild/mozbuild/mach_commands.py +++ b/python/mozbuild/mozbuild/mach_commands.py @@ -195,6 +195,22 @@ class Build(MachCommandBase): print(FINDER_SLOW_MESSAGE % finder_percent) + @Command('configure', help='Configure the tree (run configure and config.status') + def configure(self): + def on_line(line): + self.log(logging.INFO, 'build_output', {'line': line}, '{line}') + + status = self._run_make(srcdir=True, filename='client.mk', + target='configure', line_handler=on_line, log=False, + print_directory=False, allow_parallel=False, ensure_exit_code=False) + + if not status: + print('Configure complete!') + print('Be sure to run |mach build| to pick up any changes'); + + return status + + @Command('clobber', help='Clobber the tree (delete the object directory).') def clobber(self): try: From 54a065b3a0162ee36dd16b190d714af24072e86d Mon Sep 17 00:00:00 2001 From: Raymond Lee Date: Fri, 26 Apr 2013 10:09:52 +0800 Subject: [PATCH 115/155] Bug 865643 - Fix DEPRECATION WARNING: archiveBookmarksFile is deprecated error. r=rnewman --- services/sync/modules/engines/bookmarks.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/sync/modules/engines/bookmarks.js b/services/sync/modules/engines/bookmarks.js index ac5b6b0b7e3..7ef86cc7346 100644 --- a/services/sync/modules/engines/bookmarks.js +++ b/services/sync/modules/engines/bookmarks.js @@ -18,6 +18,7 @@ Cu.import("resource://services-sync/engines.js"); Cu.import("resource://services-sync/record.js"); Cu.import("resource://services-sync/util.js"); Cu.import("resource://gre/modules/Task.jsm"); +Cu.import("resource://gre/modules/PlacesBackups.jsm"); const ALLBOOKMARKS_ANNO = "AllBookmarks"; const DESCRIPTION_ANNO = "bookmarkProperties/description"; @@ -348,7 +349,7 @@ BookmarksEngine.prototype = { Task.spawn(function() { // For first-syncs, make a backup for the user to restore if (this.lastSync == 0) { - yield PlacesUtils.archiveBookmarksFile(null, true); + yield PlacesBackups.create(null, true); } this.__defineGetter__("_guidMap", function() { @@ -1280,7 +1281,7 @@ BookmarksStore.prototype = { let cb = Async.makeSpinningCallback(); Task.spawn(function() { // Save a backup before clearing out all bookmarks. - yield PlacesUtils.archiveBookmarksFile(null, true); + yield PlacesBackups.create(null, true); for each (let guid in kSpecialIds.guids) if (guid != "places") { let id = kSpecialIds.specialIdForGUID(guid); From 25acc9d0ec062ee45bf9ddc9f6dc309a2a05f6c3 Mon Sep 17 00:00:00 2001 From: Daniel Holbert Date: Fri, 26 Apr 2013 10:11:00 -0400 Subject: [PATCH 116/155] Bug 865766 - Reorder MessageLoop init list to fix build warning. r=jlebar --- ipc/chromium/src/base/message_loop.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ipc/chromium/src/base/message_loop.cc b/ipc/chromium/src/base/message_loop.cc index f715ce582a6..5c3d202f556 100644 --- a/ipc/chromium/src/base/message_loop.cc +++ b/ipc/chromium/src/base/message_loop.cc @@ -90,6 +90,7 @@ PRInt32 message_loop_id_seq = 0; MessageLoop::MessageLoop(Type type) : type_(type), + id_(PR_ATOMIC_INCREMENT(&message_loop_id_seq)), nestable_tasks_allowed_(true), exception_restoration_(false), state_(NULL), @@ -97,8 +98,7 @@ MessageLoop::MessageLoop(Type type) #ifdef OS_WIN os_modal_loop_(false), #endif // OS_WIN - next_sequence_num_(0), - id_(PR_ATOMIC_INCREMENT(&message_loop_id_seq)) { + next_sequence_num_(0) { DCHECK(!current()) << "should only have one message loop per thread"; lazy_tls_ptr.Pointer()->Set(this); if (type_ == TYPE_MOZILLA_UI) { From bdd1e368eed412d9ba8db9dde2b3c2ef6db47cec Mon Sep 17 00:00:00 2001 From: Daniel Holbert Date: Fri, 26 Apr 2013 10:11:00 -0400 Subject: [PATCH 117/155] Bug 865774 - Fix signed/unsigned comparison build warning in cpr_string.c by casting known-nonnegative signed value to size_t. r=jesup --- media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c b/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c index 18fe182285e..f8e828b3644 100644 --- a/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c +++ b/media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c @@ -200,7 +200,8 @@ void flex_string_vsprintf(flex_string *fs, const char *format, va_list original_ va_copy(ap, original_ap); vsnprintf_result = vsnprintf(fs->buffer + fs->string_length, fs->buffer_length - fs->string_length, format, ap); va_end(ap); - MOZ_ASSERT(vsnprintf_result > 0 && vsnprintf_result < (fs->buffer_length - fs->string_length)); + MOZ_ASSERT(vsnprintf_result > 0 && + (size_t)vsnprintf_result < (fs->buffer_length - fs->string_length)); } if (vsnprintf_result > 0) { From be60a4b03589986926ecce3668dc6e179aa86b19 Mon Sep 17 00:00:00 2001 From: Ekanan Ketunuti Date: Fri, 26 Apr 2013 12:41:46 +0700 Subject: [PATCH 118/155] Bug 865977 - Remove duplicate XUL namespace strings in tabbrowser::addTab and use a const XUL NS declaration in its place. r=jaws --- browser/base/content/tabbrowser.xml | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index 45550f3a276..0a9c9dd530a 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -1262,6 +1262,7 @@ Date: Fri, 19 Apr 2013 04:49:22 -0400 Subject: [PATCH 119/155] Bug 856472: Move CanvasPattern to its own file r=bz --HG-- rename : content/canvas/src/CanvasRenderingContext2D.h => content/canvas/src/CanvasPattern.h --- content/canvas/src/CanvasPattern.h | 54 +++++++++++++++++++ .../canvas/src/CanvasRenderingContext2D.cpp | 1 + content/canvas/src/CanvasRenderingContext2D.h | 41 +------------- content/canvas/src/moz.build | 1 + 4 files changed, 57 insertions(+), 40 deletions(-) create mode 100644 content/canvas/src/CanvasPattern.h diff --git a/content/canvas/src/CanvasPattern.h b/content/canvas/src/CanvasPattern.h new file mode 100644 index 00000000000..e7df0f144f0 --- /dev/null +++ b/content/canvas/src/CanvasPattern.h @@ -0,0 +1,54 @@ +/* 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/. */ + +#ifndef mozilla_dom_CanvasPattern_h +#define mozilla_dom_CanvasPattern_h + +#include "nsIDOMCanvasRenderingContext2D.h" + +#define NS_CANVASPATTERNAZURE_PRIVATE_IID \ + {0xc9bacc25, 0x28da, 0x421e, {0x9a, 0x4b, 0xbb, 0xd6, 0x93, 0x05, 0x12, 0xbc}} + +namespace mozilla { +namespace dom { + +class CanvasPattern MOZ_FINAL : public nsIDOMCanvasPattern +{ +public: + NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASPATTERNAZURE_PRIVATE_IID) + + enum RepeatMode + { + REPEAT, + REPEATX, + REPEATY, + NOREPEAT + }; + + CanvasPattern(mozilla::gfx::SourceSurface* aSurface, + RepeatMode aRepeat, + nsIPrincipal* principalForSecurityCheck, + bool forceWriteOnly, + bool CORSUsed) + : mSurface(aSurface) + , mRepeat(aRepeat) + , mPrincipal(principalForSecurityCheck) + , mForceWriteOnly(forceWriteOnly) + , mCORSUsed(CORSUsed) + { + } + + NS_DECL_ISUPPORTS + + mozilla::RefPtr mSurface; + const RepeatMode mRepeat; + nsCOMPtr mPrincipal; + const bool mForceWriteOnly; + const bool mCORSUsed; +}; + +} +} + +#endif // mozilla_dom_CanvasPattern_h diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index 200c53d176b..338d0101f83 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -94,6 +94,7 @@ #include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/HTMLImageElement.h" #include "mozilla/dom/HTMLVideoElement.h" +#include "mozilla/dom/CanvasPattern.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/dom/TextMetrics.h" diff --git a/content/canvas/src/CanvasRenderingContext2D.h b/content/canvas/src/CanvasRenderingContext2D.h index 9878a0cfbe1..ee26995ee88 100644 --- a/content/canvas/src/CanvasRenderingContext2D.h +++ b/content/canvas/src/CanvasRenderingContext2D.h @@ -21,8 +21,6 @@ #define NS_CANVASGRADIENTAZURE_PRIVATE_IID \ {0x28425a6a, 0x90e0, 0x4d42, {0x9c, 0x75, 0xff, 0x60, 0x09, 0xb3, 0x10, 0xa8}} -#define NS_CANVASPATTERNAZURE_PRIVATE_IID \ - {0xc9bacc25, 0x28da, 0x421e, {0x9a, 0x4b, 0xbb, 0xd6, 0x93, 0x05, 0x12, 0xbc}} class nsXULElement; @@ -33,6 +31,7 @@ class SourceSurface; } namespace dom { +class CanvasPattern; class TextMetrics; extern const mozilla::gfx::Float SIGMA_MAX; @@ -86,44 +85,6 @@ protected: virtual ~CanvasGradient() {} }; -/** - ** CanvasPattern - **/ -class CanvasPattern MOZ_FINAL : public nsIDOMCanvasPattern -{ -public: - NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASPATTERNAZURE_PRIVATE_IID) - - enum RepeatMode - { - REPEAT, - REPEATX, - REPEATY, - NOREPEAT - }; - - CanvasPattern(mozilla::gfx::SourceSurface* aSurface, - RepeatMode aRepeat, - nsIPrincipal* principalForSecurityCheck, - bool forceWriteOnly, - bool CORSUsed) - : mSurface(aSurface) - , mRepeat(aRepeat) - , mPrincipal(principalForSecurityCheck) - , mForceWriteOnly(forceWriteOnly) - , mCORSUsed(CORSUsed) - { - } - - NS_DECL_ISUPPORTS - - mozilla::RefPtr mSurface; - const RepeatMode mRepeat; - nsCOMPtr mPrincipal; - const bool mForceWriteOnly; - const bool mCORSUsed; -}; - struct CanvasBidiProcessor; class CanvasRenderingContext2DUserData; diff --git a/content/canvas/src/moz.build b/content/canvas/src/moz.build index 397bc7d2f38..e176e54ff3f 100644 --- a/content/canvas/src/moz.build +++ b/content/canvas/src/moz.build @@ -7,6 +7,7 @@ MODULE = 'content' EXPORTS.mozilla.dom += [ + 'CanvasPattern.h', 'CanvasRenderingContext2D.h', 'CanvasUtils.h', 'ImageData.h', From e3ec2de9afddb7f551cdb3c85a90589efa5afd49 Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Fri, 19 Apr 2013 04:49:22 -0400 Subject: [PATCH 120/155] Bug 856472: Convert CanvasPattern to WebIDL r=bz --- content/canvas/src/CanvasPattern.h | 17 ++++++++++++++--- content/canvas/src/CanvasRenderingContext2D.cpp | 6 +----- content/canvas/src/CanvasRenderingContext2D.h | 4 ++-- dom/base/nsDOMClassInfo.cpp | 6 ------ dom/base/nsDOMClassInfoClasses.h | 1 - dom/bindings/Bindings.conf | 5 ++++- .../canvas/nsIDOMCanvasRenderingContext2D.idl | 5 ----- dom/webidl/CanvasRenderingContext2D.webidl | 8 ++++++-- js/xpconnect/src/dom_quickstubs.qsconf | 3 --- 9 files changed, 27 insertions(+), 28 deletions(-) diff --git a/content/canvas/src/CanvasPattern.h b/content/canvas/src/CanvasPattern.h index e7df0f144f0..e6d9b734db6 100644 --- a/content/canvas/src/CanvasPattern.h +++ b/content/canvas/src/CanvasPattern.h @@ -5,18 +5,26 @@ #ifndef mozilla_dom_CanvasPattern_h #define mozilla_dom_CanvasPattern_h -#include "nsIDOMCanvasRenderingContext2D.h" +#include "mozilla/dom/CanvasRenderingContext2DBinding.h" +#include "mozilla/RefPtr.h" +#include "nsISupports.h" #define NS_CANVASPATTERNAZURE_PRIVATE_IID \ {0xc9bacc25, 0x28da, 0x421e, {0x9a, 0x4b, 0xbb, 0xd6, 0x93, 0x05, 0x12, 0xbc}} +class nsIPrincipal; namespace mozilla { +namespace gfx { +class SourceSurface; +} + namespace dom { -class CanvasPattern MOZ_FINAL : public nsIDOMCanvasPattern +class CanvasPattern MOZ_FINAL : public nsISupports { public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASPATTERNAZURE_PRIVATE_IID) + NS_DECL_ISUPPORTS enum RepeatMode { @@ -39,7 +47,10 @@ public: { } - NS_DECL_ISUPPORTS + JSObject* WrapObject(JSContext* aCx, JSObject* aScope) + { + return CanvasPatternBinding::Wrap(aCx, aScope, this); + } mozilla::RefPtr mSurface; const RepeatMode mRepeat; diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index 338d0101f83..de728a30c34 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -94,7 +94,6 @@ #include "mozilla/dom/BindingUtils.h" #include "mozilla/dom/HTMLImageElement.h" #include "mozilla/dom/HTMLVideoElement.h" -#include "mozilla/dom/CanvasPattern.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/dom/TextMetrics.h" @@ -411,8 +410,6 @@ NS_IMPL_RELEASE(CanvasPattern) NS_INTERFACE_MAP_BEGIN(CanvasPattern) NS_INTERFACE_MAP_ENTRY(mozilla::dom::CanvasPattern) - NS_INTERFACE_MAP_ENTRY(nsIDOMCanvasPattern) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CanvasPattern) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END @@ -1364,7 +1361,7 @@ CanvasRenderingContext2D::CreateRadialGradient(double x0, double y0, double r0, return grad.forget(); } -already_AddRefed +already_AddRefed CanvasRenderingContext2D::CreatePattern(const HTMLImageOrCanvasOrVideoElement& element, const nsAString& repeat, ErrorResult& error) @@ -3791,6 +3788,5 @@ CanvasRenderingContext2D::ShouldForceInactiveLayer(LayerManager *aManager) } DOMCI_DATA(CanvasGradient, mozilla::dom::CanvasGradient) -DOMCI_DATA(CanvasPattern, mozilla::dom::CanvasPattern) DOMCI_DATA(CanvasRenderingContext2D, mozilla::dom::CanvasRenderingContext2D) diff --git a/content/canvas/src/CanvasRenderingContext2D.h b/content/canvas/src/CanvasRenderingContext2D.h index ee26995ee88..ff43f511e3b 100644 --- a/content/canvas/src/CanvasRenderingContext2D.h +++ b/content/canvas/src/CanvasRenderingContext2D.h @@ -18,6 +18,7 @@ #include "mozilla/dom/ImageData.h" #include "mozilla/dom/UnionTypes.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" +#include "mozilla/dom/CanvasPattern.h" #define NS_CANVASGRADIENTAZURE_PRIVATE_IID \ {0x28425a6a, 0x90e0, 0x4d42, {0x9c, 0x75, 0xff, 0x60, 0x09, 0xb3, 0x10, 0xa8}} @@ -31,7 +32,6 @@ class SourceSurface; } namespace dom { -class CanvasPattern; class TextMetrics; extern const mozilla::gfx::Float SIGMA_MAX; @@ -159,7 +159,7 @@ public: already_AddRefed CreateRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1, mozilla::ErrorResult& aError); - already_AddRefed + already_AddRefed CreatePattern(const HTMLImageOrCanvasOrVideoElement& element, const nsAString& repeat, mozilla::ErrorResult& error); diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 8e900e209c7..51c849067ff 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -718,8 +718,6 @@ static nsDOMClassInfoData sClassInfoData[] = { NS_DEFINE_CLASSINFO_DATA(CanvasGradient, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(CanvasPattern, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(MozCanvasPrintState, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) @@ -1990,10 +1988,6 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMCanvasGradient) DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(CanvasPattern, nsIDOMCanvasPattern) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMCanvasPattern) - DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(MozCanvasPrintState, nsIDOMMozCanvasPrintState) DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozCanvasPrintState) DOM_CLASSINFO_MAP_END diff --git a/dom/base/nsDOMClassInfoClasses.h b/dom/base/nsDOMClassInfoClasses.h index 0921621b364..c49bbfbf444 100644 --- a/dom/base/nsDOMClassInfoClasses.h +++ b/dom/base/nsDOMClassInfoClasses.h @@ -117,7 +117,6 @@ DOMCI_CLASS(SVGZoomEvent) // Canvas DOMCI_CLASS(CanvasGradient) -DOMCI_CLASS(CanvasPattern) DOMCI_CLASS(MozCanvasPrintState) // WindowUtils diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 7cc9d0d80f2..1603bbae167 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -150,6 +150,10 @@ DOMInterfaces = { 'headerFile': 'BatteryManager.h' }, +'CanvasPattern': { + 'wrapperCache': False, +}, + 'CanvasRenderingContext2D': { 'implicitJSContext': [ 'createImageData', 'getImageData', 'strokeStyle', @@ -1508,7 +1512,6 @@ addExternalHTMLElement('HTMLFormElement') addExternalIface('ActivityOptions', nativeType='nsIDOMMozActivityOptions', headerFile='nsIDOMActivityOptions.h') addExternalIface('CanvasGradient', headerFile='nsIDOMCanvasRenderingContext2D.h') -addExternalIface('CanvasPattern', headerFile='nsIDOMCanvasRenderingContext2D.h') addExternalIface('Counter') addExternalIface('CSSRule') addExternalIface('DeviceAcceleration', headerFile='nsIDOMDeviceMotionEvent.h', notflattened=True) diff --git a/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl b/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl index a890974eecc..9a6f479fda4 100644 --- a/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl +++ b/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl @@ -11,11 +11,6 @@ interface nsIDOMCanvasGradient : nsISupports void addColorStop(in float offset, in DOMString color); }; -[scriptable, uuid(21dea65c-5c08-4eb1-ac82-81fe95be77b8)] -interface nsIDOMCanvasPattern : nsISupports -{ -}; - /** * This interface remains only for the constants, for a context, use the * WebIDL/Paris bindings instead (CanvasRenderingContext2D.webidl). diff --git a/dom/webidl/CanvasRenderingContext2D.webidl b/dom/webidl/CanvasRenderingContext2D.webidl index 35e585464fe..bca7fe8fdeb 100644 --- a/dom/webidl/CanvasRenderingContext2D.webidl +++ b/dom/webidl/CanvasRenderingContext2D.webidl @@ -12,7 +12,6 @@ */ interface CanvasGradient; -interface CanvasPattern; interface HitRegionOptions; interface Window; @@ -56,7 +55,7 @@ interface CanvasRenderingContext2D { CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1); [Throws] CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1); - [Throws] + [Creator, Throws] CanvasPattern createPattern((HTMLImageElement or HTMLCanvasElement or HTMLVideoElement) image, [TreatNullAs=EmptyString] DOMString repetition); // shadows @@ -264,6 +263,11 @@ interface CanvasPathMethods { // NOT IMPLEMENTED [LenientFloat] void ellipse(double x, double y, double radiusX, double radiusY, double rotation, double startAngle, double endAngle, boolean anticlockwise); }; +interface CanvasPattern { + // opaque object + // void setTransform(SVGMatrix transform); +}; + interface TextMetrics { // x-direction diff --git a/js/xpconnect/src/dom_quickstubs.qsconf b/js/xpconnect/src/dom_quickstubs.qsconf index a0c6ec70dd9..8385f21d627 100644 --- a/js/xpconnect/src/dom_quickstubs.qsconf +++ b/js/xpconnect/src/dom_quickstubs.qsconf @@ -54,7 +54,6 @@ members = [ # # canvas friends 'nsIDOMCanvasGradient.*', - 'nsIDOMCanvasPattern.*', # dom/interfaces/core 'nsIDOMDOMStringList.*', @@ -144,7 +143,6 @@ members = [ irregularFilenames = { # stowaways 'nsIDOMCanvasGradient': 'nsIDOMCanvasRenderingContext2D', - 'nsIDOMCanvasPattern': 'nsIDOMCanvasRenderingContext2D', 'nsIDOMBlob': 'nsIDOMFile', @@ -173,7 +171,6 @@ customIncludes = [ ] customReturnInterfaces = [ - 'nsIDOMCanvasPattern', 'nsIDOMCanvasGradient', ] From 49bc8485694c5c932e0153da41e02c69de8ba7ea Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Fri, 26 Apr 2013 10:55:37 -0400 Subject: [PATCH 121/155] Bug 856472: Wrappercache CanvasPattern r=bz --- content/canvas/src/CanvasPattern.h | 22 ++++++++++--- .../canvas/src/CanvasRenderingContext2D.cpp | 33 +++++++++++++++---- content/canvas/test/Makefile.in | 1 + content/canvas/test/test_bug856472.html | 31 +++++++++++++++++ dom/bindings/Bindings.conf | 4 --- 5 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 content/canvas/test/test_bug856472.html diff --git a/content/canvas/src/CanvasPattern.h b/content/canvas/src/CanvasPattern.h index e6d9b734db6..18860248d70 100644 --- a/content/canvas/src/CanvasPattern.h +++ b/content/canvas/src/CanvasPattern.h @@ -8,6 +8,7 @@ #include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/RefPtr.h" #include "nsISupports.h" +#include "nsWrapperCache.h" #define NS_CANVASPATTERNAZURE_PRIVATE_IID \ {0xc9bacc25, 0x28da, 0x421e, {0x9a, 0x4b, 0xbb, 0xd6, 0x93, 0x05, 0x12, 0xbc}} @@ -20,11 +21,13 @@ class SourceSurface; namespace dom { -class CanvasPattern MOZ_FINAL : public nsISupports +class CanvasPattern MOZ_FINAL : public nsISupports, + public nsWrapperCache { public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASPATTERNAZURE_PRIVATE_IID) - NS_DECL_ISUPPORTS + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(CanvasPattern) enum RepeatMode { @@ -34,17 +37,20 @@ public: NOREPEAT }; - CanvasPattern(mozilla::gfx::SourceSurface* aSurface, + CanvasPattern(CanvasRenderingContext2D* aContext, + gfx::SourceSurface* aSurface, RepeatMode aRepeat, nsIPrincipal* principalForSecurityCheck, bool forceWriteOnly, bool CORSUsed) - : mSurface(aSurface) + : mContext(aContext) + , mSurface(aSurface) , mRepeat(aRepeat) , mPrincipal(principalForSecurityCheck) , mForceWriteOnly(forceWriteOnly) , mCORSUsed(CORSUsed) { + SetIsDOMBinding(); } JSObject* WrapObject(JSContext* aCx, JSObject* aScope) @@ -52,7 +58,13 @@ public: return CanvasPatternBinding::Wrap(aCx, aScope, this); } - mozilla::RefPtr mSurface; + CanvasRenderingContext2D* GetParentObject() + { + return mContext; + } + + nsRefPtr mContext; + RefPtr mSurface; const RepeatMode mRepeat; nsCOMPtr mPrincipal; const bool mForceWriteOnly; diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index de728a30c34..48e93c9cbc6 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -405,10 +405,13 @@ NS_INTERFACE_MAP_END NS_DEFINE_STATIC_IID_ACCESSOR(CanvasPattern, NS_CANVASPATTERNAZURE_PRIVATE_IID) -NS_IMPL_ADDREF(CanvasPattern) -NS_IMPL_RELEASE(CanvasPattern) +NS_IMPL_CYCLE_COLLECTING_ADDREF(CanvasPattern) +NS_IMPL_CYCLE_COLLECTING_RELEASE(CanvasPattern) -NS_INTERFACE_MAP_BEGIN(CanvasPattern) +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(CanvasPattern, mContext) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(CanvasPattern) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(mozilla::dom::CanvasPattern) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END @@ -464,7 +467,25 @@ private: NS_IMPL_CYCLE_COLLECTING_ADDREF(CanvasRenderingContext2D) NS_IMPL_CYCLE_COLLECTING_RELEASE(CanvasRenderingContext2D) -NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(CanvasRenderingContext2D, mCanvasElement) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mCanvasElement) + for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) { + ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[STYLE_STROKE]); + ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[STYLE_FILL]); + } + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CanvasRenderingContext2D) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCanvasElement) + for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) { + ImplCycleCollectionTraverse(cb, tmp->mStyleStack[i].patternStyles[STYLE_STROKE], "Stroke CanvasPattern"); + ImplCycleCollectionTraverse(cb, tmp->mStyleStack[i].patternStyles[STYLE_FILL], "Fill CanvasPattern"); + } + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END + +NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(CanvasRenderingContext2D) NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(CanvasRenderingContext2D) if (nsCCUncollectableMarker::sGeneration && tmp->IsBlack()) { @@ -1400,7 +1421,7 @@ CanvasRenderingContext2D::CreatePattern(const HTMLImageOrCanvasOrVideoElement& e RefPtr srcSurf = srcCanvas->GetSurfaceSnapshot(); nsRefPtr pat = - new CanvasPattern(srcSurf, repeatMode, htmlElement->NodePrincipal(), canvas->IsWriteOnly(), false); + new CanvasPattern(this, srcSurf, repeatMode, htmlElement->NodePrincipal(), canvas->IsWriteOnly(), false); return pat.forget(); } @@ -1431,7 +1452,7 @@ CanvasRenderingContext2D::CreatePattern(const HTMLImageOrCanvasOrVideoElement& e gfxPlatform::GetPlatform()->GetSourceSurfaceForSurface(mTarget, res.mSurface); nsRefPtr pat = - new CanvasPattern(srcSurf, repeatMode, res.mPrincipal, + new CanvasPattern(this, srcSurf, repeatMode, res.mPrincipal, res.mIsWriteOnly, res.mCORSUsed); return pat.forget(); diff --git a/content/canvas/test/Makefile.in b/content/canvas/test/Makefile.in index 7de8389f80c..4a97a534bc4 100644 --- a/content/canvas/test/Makefile.in +++ b/content/canvas/test/Makefile.in @@ -105,6 +105,7 @@ MOCHITEST_FILES = \ test_bug613794.html \ test_bug753758.html \ test_bug764125.html \ + test_bug856472.html \ test_drawImage_edge_cases.html \ test_drawImage_document_domain.html \ test_mozDashOffset.html \ diff --git a/content/canvas/test/test_bug856472.html b/content/canvas/test/test_bug856472.html new file mode 100644 index 00000000000..3ca14d5dcfc --- /dev/null +++ b/content/canvas/test/test_bug856472.html @@ -0,0 +1,31 @@ + + + + + Test for Bug 856472 + + + + +Mozilla Bug 856472 +

+ +
+
+
+ + diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 1603bbae167..2e76150522c 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -150,10 +150,6 @@ DOMInterfaces = { 'headerFile': 'BatteryManager.h' }, -'CanvasPattern': { - 'wrapperCache': False, -}, - 'CanvasRenderingContext2D': { 'implicitJSContext': [ 'createImageData', 'getImageData', 'strokeStyle', From 8170a79e754e001e7e8fd286338d11e492d56848 Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Fri, 26 Apr 2013 10:55:37 -0400 Subject: [PATCH 122/155] Bug 856472: Move CanvasGradient to its own file r=bz --HG-- rename : content/canvas/src/CanvasRenderingContext2D.h => content/canvas/src/CanvasGradient.h --- content/canvas/src/CanvasGradient.h | 65 +++++++++++++++++++ content/canvas/src/CanvasRenderingContext2D.h | 51 +-------------- content/canvas/src/moz.build | 1 + 3 files changed, 67 insertions(+), 50 deletions(-) create mode 100644 content/canvas/src/CanvasGradient.h diff --git a/content/canvas/src/CanvasGradient.h b/content/canvas/src/CanvasGradient.h new file mode 100644 index 00000000000..89276ccbc22 --- /dev/null +++ b/content/canvas/src/CanvasGradient.h @@ -0,0 +1,65 @@ +/* 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/. */ + +#ifndef mozilla_dom_CanvasGradient_h +#define mozilla_dom_CanvasGradient_h + +#include "nsIDOMCanvasRenderingContext2D.h" +#include "nsTArray.h" +#include "mozilla/RefPtr.h" + +#define NS_CANVASGRADIENTAZURE_PRIVATE_IID \ + {0x28425a6a, 0x90e0, 0x4d42, {0x9c, 0x75, 0xff, 0x60, 0x09, 0xb3, 0x10, 0xa8}} + +namespace mozilla { +namespace dom { + +class CanvasGradient : public nsIDOMCanvasGradient +{ +public: + NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASGRADIENTAZURE_PRIVATE_IID) + + enum Type + { + LINEAR = 0, + RADIAL + }; + + Type GetType() + { + return mType; + } + + + mozilla::gfx::GradientStops * + GetGradientStopsForTarget(mozilla::gfx::DrawTarget *aRT) + { + if (mStops && mStops->GetBackendType() == aRT->GetType()) { + return mStops; + } + + mStops = aRT->CreateGradientStops(mRawStops.Elements(), mRawStops.Length()); + + return mStops; + } + + NS_DECL_ISUPPORTS + + /* nsIDOMCanvasGradient */ + NS_IMETHOD AddColorStop(float offset, const nsAString& colorstr); + +protected: + CanvasGradient(Type aType) : mType(aType) + {} + + nsTArray mRawStops; + mozilla::RefPtr mStops; + Type mType; + virtual ~CanvasGradient() {} +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_CanvasGradient_h diff --git a/content/canvas/src/CanvasRenderingContext2D.h b/content/canvas/src/CanvasRenderingContext2D.h index ff43f511e3b..f71bfc39983 100644 --- a/content/canvas/src/CanvasRenderingContext2D.h +++ b/content/canvas/src/CanvasRenderingContext2D.h @@ -17,12 +17,10 @@ #include "mozilla/ErrorResult.h" #include "mozilla/dom/ImageData.h" #include "mozilla/dom/UnionTypes.h" +#include "mozilla/dom/CanvasGradient.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/dom/CanvasPattern.h" -#define NS_CANVASGRADIENTAZURE_PRIVATE_IID \ - {0x28425a6a, 0x90e0, 0x4d42, {0x9c, 0x75, 0xff, 0x60, 0x09, 0xb3, 0x10, 0xa8}} - class nsXULElement; namespace mozilla { @@ -38,53 +36,6 @@ extern const mozilla::gfx::Float SIGMA_MAX; template class Optional; -/** - ** CanvasGradient - **/ -class CanvasGradient : public nsIDOMCanvasGradient -{ -public: - NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASGRADIENTAZURE_PRIVATE_IID) - - enum Type - { - LINEAR = 0, - RADIAL - }; - - Type GetType() - { - return mType; - } - - - mozilla::gfx::GradientStops * - GetGradientStopsForTarget(mozilla::gfx::DrawTarget *aRT) - { - if (mStops && mStops->GetBackendType() == aRT->GetType()) { - return mStops; - } - - mStops = aRT->CreateGradientStops(mRawStops.Elements(), mRawStops.Length()); - - return mStops; - } - - NS_DECL_ISUPPORTS - - /* nsIDOMCanvasGradient */ - NS_IMETHOD AddColorStop(float offset, const nsAString& colorstr); - -protected: - CanvasGradient(Type aType) : mType(aType) - {} - - nsTArray mRawStops; - mozilla::RefPtr mStops; - Type mType; - virtual ~CanvasGradient() {} -}; - struct CanvasBidiProcessor; class CanvasRenderingContext2DUserData; diff --git a/content/canvas/src/moz.build b/content/canvas/src/moz.build index e176e54ff3f..49edcf8289f 100644 --- a/content/canvas/src/moz.build +++ b/content/canvas/src/moz.build @@ -7,6 +7,7 @@ MODULE = 'content' EXPORTS.mozilla.dom += [ + 'CanvasGradient.h', 'CanvasPattern.h', 'CanvasRenderingContext2D.h', 'CanvasUtils.h', From e7c17f133daebb6fb9b5da8b88253cce5fdb17b2 Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Fri, 26 Apr 2013 10:55:54 -0400 Subject: [PATCH 123/155] Bug 856472: Convert CanvasGradient to WebIDL r=bz --- content/canvas/src/CanvasGradient.h | 13 ++++++-- .../canvas/src/CanvasRenderingContext2D.cpp | 31 +++++++++---------- content/canvas/src/CanvasRenderingContext2D.h | 11 +++---- content/canvas/test/test_canvas.html | 6 ++-- dom/base/nsDOMClassInfo.cpp | 6 ---- dom/base/nsDOMClassInfoClasses.h | 1 - dom/bindings/Bindings.conf | 5 ++- .../canvas/nsIDOMCanvasRenderingContext2D.idl | 6 ---- dom/webidl/CanvasRenderingContext2D.webidl | 12 +++++-- js/xpconnect/src/dom_quickstubs.qsconf | 11 ------- js/xpconnect/src/qsgen.py | 6 ---- 11 files changed, 45 insertions(+), 63 deletions(-) diff --git a/content/canvas/src/CanvasGradient.h b/content/canvas/src/CanvasGradient.h index 89276ccbc22..b2439701d19 100644 --- a/content/canvas/src/CanvasGradient.h +++ b/content/canvas/src/CanvasGradient.h @@ -8,6 +8,8 @@ #include "nsIDOMCanvasRenderingContext2D.h" #include "nsTArray.h" #include "mozilla/RefPtr.h" +#include "mozilla/dom/CanvasRenderingContext2DBinding.h" +#include "mozilla/gfx/2D.h" #define NS_CANVASGRADIENTAZURE_PRIVATE_IID \ {0x28425a6a, 0x90e0, 0x4d42, {0x9c, 0x75, 0xff, 0x60, 0x09, 0xb3, 0x10, 0xa8}} @@ -15,7 +17,7 @@ namespace mozilla { namespace dom { -class CanvasGradient : public nsIDOMCanvasGradient +class CanvasGradient : public nsISupports { public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASGRADIENTAZURE_PRIVATE_IID) @@ -46,8 +48,13 @@ public: NS_DECL_ISUPPORTS - /* nsIDOMCanvasGradient */ - NS_IMETHOD AddColorStop(float offset, const nsAString& colorstr); + // WebIDL + void AddColorStop(float offset, const nsAString& colorstr, ErrorResult& rv); + + JSObject* WrapObject(JSContext* aCx, JSObject* aScope) + { + return CanvasGradientBinding::Wrap(aCx, aScope, this); + } protected: CanvasGradient(Type aType) : mType(aType) diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index 48e93c9cbc6..56e3814a38b 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -361,22 +361,25 @@ private: mgfx::Rect mTempRect; }; -NS_IMETHODIMP -CanvasGradient::AddColorStop(float offset, const nsAString& colorstr) +void +CanvasGradient::AddColorStop(float offset, const nsAString& colorstr, ErrorResult& rv) { - if (!FloatValidate(offset) || offset < 0.0 || offset > 1.0) { - return NS_ERROR_DOM_INDEX_SIZE_ERR; + if (offset < 0.0 || offset > 1.0) { + rv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); + return; } nsCSSValue value; nsCSSParser parser; if (!parser.ParseColorString(colorstr, nullptr, 0, value)) { - return NS_ERROR_DOM_SYNTAX_ERR; + rv.Throw(NS_ERROR_DOM_SYNTAX_ERR); + return; } nscolor color; if (!nsRuleNode::ComputeColor(value, nullptr, nullptr, color)) { - return NS_ERROR_DOM_SYNTAX_ERR; + rv.Throw(NS_ERROR_DOM_SYNTAX_ERR); + return; } mStops = nullptr; @@ -387,8 +390,6 @@ CanvasGradient::AddColorStop(float offset, const nsAString& colorstr) newStop.color = Color::FromABGR(color); mRawStops.AppendElement(newStop); - - return NS_OK; } NS_DEFINE_STATIC_IID_ACCESSOR(CanvasGradient, NS_CANVASGRADIENTAZURE_PRIVATE_IID) @@ -398,8 +399,6 @@ NS_IMPL_RELEASE(CanvasGradient) NS_INTERFACE_MAP_BEGIN(CanvasGradient) NS_INTERFACE_MAP_ENTRY(mozilla::dom::CanvasGradient) - NS_INTERFACE_MAP_ENTRY(nsIDOMCanvasGradient) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CanvasGradient) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END @@ -1356,17 +1355,16 @@ CanvasRenderingContext2D::GetFillRule(nsAString& aString) // // gradients and patterns // -already_AddRefed -CanvasRenderingContext2D::CreateLinearGradient(double x0, double y0, double x1, double y1, - ErrorResult& aError) +already_AddRefed +CanvasRenderingContext2D::CreateLinearGradient(double x0, double y0, double x1, double y1) { - nsRefPtr grad = + nsRefPtr grad = new CanvasLinearGradient(Point(x0, y0), Point(x1, y1)); return grad.forget(); } -already_AddRefed +already_AddRefed CanvasRenderingContext2D::CreateRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1, ErrorResult& aError) @@ -1376,7 +1374,7 @@ CanvasRenderingContext2D::CreateRadialGradient(double x0, double y0, double r0, return nullptr; } - nsRefPtr grad = + nsRefPtr grad = new CanvasRadialGradient(Point(x0, y0), r0, Point(x1, y1), r1); return grad.forget(); @@ -3808,6 +3806,5 @@ CanvasRenderingContext2D::ShouldForceInactiveLayer(LayerManager *aManager) } } -DOMCI_DATA(CanvasGradient, mozilla::dom::CanvasGradient) DOMCI_DATA(CanvasRenderingContext2D, mozilla::dom::CanvasRenderingContext2D) diff --git a/content/canvas/src/CanvasRenderingContext2D.h b/content/canvas/src/CanvasRenderingContext2D.h index f71bfc39983..7ef8f4640aa 100644 --- a/content/canvas/src/CanvasRenderingContext2D.h +++ b/content/canvas/src/CanvasRenderingContext2D.h @@ -104,15 +104,14 @@ public: SetStyleFromJSValue(cx, value, STYLE_FILL); } - already_AddRefed - CreateLinearGradient(double x0, double y0, double x1, double y1, - mozilla::ErrorResult& aError); - already_AddRefed + already_AddRefed + CreateLinearGradient(double x0, double y0, double x1, double y1); + already_AddRefed CreateRadialGradient(double x0, double y0, double r0, double x1, double y1, - double r1, mozilla::ErrorResult& aError); + double r1, ErrorResult& aError); already_AddRefed CreatePattern(const HTMLImageOrCanvasOrVideoElement& element, - const nsAString& repeat, mozilla::ErrorResult& error); + const nsAString& repeat, ErrorResult& error); double ShadowOffsetX() { diff --git a/content/canvas/test/test_canvas.html b/content/canvas/test/test_canvas.html index 644ea3de88d..c366a9ce77d 100644 --- a/content/canvas/test/test_canvas.html +++ b/content/canvas/test/test_canvas.html @@ -6215,13 +6215,13 @@ var _thrown = undefined; try { } catch (e) { _thrown = e }; ok(_thrown && _thrown.name == "IndexSizeError" && _thrown.code == DOMException.INDEX_SIZE_ERR, "should throw IndexSizeError"); var _thrown = undefined; try { g.addColorStop(Infinity, '#000'); -} catch (e) { _thrown = e }; ok(_thrown && _thrown.name == "IndexSizeError" && _thrown.code == DOMException.INDEX_SIZE_ERR, "should throw IndexSizeError"); +} catch (e) { _thrown = e }; ok(_thrown && _thrown.name == "TypeError", "should throw TypeError"); var _thrown = undefined; try { g.addColorStop(-Infinity, '#000'); -} catch (e) { _thrown = e }; ok(_thrown && _thrown.name == "IndexSizeError" && _thrown.code == DOMException.INDEX_SIZE_ERR, "should throw IndexSizeError"); +} catch (e) { _thrown = e }; ok(_thrown && _thrown.name == "TypeError", "should throw TypeError"); var _thrown = undefined; try { g.addColorStop(NaN, '#000'); -} catch (e) { _thrown = e }; ok(_thrown && _thrown.name == "IndexSizeError" && _thrown.code == DOMException.INDEX_SIZE_ERR, "should throw IndexSizeError"); +} catch (e) { _thrown = e }; ok(_thrown && _thrown.name == "TypeError", "should throw TypeError"); } diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 51c849067ff..05d4c0ea7cf 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -716,8 +716,6 @@ static nsDOMClassInfoData sClassInfoData[] = { NS_DEFINE_CLASSINFO_DATA(SVGZoomEvent, nsEventSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(CanvasGradient, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(MozCanvasPrintState, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) @@ -1984,10 +1982,6 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_UI_EVENT_MAP_ENTRIES DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(CanvasGradient, nsIDOMCanvasGradient) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMCanvasGradient) - DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(MozCanvasPrintState, nsIDOMMozCanvasPrintState) DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozCanvasPrintState) DOM_CLASSINFO_MAP_END diff --git a/dom/base/nsDOMClassInfoClasses.h b/dom/base/nsDOMClassInfoClasses.h index c49bbfbf444..1c927878cff 100644 --- a/dom/base/nsDOMClassInfoClasses.h +++ b/dom/base/nsDOMClassInfoClasses.h @@ -116,7 +116,6 @@ DOMCI_CLASS(SVGRect) DOMCI_CLASS(SVGZoomEvent) // Canvas -DOMCI_CLASS(CanvasGradient) DOMCI_CLASS(MozCanvasPrintState) // WindowUtils diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 2e76150522c..19d71f99408 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -150,6 +150,10 @@ DOMInterfaces = { 'headerFile': 'BatteryManager.h' }, +'CanvasGradient': { + 'wrapperCache': False, +}, + 'CanvasRenderingContext2D': { 'implicitJSContext': [ 'createImageData', 'getImageData', 'strokeStyle', @@ -1507,7 +1511,6 @@ def addExternalHTMLElement(element): addExternalHTMLElement('HTMLFormElement') addExternalIface('ActivityOptions', nativeType='nsIDOMMozActivityOptions', headerFile='nsIDOMActivityOptions.h') -addExternalIface('CanvasGradient', headerFile='nsIDOMCanvasRenderingContext2D.h') addExternalIface('Counter') addExternalIface('CSSRule') addExternalIface('DeviceAcceleration', headerFile='nsIDOMDeviceMotionEvent.h', notflattened=True) diff --git a/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl b/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl index 9a6f479fda4..160c8847e8f 100644 --- a/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl +++ b/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl @@ -5,12 +5,6 @@ #include "nsISupports.idl" -[scriptable, uuid(bbb20a59-524e-4662-981e-5e142814b20c)] -interface nsIDOMCanvasGradient : nsISupports -{ - void addColorStop(in float offset, in DOMString color); -}; - /** * This interface remains only for the constants, for a context, use the * WebIDL/Paris bindings instead (CanvasRenderingContext2D.webidl). diff --git a/dom/webidl/CanvasRenderingContext2D.webidl b/dom/webidl/CanvasRenderingContext2D.webidl index bca7fe8fdeb..9aa27f3f058 100644 --- a/dom/webidl/CanvasRenderingContext2D.webidl +++ b/dom/webidl/CanvasRenderingContext2D.webidl @@ -11,7 +11,6 @@ * and create derivative works of this document. */ -interface CanvasGradient; interface HitRegionOptions; interface Window; @@ -51,9 +50,9 @@ interface CanvasRenderingContext2D { attribute any strokeStyle; // (default black) [GetterThrows] attribute any fillStyle; // (default black) - [Throws] + [Creator] CanvasGradient createLinearGradient(double x0, double y0, double x1, double y1); - [Throws] + [Creator, Throws] CanvasGradient createRadialGradient(double x0, double y0, double r0, double x1, double y1, double r1); [Creator, Throws] CanvasPattern createPattern((HTMLImageElement or HTMLCanvasElement or HTMLVideoElement) image, [TreatNullAs=EmptyString] DOMString repetition); @@ -263,6 +262,13 @@ interface CanvasPathMethods { // NOT IMPLEMENTED [LenientFloat] void ellipse(double x, double y, double radiusX, double radiusY, double rotation, double startAngle, double endAngle, boolean anticlockwise); }; +interface CanvasGradient { + // opaque object + [Throws] + // addColorStop should take a double + void addColorStop(float offset, DOMString color); +}; + interface CanvasPattern { // opaque object // void setTransform(SVGMatrix transform); diff --git a/js/xpconnect/src/dom_quickstubs.qsconf b/js/xpconnect/src/dom_quickstubs.qsconf index 8385f21d627..817040abcb5 100644 --- a/js/xpconnect/src/dom_quickstubs.qsconf +++ b/js/xpconnect/src/dom_quickstubs.qsconf @@ -50,11 +50,6 @@ members = [ #'nsIDOMLocation.hostname', #'nsIDOMLocation.href', - # dom/interfaces/canvas - # - # canvas friends - 'nsIDOMCanvasGradient.*', - # dom/interfaces/core 'nsIDOMDOMStringList.*', @@ -142,8 +137,6 @@ members = [ # irregularFilenames = { # stowaways - 'nsIDOMCanvasGradient': 'nsIDOMCanvasRenderingContext2D', - 'nsIDOMBlob': 'nsIDOMFile', 'nsIIndexedDatabaseUsageCallback': 'nsIIndexedDatabaseManager', @@ -170,10 +163,6 @@ customIncludes = [ 'mozilla/dom/UIEventBinding.h', ] -customReturnInterfaces = [ - 'nsIDOMCanvasGradient', - ] - nsIDOMStorage_Clear_customMethodCallCode = """ rv = self->Clear(); if (NS_SUCCEEDED(rv)) diff --git a/js/xpconnect/src/qsgen.py b/js/xpconnect/src/qsgen.py index eacf954ccc8..02a312c0640 100644 --- a/js/xpconnect/src/qsgen.py +++ b/js/xpconnect/src/qsgen.py @@ -226,7 +226,6 @@ class Configuration: # optional settings self.irregularFilenames = config.get('irregularFilenames', {}) self.customIncludes = config.get('customIncludes', []) - self.customReturnInterfaces = config.get('customReturnInterfaces', []) self.customMethodCalls = config.get('customMethodCalls', {}) self.newBindingProperties = config.get('newBindingProperties', {}) @@ -314,10 +313,6 @@ def readConfigFile(filename, includePath, cachedir): for member in iface.stubMembers: checkStubMember(member) - for iface in conf.customReturnInterfaces: - # just ensure that it exists so that we can grab it later - iface = getInterface(iface, errorLoc='looking for %s' % (iface,)) - return conf, interfaces @@ -1271,7 +1266,6 @@ def writeStubFile(filename, headerFilename, conf, interfaces): resulttypes = [] for iface in interfaces: resulttypes.extend(writeIncludesForInterface(iface)) - resulttypes.extend(conf.customReturnInterfaces) for customInclude in conf.customIncludes: f.write('#include "%s"\n' % customInclude) f.write("\n\n") From 8383676b3bad267f9c5d4c89cf7cd26a29c2be7d Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Fri, 26 Apr 2013 10:55:56 -0400 Subject: [PATCH 124/155] Bug 856472: Wrappercache CanvasGradient r=bz --- content/canvas/src/CanvasGradient.h | 24 ++++++++++++----- .../canvas/src/CanvasRenderingContext2D.cpp | 27 ++++++++++++------- dom/bindings/Bindings.conf | 4 --- 3 files changed, 36 insertions(+), 19 deletions(-) diff --git a/content/canvas/src/CanvasGradient.h b/content/canvas/src/CanvasGradient.h index b2439701d19..4c06960cc94 100644 --- a/content/canvas/src/CanvasGradient.h +++ b/content/canvas/src/CanvasGradient.h @@ -10,6 +10,7 @@ #include "mozilla/RefPtr.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" #include "mozilla/gfx/2D.h" +#include "nsWrapperCache.h" #define NS_CANVASGRADIENTAZURE_PRIVATE_IID \ {0x28425a6a, 0x90e0, 0x4d42, {0x9c, 0x75, 0xff, 0x60, 0x09, 0xb3, 0x10, 0xa8}} @@ -17,10 +18,13 @@ namespace mozilla { namespace dom { -class CanvasGradient : public nsISupports +class CanvasGradient : public nsISupports, + public nsWrapperCache { public: NS_DECLARE_STATIC_IID_ACCESSOR(NS_CANVASGRADIENTAZURE_PRIVATE_IID) + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(CanvasGradient) enum Type { @@ -46,8 +50,6 @@ public: return mStops; } - NS_DECL_ISUPPORTS - // WebIDL void AddColorStop(float offset, const nsAString& colorstr, ErrorResult& rv); @@ -56,10 +58,20 @@ public: return CanvasGradientBinding::Wrap(aCx, aScope, this); } -protected: - CanvasGradient(Type aType) : mType(aType) - {} + CanvasRenderingContext2D* GetParentObject() + { + return mContext; + } +protected: + CanvasGradient(CanvasRenderingContext2D* aContext, Type aType) + : mContext(aContext) + , mType(aType) + { + SetIsDOMBinding(); + } + + nsRefPtr mContext; nsTArray mRawStops; mozilla::RefPtr mStops; Type mType; diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index 56e3814a38b..dd670486ed3 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -150,9 +150,10 @@ NS_MEMORY_REPORTER_IMPLEMENT(CanvasAzureMemory, class CanvasRadialGradient : public CanvasGradient { public: - CanvasRadialGradient(const Point &aBeginOrigin, Float aBeginRadius, + CanvasRadialGradient(CanvasRenderingContext2D* aContext, + const Point &aBeginOrigin, Float aBeginRadius, const Point &aEndOrigin, Float aEndRadius) - : CanvasGradient(RADIAL) + : CanvasGradient(aContext, RADIAL) , mCenter1(aBeginOrigin) , mCenter2(aEndOrigin) , mRadius1(aBeginRadius) @@ -169,8 +170,9 @@ public: class CanvasLinearGradient : public CanvasGradient { public: - CanvasLinearGradient(const Point &aBegin, const Point &aEnd) - : CanvasGradient(LINEAR) + CanvasLinearGradient(CanvasRenderingContext2D* aContext, + const Point &aBegin, const Point &aEnd) + : CanvasGradient(aContext, LINEAR) , mBegin(aBegin) , mEnd(aEnd) { @@ -394,10 +396,13 @@ CanvasGradient::AddColorStop(float offset, const nsAString& colorstr, ErrorResul NS_DEFINE_STATIC_IID_ACCESSOR(CanvasGradient, NS_CANVASGRADIENTAZURE_PRIVATE_IID) -NS_IMPL_ADDREF(CanvasGradient) -NS_IMPL_RELEASE(CanvasGradient) +NS_IMPL_CYCLE_COLLECTING_ADDREF(CanvasGradient) +NS_IMPL_CYCLE_COLLECTING_RELEASE(CanvasGradient) -NS_INTERFACE_MAP_BEGIN(CanvasGradient) +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(CanvasGradient, mContext) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(CanvasGradient) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(mozilla::dom::CanvasGradient) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END @@ -471,6 +476,8 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CanvasRenderingContext2D) for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) { ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[STYLE_STROKE]); ImplCycleCollectionUnlink(tmp->mStyleStack[i].patternStyles[STYLE_FILL]); + ImplCycleCollectionUnlink(tmp->mStyleStack[i].gradientStyles[STYLE_STROKE]); + ImplCycleCollectionUnlink(tmp->mStyleStack[i].gradientStyles[STYLE_FILL]); } NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END @@ -480,6 +487,8 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CanvasRenderingContext2D) for (uint32_t i = 0; i < tmp->mStyleStack.Length(); i++) { ImplCycleCollectionTraverse(cb, tmp->mStyleStack[i].patternStyles[STYLE_STROKE], "Stroke CanvasPattern"); ImplCycleCollectionTraverse(cb, tmp->mStyleStack[i].patternStyles[STYLE_FILL], "Fill CanvasPattern"); + ImplCycleCollectionTraverse(cb, tmp->mStyleStack[i].gradientStyles[STYLE_STROKE], "Stroke CanvasGradient"); + ImplCycleCollectionTraverse(cb, tmp->mStyleStack[i].gradientStyles[STYLE_FILL], "Fill CanvasGradient"); } NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END @@ -1359,7 +1368,7 @@ already_AddRefed CanvasRenderingContext2D::CreateLinearGradient(double x0, double y0, double x1, double y1) { nsRefPtr grad = - new CanvasLinearGradient(Point(x0, y0), Point(x1, y1)); + new CanvasLinearGradient(this, Point(x0, y0), Point(x1, y1)); return grad.forget(); } @@ -1375,7 +1384,7 @@ CanvasRenderingContext2D::CreateRadialGradient(double x0, double y0, double r0, } nsRefPtr grad = - new CanvasRadialGradient(Point(x0, y0), r0, Point(x1, y1), r1); + new CanvasRadialGradient(this, Point(x0, y0), r0, Point(x1, y1), r1); return grad.forget(); } diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 19d71f99408..7f7254e0aba 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -150,10 +150,6 @@ DOMInterfaces = { 'headerFile': 'BatteryManager.h' }, -'CanvasGradient': { - 'wrapperCache': False, -}, - 'CanvasRenderingContext2D': { 'implicitJSContext': [ 'createImageData', 'getImageData', 'strokeStyle', From 4a6954e46d5470b7ce0868f632473cd15c1fc22a Mon Sep 17 00:00:00 2001 From: David Zbarsky Date: Fri, 26 Apr 2013 10:55:56 -0400 Subject: [PATCH 125/155] Bug 856472: Fix includes and WrapObject r=me --- content/canvas/src/CanvasGradient.h | 4 ++-- content/canvas/src/CanvasPattern.h | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/content/canvas/src/CanvasGradient.h b/content/canvas/src/CanvasGradient.h index 4c06960cc94..89af4d63a98 100644 --- a/content/canvas/src/CanvasGradient.h +++ b/content/canvas/src/CanvasGradient.h @@ -5,10 +5,10 @@ #ifndef mozilla_dom_CanvasGradient_h #define mozilla_dom_CanvasGradient_h -#include "nsIDOMCanvasRenderingContext2D.h" #include "nsTArray.h" #include "mozilla/RefPtr.h" #include "mozilla/dom/CanvasRenderingContext2DBinding.h" +#include "mozilla/dom/CanvasRenderingContext2D.h" #include "mozilla/gfx/2D.h" #include "nsWrapperCache.h" @@ -53,7 +53,7 @@ public: // WebIDL void AddColorStop(float offset, const nsAString& colorstr, ErrorResult& rv); - JSObject* WrapObject(JSContext* aCx, JSObject* aScope) + JSObject* WrapObject(JSContext* aCx, JS::Handle aScope) { return CanvasGradientBinding::Wrap(aCx, aScope, this); } diff --git a/content/canvas/src/CanvasPattern.h b/content/canvas/src/CanvasPattern.h index 18860248d70..82e45c41896 100644 --- a/content/canvas/src/CanvasPattern.h +++ b/content/canvas/src/CanvasPattern.h @@ -6,6 +6,7 @@ #define mozilla_dom_CanvasPattern_h #include "mozilla/dom/CanvasRenderingContext2DBinding.h" +#include "mozilla/dom/CanvasRenderingContext2D.h" #include "mozilla/RefPtr.h" #include "nsISupports.h" #include "nsWrapperCache.h" @@ -53,7 +54,7 @@ public: SetIsDOMBinding(); } - JSObject* WrapObject(JSContext* aCx, JSObject* aScope) + JSObject* WrapObject(JSContext* aCx, JS::Handle aScope) { return CanvasPatternBinding::Wrap(aCx, aScope, this); } From e651f7c63639db4b94bc7308351f1a194d49faa2 Mon Sep 17 00:00:00 2001 From: Dave Hunt Date: Fri, 26 Apr 2013 16:16:33 +0100 Subject: [PATCH 126/155] Bug 866111 - Bump marionette_client version to 0.5.25. r=mdas --- testing/marionette/client/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testing/marionette/client/setup.py b/testing/marionette/client/setup.py index 4a4e4e410cc..7276b0c0aa9 100644 --- a/testing/marionette/client/setup.py +++ b/testing/marionette/client/setup.py @@ -1,7 +1,7 @@ import os from setuptools import setup, find_packages -version = '0.5.24' +version = '0.5.25' # get documentation from the README try: From cd12070796c6aca2051f54b272bca79a919a454d Mon Sep 17 00:00:00 2001 From: Ryan VanderMeulen Date: Fri, 26 Apr 2013 12:03:03 -0400 Subject: [PATCH 127/155] Backed out changeset 6604b700492c (bug 863018) for suspicion of causing Windows mochitest b-c leaks. CLOSED TREE --- js/src/ion/CodeGenerator.cpp | 134 +++--------------- js/src/ion/Ion.cpp | 16 +-- js/src/ion/IonCompartment.h | 11 -- js/src/ion/IonMacroAssembler.cpp | 6 - js/src/ion/IonMacroAssembler.h | 1 - js/src/ion/LIR-Common.h | 21 +-- js/src/ion/Lowering.cpp | 9 +- js/src/ion/arm/Assembler-arm.h | 2 +- js/src/ion/arm/MacroAssembler-arm.h | 3 - js/src/ion/x64/Assembler-x64.h | 14 -- js/src/ion/x64/MacroAssembler-x64.h | 4 - js/src/ion/x86/Assembler-x86.h | 1 - js/src/ion/x86/MacroAssembler-x86.h | 4 - .../jit-test/tests/ion/string-concat-short.js | 13 -- js/src/vm/String.cpp | 18 --- js/src/vm/String.h | 4 - 16 files changed, 28 insertions(+), 233 deletions(-) delete mode 100644 js/src/jit-test/tests/ion/string-concat-short.js diff --git a/js/src/ion/CodeGenerator.cpp b/js/src/ion/CodeGenerator.cpp index 510a13857e8..42c2b40051a 100644 --- a/js/src/ion/CodeGenerator.cpp +++ b/js/src/ion/CodeGenerator.cpp @@ -3548,152 +3548,52 @@ CodeGenerator::visitConcat(LConcat *lir) Register rhs = ToRegister(lir->rhs()); Register output = ToRegister(lir->output()); - - JS_ASSERT(lhs == CallTempReg0); - JS_ASSERT(rhs == CallTempReg1); - JS_ASSERT(ToRegister(lir->temp1()) == CallTempReg2); - JS_ASSERT(ToRegister(lir->temp2()) == CallTempReg3); - JS_ASSERT(ToRegister(lir->temp3()) == CallTempReg4); - JS_ASSERT(ToRegister(lir->temp4()) == CallTempReg5); - JS_ASSERT(output == CallTempReg6); + Register temp = ToRegister(lir->temp()); OutOfLineCode *ool = oolCallVM(ConcatStringsInfo, lir, (ArgList(), lhs, rhs), StoreRegisterTo(output)); if (!ool) return false; - IonCode *stringConcatStub = gen->ionCompartment()->stringConcatStub(); - masm.call(stringConcatStub); - masm.branchTestPtr(Assembler::Zero, output, output, ool->entry()); - - masm.bind(ool->rejoin()); - return true; -} - -static void -CopyStringChars(MacroAssembler &masm, Register to, Register from, Register len, Register scratch) -{ - // Copy |len| jschars from |from| to |to|. Assumes len > 0 (checked below in - // debug builds), and when done |to| must point to the next available char. - -#ifdef DEBUG - Label ok; - masm.branch32(Assembler::GreaterThan, len, Imm32(0), &ok); - masm.breakpoint(); - masm.bind(&ok); -#endif - - JS_STATIC_ASSERT(sizeof(jschar) == 2); - - Label start; - masm.bind(&start); - masm.load16ZeroExtend(Address(from, 0), scratch); - masm.store16(scratch, Address(to, 0)); - masm.addPtr(Imm32(2), from); - masm.addPtr(Imm32(2), to); - masm.sub32(Imm32(1), len); - masm.j(Assembler::NonZero, &start); -} - -IonCode * -IonCompartment::generateStringConcatStub(JSContext *cx) -{ - MacroAssembler masm(cx); - - Register lhs = CallTempReg0; - Register rhs = CallTempReg1; - Register temp1 = CallTempReg2; - Register temp2 = CallTempReg3; - Register temp3 = CallTempReg4; - Register temp4 = CallTempReg5; - Register output = CallTempReg6; - - Label failure; + Label done; // If lhs is empty, return rhs. Label leftEmpty; - masm.loadStringLength(lhs, temp1); - masm.branchTest32(Assembler::Zero, temp1, temp1, &leftEmpty); + masm.loadStringLength(lhs, temp); + masm.branchTest32(Assembler::Zero, temp, temp, &leftEmpty); // If rhs is empty, return lhs. Label rightEmpty; - masm.loadStringLength(rhs, temp2); - masm.branchTest32(Assembler::Zero, temp2, temp2, &rightEmpty); + masm.loadStringLength(rhs, output); + masm.branchTest32(Assembler::Zero, output, output, &rightEmpty); - masm.add32(temp1, temp2); - - // Check if we can use a JSShortString. - Label isShort; - masm.branch32(Assembler::BelowOrEqual, temp2, Imm32(JSShortString::MAX_SHORT_LENGTH), - &isShort); - - // Ensure result length <= JSString::MAX_LENGTH. - masm.branch32(Assembler::Above, temp1, Imm32(JSString::MAX_LENGTH), &failure); + // Ensure total length <= JSString::MAX_LENGTH. + masm.add32(output, temp); + masm.branch32(Assembler::Above, temp, Imm32(JSString::MAX_LENGTH), ool->entry()); // Allocate a new rope. - masm.newGCString(output, &failure); + masm.newGCString(output, ool->entry()); // Store lengthAndFlags. JS_STATIC_ASSERT(JSString::ROPE_FLAGS == 0); - masm.lshiftPtr(Imm32(JSString::LENGTH_SHIFT), temp2); - masm.storePtr(temp2, Address(output, JSString::offsetOfLengthAndFlags())); + masm.lshiftPtr(Imm32(JSString::LENGTH_SHIFT), temp); + masm.storePtr(temp, Address(output, JSString::offsetOfLengthAndFlags())); // Store left and right nodes. masm.storePtr(lhs, Address(output, JSRope::offsetOfLeft())); masm.storePtr(rhs, Address(output, JSRope::offsetOfRight())); - masm.ret(); + masm.jump(&done); masm.bind(&leftEmpty); masm.mov(rhs, output); - masm.ret(); + masm.jump(&done); masm.bind(&rightEmpty); masm.mov(lhs, output); - masm.ret(); - masm.bind(&isShort); - - // State: lhs length in temp1, result length in temp2. - - // Ensure both strings are linear (flags != 0). - JS_STATIC_ASSERT(JSString::ROPE_FLAGS == 0); - masm.branchTestPtr(Assembler::Zero, Address(lhs, JSString::offsetOfLengthAndFlags()), - Imm32(JSString::FLAGS_MASK), &failure); - masm.branchTestPtr(Assembler::Zero, Address(rhs, JSString::offsetOfLengthAndFlags()), - Imm32(JSString::FLAGS_MASK), &failure); - - // Allocate a JSShortString. - masm.newGCShortString(output, &failure); - - // Set lengthAndFlags. - masm.lshiftPtr(Imm32(JSString::LENGTH_SHIFT), temp2); - masm.orPtr(Imm32(JSString::FIXED_FLAGS), temp2); - masm.storePtr(temp2, Address(output, JSString::offsetOfLengthAndFlags())); - - // Set chars pointer, keep in temp2 for copy loop below. - masm.computeEffectiveAddress(Address(output, JSShortString::offsetOfInlineStorage()), temp2); - masm.storePtr(temp2, Address(output, JSShortString::offsetOfChars())); - - // Copy lhs chars. Temp1 still holds the lhs length. Note that this - // advances temp2 to point to the next char. - masm.loadPtr(Address(lhs, JSString::offsetOfChars()), temp3); - CopyStringChars(masm, temp2, temp3, temp1, temp4); - - // Copy rhs chars. - masm.loadPtr(Address(rhs, JSString::offsetOfChars()), temp3); - masm.loadStringLength(rhs, temp1); - CopyStringChars(masm, temp2, temp3, temp1, temp4); - - // Null-terminate. - masm.store16(Imm32(0), Address(temp2, 0)); - masm.ret(); - - masm.bind(&failure); - masm.movePtr(ImmWord((void *)NULL), output); - masm.ret(); - - Linker linker(masm); - return linker.newCode(cx, JSC::OTHER_CODE); + masm.bind(&done); + masm.bind(ool->rejoin()); + return true; } typedef bool (*CharCodeAtFn)(JSContext *, HandleString, int32_t, uint32_t *); diff --git a/js/src/ion/Ion.cpp b/js/src/ion/Ion.cpp index a894fdb9ee2..10c68f8e182 100644 --- a/js/src/ion/Ion.cpp +++ b/js/src/ion/Ion.cpp @@ -183,6 +183,9 @@ IonRuntime::initialize(JSContext *cx) { AutoEnterAtomsCompartment ac(cx); + if (!cx->compartment->ensureIonCompartmentExists(cx)) + return false; + IonContext ictx(cx, NULL); AutoFlushCache afc("IonRuntime::initialize"); @@ -190,9 +193,6 @@ IonRuntime::initialize(JSContext *cx) if (!execAlloc_) return false; - if (!cx->compartment->ensureIonCompartmentExists(cx)) - return false; - functionWrappers_ = cx->new_(cx); if (!functionWrappers_ || !functionWrappers_->init()) return false; @@ -284,8 +284,7 @@ IonRuntime::freeOsrTempData() IonCompartment::IonCompartment(IonRuntime *rt) : rt(rt), stubCodes_(NULL), - baselineCallReturnAddr_(NULL), - stringConcatStub_(NULL) + baselineCallReturnAddr_(NULL) { } @@ -301,11 +300,6 @@ IonCompartment::initialize(JSContext *cx) stubCodes_ = cx->new_(cx); if (!stubCodes_ || !stubCodes_->init()) return false; - - stringConcatStub_ = generateStringConcatStub(cx); - if (!stringConcatStub_) - return false; - return true; } @@ -360,8 +354,6 @@ IonCompartment::mark(JSTracer *trc, JSCompartment *compartment) // Free temporary OSR buffer. rt->freeOsrTempData(); - - MarkIonCodeRoot(trc, &stringConcatStub_, "stringConcatStub"); } void diff --git a/js/src/ion/IonCompartment.h b/js/src/ion/IonCompartment.h index 76536cac636..472cf55fba5 100644 --- a/js/src/ion/IonCompartment.h +++ b/js/src/ion/IonCompartment.h @@ -197,13 +197,6 @@ class IonCompartment // Allocated space for optimized baseline stubs. OptimizedICStubSpace optimizedStubSpace_; - // Stub to concatenate two strings inline. Note that it can't be - // stored in IonRuntime because masm.newGCString bakes in - // zone-specific pointers. - IonCode *stringConcatStub_; - - IonCode *generateStringConcatStub(JSContext *cx); - public: IonCode *getVMWrapper(const VMFunction &f); @@ -291,10 +284,6 @@ class IonCompartment return rt->debugTrapHandler(cx); } - IonCode *stringConcatStub() { - return stringConcatStub_; - } - AutoFlushCache *flusher() { return rt->flusher(); } diff --git a/js/src/ion/IonMacroAssembler.cpp b/js/src/ion/IonMacroAssembler.cpp index 5055193dda5..4742e816df8 100644 --- a/js/src/ion/IonMacroAssembler.cpp +++ b/js/src/ion/IonMacroAssembler.cpp @@ -463,12 +463,6 @@ MacroAssembler::newGCString(const Register &result, Label *fail) newGCThing(result, js::gc::FINALIZE_STRING, fail); } -void -MacroAssembler::newGCShortString(const Register &result, Label *fail) -{ - newGCThing(result, js::gc::FINALIZE_SHORT_STRING, fail); -} - void MacroAssembler::parNewGCThing(const Register &result, const Register &threadContextReg, diff --git a/js/src/ion/IonMacroAssembler.h b/js/src/ion/IonMacroAssembler.h index cb0c833cc5d..405760e6b36 100644 --- a/js/src/ion/IonMacroAssembler.h +++ b/js/src/ion/IonMacroAssembler.h @@ -580,7 +580,6 @@ class MacroAssembler : public MacroAssemblerSpecific void newGCThing(const Register &result, gc::AllocKind allocKind, Label *fail); void newGCThing(const Register &result, JSObject *templateObject, Label *fail); void newGCString(const Register &result, Label *fail); - void newGCShortString(const Register &result, Label *fail); void parNewGCThing(const Register &result, const Register &threadContextReg, diff --git a/js/src/ion/LIR-Common.h b/js/src/ion/LIR-Common.h index 6e381646f1d..abbc5aaa215 100644 --- a/js/src/ion/LIR-Common.h +++ b/js/src/ion/LIR-Common.h @@ -2243,19 +2243,15 @@ class LBinaryV : public LCallInstructionHelper }; // Adds two string, returning a string. -class LConcat : public LInstructionHelper<1, 2, 4> +class LConcat : public LInstructionHelper<1, 2, 1> { public: LIR_HEADER(Concat) - LConcat(const LAllocation &lhs, const LAllocation &rhs, const LDefinition &temp1, - const LDefinition &temp2, const LDefinition &temp3, const LDefinition &temp4) { + LConcat(const LAllocation &lhs, const LAllocation &rhs, const LDefinition &temp) { setOperand(0, lhs); setOperand(1, rhs); - setTemp(0, temp1); - setTemp(1, temp2); - setTemp(2, temp3); - setTemp(3, temp4); + setTemp(0, temp); } const LAllocation *lhs() { @@ -2264,18 +2260,9 @@ class LConcat : public LInstructionHelper<1, 2, 4> const LAllocation *rhs() { return this->getOperand(1); } - const LDefinition *temp1() { + const LDefinition *temp() { return this->getTemp(0); } - const LDefinition *temp2() { - return this->getTemp(1); - } - const LDefinition *temp3() { - return this->getTemp(2); - } - const LDefinition *temp4() { - return this->getTemp(3); - } }; // Get uint16 character code from a string. diff --git a/js/src/ion/Lowering.cpp b/js/src/ion/Lowering.cpp index 78001f5a40f..c2407718d6a 100644 --- a/js/src/ion/Lowering.cpp +++ b/js/src/ion/Lowering.cpp @@ -1307,13 +1307,8 @@ LIRGenerator::visitConcat(MConcat *ins) JS_ASSERT(rhs->type() == MIRType_String); JS_ASSERT(ins->type() == MIRType_String); - LConcat *lir = new LConcat(useFixed(lhs, CallTempReg0), - useFixed(rhs, CallTempReg1), - tempFixed(CallTempReg2), - tempFixed(CallTempReg3), - tempFixed(CallTempReg4), - tempFixed(CallTempReg5)); - if (!defineFixed(lir, ins, LAllocation(AnyRegister(CallTempReg6)))) + LConcat *lir = new LConcat(useRegister(lhs), useRegister(rhs), temp()); + if (!define(lir, ins)) return false; return assignSafepoint(lir, ins); } diff --git a/js/src/ion/arm/Assembler-arm.h b/js/src/ion/arm/Assembler-arm.h index 68acd6338f1..80f1b773725 100644 --- a/js/src/ion/arm/Assembler-arm.h +++ b/js/src/ion/arm/Assembler-arm.h @@ -55,7 +55,7 @@ static const Register CallTempReg2 = r7; static const Register CallTempReg3 = r8; static const Register CallTempReg4 = r0; static const Register CallTempReg5 = r1; -static const Register CallTempReg6 = r2; + static const Register IntArgReg0 = r0; static const Register IntArgReg1 = r1; diff --git a/js/src/ion/arm/MacroAssembler-arm.h b/js/src/ion/arm/MacroAssembler-arm.h index 54e8ea5d552..cbd46d0c1c8 100644 --- a/js/src/ion/arm/MacroAssembler-arm.h +++ b/js/src/ion/arm/MacroAssembler-arm.h @@ -853,9 +853,6 @@ class MacroAssemblerARMCompat : public MacroAssemblerARM void branchTestPtr(Condition cond, const Register &lhs, const Imm32 rhs, Label *label) { branchTest32(cond, lhs, rhs, label); } - void branchTestPtr(Condition cond, const Address &lhs, Imm32 imm, Label *label) { - branchTest32(cond, lhs, imm, label); - } void branchPtr(Condition cond, Register lhs, Register rhs, Label *label) { branch32(cond, lhs, rhs, label); } diff --git a/js/src/ion/x64/Assembler-x64.h b/js/src/ion/x64/Assembler-x64.h index 2621dab8319..37837bcd80a 100644 --- a/js/src/ion/x64/Assembler-x64.h +++ b/js/src/ion/x64/Assembler-x64.h @@ -82,7 +82,6 @@ static const Register CallTempReg2 = rbx; static const Register CallTempReg3 = rcx; static const Register CallTempReg4 = rsi; static const Register CallTempReg5 = rdx; -static const Register CallTempReg6 = rbp; // Different argument registers for WIN64 #if defined(_WIN64) @@ -627,19 +626,6 @@ class Assembler : public AssemblerX86Shared void testq(const Register &lhs, const Register &rhs) { masm.testq_rr(rhs.code(), lhs.code()); } - void testq(const Operand &lhs, Imm32 rhs) { - switch (lhs.kind()) { - case Operand::REG: - masm.testq_i32r(rhs.value, lhs.reg()); - break; - case Operand::REG_DISP: - masm.testq_i32m(rhs.value, lhs.disp(), lhs.base()); - break; - default: - JS_NOT_REACHED("unexpected operand kind"); - break; - } - } void jmp(void *target, Relocation::Kind reloc = Relocation::HARDCODED) { JmpSrc src = masm.jmp(); diff --git a/js/src/ion/x64/MacroAssembler-x64.h b/js/src/ion/x64/MacroAssembler-x64.h index 4d5a5372826..8b21e4500f2 100644 --- a/js/src/ion/x64/MacroAssembler-x64.h +++ b/js/src/ion/x64/MacroAssembler-x64.h @@ -510,10 +510,6 @@ class MacroAssemblerX64 : public MacroAssemblerX86Shared testq(lhs, imm); j(cond, label); } - void branchTestPtr(Condition cond, const Address &lhs, Imm32 imm, Label *label) { - testq(Operand(lhs), imm); - j(cond, label); - } void decBranchPtr(Condition cond, const Register &lhs, Imm32 imm, Label *label) { subPtr(imm, lhs); j(cond, label); diff --git a/js/src/ion/x86/Assembler-x86.h b/js/src/ion/x86/Assembler-x86.h index 9f4046c2ccc..3099f80a9b6 100644 --- a/js/src/ion/x86/Assembler-x86.h +++ b/js/src/ion/x86/Assembler-x86.h @@ -54,7 +54,6 @@ static const Register CallTempReg2 = ebx; static const Register CallTempReg3 = ecx; static const Register CallTempReg4 = esi; static const Register CallTempReg5 = edx; -static const Register CallTempReg6 = ebp; // We have no arg regs, so our NonArgRegs are just our CallTempReg* static const Register CallTempNonArgRegs[] = { edi, eax, ebx, ecx, esi, edx }; diff --git a/js/src/ion/x86/MacroAssembler-x86.h b/js/src/ion/x86/MacroAssembler-x86.h index 698c1f83ba1..8c2a88d39d6 100644 --- a/js/src/ion/x86/MacroAssembler-x86.h +++ b/js/src/ion/x86/MacroAssembler-x86.h @@ -544,10 +544,6 @@ class MacroAssemblerX86 : public MacroAssemblerX86Shared testl(lhs, imm); j(cond, label); } - void branchTestPtr(Condition cond, const Address &lhs, Imm32 imm, Label *label) { - testl(Operand(lhs), imm); - j(cond, label); - } void decBranchPtr(Condition cond, const Register &lhs, Imm32 imm, Label *label) { subPtr(imm, lhs); j(cond, label); diff --git a/js/src/jit-test/tests/ion/string-concat-short.js b/js/src/jit-test/tests/ion/string-concat-short.js deleted file mode 100644 index a0108df0445..00000000000 --- a/js/src/jit-test/tests/ion/string-concat-short.js +++ /dev/null @@ -1,13 +0,0 @@ -function f() { - var res = 0; - for (var i=0; i<100; i++) { - var s = "test" + i; - res += s.length; - assertEq(s[0], "t"); - assertEq(s[3], "t"); - if (i > 90) - assertEq(s[4], "9"); - } - return res; -} -assertEq(f(), 590); diff --git a/js/src/vm/String.cpp b/js/src/vm/String.cpp index 1bb9b86c641..dc62d96247e 100644 --- a/js/src/vm/String.cpp +++ b/js/src/vm/String.cpp @@ -319,24 +319,6 @@ js::ConcatStrings(JSContext *cx, if (!JSString::validateLength(cxIfCanGC, wholeLength)) return NULL; - if (JSShortString::lengthFits(wholeLength)) { - JSShortString *str = js_NewGCShortString(cx); - if (!str) - return NULL; - const jschar *leftChars = left->getChars(cx); - if (!leftChars) - return NULL; - const jschar *rightChars = right->getChars(cx); - if (!rightChars) - return NULL; - - jschar *buf = str->init(wholeLength); - PodCopy(buf, leftChars, leftLen); - PodCopy(buf + leftLen, rightChars, rightLen); - buf[wholeLength] = 0; - return str; - } - return JSRope::new_(cx, left, right, wholeLength); } diff --git a/js/src/vm/String.h b/js/src/vm/String.h index e02cbc88ba3..a0c8514509c 100644 --- a/js/src/vm/String.h +++ b/js/src/vm/String.h @@ -677,10 +677,6 @@ class JSInlineString : public JSFlatString static bool lengthFits(size_t length) { return length <= MAX_INLINE_LENGTH; } - - static size_t offsetOfInlineStorage() { - return offsetof(JSInlineString, d.inlineStorage); - } }; JS_STATIC_ASSERT(sizeof(JSInlineString) == sizeof(JSString)); From 6bdabef99ed55775c8596fa1900e73e1727f3e97 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Fri, 26 Apr 2013 20:02:39 +0300 Subject: [PATCH 128/155] Bug 866091 - Intermittent devtools/netmonitor/test/browser_net_prefs-reload.js | Test timed out | Found a tab after previous test timed out: http://example.com/browser/browser/devtools/netmonitor/test/html_simple-test-page.html and tons of fallout, r=rcampbell --- browser/devtools/netmonitor/test/browser_net_prefs-reload.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/devtools/netmonitor/test/browser_net_prefs-reload.js b/browser/devtools/netmonitor/test/browser_net_prefs-reload.js index 6ce8d993769..d5fd61c43dc 100644 --- a/browser/devtools/netmonitor/test/browser_net_prefs-reload.js +++ b/browser/devtools/netmonitor/test/browser_net_prefs-reload.js @@ -11,7 +11,7 @@ function test() { // This test reopens the network monitor a bunch of times, for different // hosts (bottom, side, window). This seems to be slow on debug builds. - requestLongerTimeout(2); + requestLongerTimeout(3); let prefsToCheck = { networkDetailsWidth: { From c83337e70e164888255be0cc8fade3ba8de8f35b Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Fri, 26 Apr 2013 12:02:19 -0400 Subject: [PATCH 129/155] Investigation for bug 866079 - Make the Command class live in the global scope in the hopes of getting better stack traces --- .../media/webaudio/ScriptProcessorNode.cpp | 219 +++++++++--------- 1 file changed, 111 insertions(+), 108 deletions(-) diff --git a/content/media/webaudio/ScriptProcessorNode.cpp b/content/media/webaudio/ScriptProcessorNode.cpp index e4212079b6b..84ff1afbf27 100644 --- a/content/media/webaudio/ScriptProcessorNode.cpp +++ b/content/media/webaudio/ScriptProcessorNode.cpp @@ -234,114 +234,7 @@ private: } } - void SendBuffersToMainThread(AudioNodeStream* aStream) - { - MOZ_ASSERT(!NS_IsMainThread()); - - // we now have a full input buffer ready to be sent to the main thread. - TrackTicks playbackTick = mSource->GetCurrentPosition(); - // Add the duration of the current sample - playbackTick += WEBAUDIO_BLOCK_SIZE; - // Add the delay caused by the main thread - playbackTick += mSharedBuffers->DelaySoFar(); - // Compute the playback time in the coordinate system of the destination - double playbackTime = - WebAudioUtils::StreamPositionToDestinationTime(playbackTick, - mSource, - mDestination); - - class Command : public nsRunnable - { - public: - Command(AudioNodeStream* aStream, - InputChannels& aInputChannels, - double aPlaybackTime, - bool aNullInput) - : mStream(aStream) - , mPlaybackTime(aPlaybackTime) - , mNullInput(aNullInput) - { - mInputChannels.SetLength(aInputChannels.Length()); - if (!aNullInput) { - for (uint32_t i = 0; i < mInputChannels.Length(); ++i) { - mInputChannels[i] = aInputChannels[i].forget(); - } - } - } - - NS_IMETHODIMP Run() - { - // If it's not safe to run scripts right now, schedule this to run later - if (!nsContentUtils::IsSafeToRunScript()) { - nsContentUtils::AddScriptRunner(this); - return NS_OK; - } - - nsRefPtr node; - { - // No need to keep holding the lock for the whole duration of this - // function, since we're holding a strong reference to it, so if - // we can obtain the reference, we will hold the node alive in - // this function. - MutexAutoLock lock(mStream->Engine()->NodeMutex()); - node = static_cast(mStream->Engine()->Node()); - } - if (!node) { - return NS_OK; - } - - AutoPushJSContext cx(node->Context()->GetJSContext()); - if (cx) { - JSAutoRequest ar(cx); - - // Create the input buffer - nsRefPtr inputBuffer; - if (!mNullInput) { - inputBuffer = new AudioBuffer(node->Context(), - node->BufferSize(), - node->Context()->SampleRate()); - if (!inputBuffer->InitializeBuffers(mInputChannels.Length(), cx)) { - return NS_OK; - } - // Put the channel data inside it - for (uint32_t i = 0; i < mInputChannels.Length(); ++i) { - inputBuffer->SetRawChannelContents(cx, i, mInputChannels[i]); - } - } - - // Ask content to produce data in the output buffer - // Note that we always avoid creating the output buffer here, and we try to - // avoid creating the input buffer as well. The AudioProcessingEvent class - // knows how to lazily create them if needed once the script tries to access - // them. Otherwise, we may be able to get away without creating them! - nsRefPtr event = new AudioProcessingEvent(node, nullptr, nullptr); - event->InitEvent(inputBuffer, - mInputChannels.Length(), - mPlaybackTime); - node->DispatchTrustedEvent(event); - - // Steal the output buffers - nsRefPtr output; - if (event->HasOutputBuffer()) { - output = event->OutputBuffer()->GetThreadSharedChannelsForRate(cx); - } - - // Append it to our output buffer queue - node->GetSharedBuffers()->FinishProducingOutputBuffer(output, node->BufferSize()); - } - return NS_OK; - } - private: - nsRefPtr mStream; - InputChannels mInputChannels; - double mPlaybackTime; - bool mNullInput; - }; - - NS_DispatchToMainThread(new Command(aStream, mInputChannels, - playbackTime, - !mSeenNonSilenceInput)); - } + void SendBuffersToMainThread(AudioNodeStream* aStream); friend class ScriptProcessorNode; @@ -390,6 +283,116 @@ ScriptProcessorNode::WrapObject(JSContext* aCx, JS::Handle aScope) return ScriptProcessorNodeBinding::Wrap(aCx, aScope, this); } +class DispatchAudioProcessEventCommand : public nsRunnable +{ +public: + DispatchAudioProcessEventCommand(AudioNodeStream* aStream, + ScriptProcessorNodeEngine::InputChannels& aInputChannels, + double aPlaybackTime, + bool aNullInput) + : mStream(aStream) + , mPlaybackTime(aPlaybackTime) + , mNullInput(aNullInput) + { + mInputChannels.SetLength(aInputChannels.Length()); + if (!aNullInput) { + for (uint32_t i = 0; i < mInputChannels.Length(); ++i) { + mInputChannels[i] = aInputChannels[i].forget(); + } + } + } + + NS_IMETHODIMP Run() + { + // If it's not safe to run scripts right now, schedule this to run later + if (!nsContentUtils::IsSafeToRunScript()) { + nsContentUtils::AddScriptRunner(this); + return NS_OK; + } + + nsRefPtr node; + { + // No need to keep holding the lock for the whole duration of this + // function, since we're holding a strong reference to it, so if + // we can obtain the reference, we will hold the node alive in + // this function. + MutexAutoLock lock(mStream->Engine()->NodeMutex()); + node = static_cast(mStream->Engine()->Node()); + } + if (!node) { + return NS_OK; + } + + AutoPushJSContext cx(node->Context()->GetJSContext()); + if (cx) { + JSAutoRequest ar(cx); + + // Create the input buffer + nsRefPtr inputBuffer; + if (!mNullInput) { + inputBuffer = new AudioBuffer(node->Context(), + node->BufferSize(), + node->Context()->SampleRate()); + if (!inputBuffer->InitializeBuffers(mInputChannels.Length(), cx)) { + return NS_OK; + } + // Put the channel data inside it + for (uint32_t i = 0; i < mInputChannels.Length(); ++i) { + inputBuffer->SetRawChannelContents(cx, i, mInputChannels[i]); + } + } + + // Ask content to produce data in the output buffer + // Note that we always avoid creating the output buffer here, and we try to + // avoid creating the input buffer as well. The AudioProcessingEvent class + // knows how to lazily create them if needed once the script tries to access + // them. Otherwise, we may be able to get away without creating them! + nsRefPtr event = new AudioProcessingEvent(node, nullptr, nullptr); + event->InitEvent(inputBuffer, + mInputChannels.Length(), + mPlaybackTime); + node->DispatchTrustedEvent(event); + + // Steal the output buffers + nsRefPtr output; + if (event->HasOutputBuffer()) { + output = event->OutputBuffer()->GetThreadSharedChannelsForRate(cx); + } + + // Append it to our output buffer queue + node->GetSharedBuffers()->FinishProducingOutputBuffer(output, node->BufferSize()); + } + return NS_OK; + } +private: + nsRefPtr mStream; + ScriptProcessorNodeEngine::InputChannels mInputChannels; + double mPlaybackTime; + bool mNullInput; +}; + +void +ScriptProcessorNodeEngine::SendBuffersToMainThread(AudioNodeStream* aStream) +{ + MOZ_ASSERT(!NS_IsMainThread()); + + // we now have a full input buffer ready to be sent to the main thread. + TrackTicks playbackTick = mSource->GetCurrentPosition(); + // Add the duration of the current sample + playbackTick += WEBAUDIO_BLOCK_SIZE; + // Add the delay caused by the main thread + playbackTick += mSharedBuffers->DelaySoFar(); + // Compute the playback time in the coordinate system of the destination + double playbackTime = + WebAudioUtils::StreamPositionToDestinationTime(playbackTick, + mSource, + mDestination); + + NS_DispatchToMainThread(new DispatchAudioProcessEventCommand(aStream, mInputChannels, + playbackTime, + !mSeenNonSilenceInput)); +} + } } From 75b2d008010d661f2473d7fd81a18a1b4b4c048b Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Fri, 26 Apr 2013 18:08:22 +0100 Subject: [PATCH 130/155] bug 865746 - [win-hidpi] explicitly set size of download item icons. r=mconley --- browser/themes/windows/downloads/downloads.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser/themes/windows/downloads/downloads.css b/browser/themes/windows/downloads/downloads.css index bd750386279..071420c4d1f 100644 --- a/browser/themes/windows/downloads/downloads.css +++ b/browser/themes/windows/downloads/downloads.css @@ -101,8 +101,8 @@ richlistitem[type="download"]:first-child { .downloadTypeIcon { -moz-margin-end: 8px; /* Prevent flickering when changing states. */ - min-height: 32px; - min-width: 32px; + height: 32px; + width: 32px; } .blockedIcon { From c3fd0d99e58fe75498cc7705fa87bb1edf0a5440 Mon Sep 17 00:00:00 2001 From: Lucas Rocha Date: Fri, 26 Apr 2013 17:25:39 +0100 Subject: [PATCH 131/155] Bug 858687 - Fix margins for forward button (r=mfinkle) --- mobile/android/base/resources/values/dimens.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/mobile/android/base/resources/values/dimens.xml b/mobile/android/base/resources/values/dimens.xml index 0fc4424855c..00740a6e60b 100644 --- a/mobile/android/base/resources/values/dimens.xml +++ b/mobile/android/base/resources/values/dimens.xml @@ -69,7 +69,6 @@ 11dp 50dp 6dp - -11dip - 90dp - 50dip + -13dip + 32dp From a1b7886fecd782c6fbce7ec17df0a1d421e8046e Mon Sep 17 00:00:00 2001 From: Sriram Ramasubramanian Date: Thu, 18 Apr 2013 15:36:08 -0700 Subject: [PATCH 132/155] Bug 863379: Update tab icon. [r=mfinkle] --- mobile/android/base/BrowserToolbar.java | 1 - mobile/android/base/Makefile.in | 22 ++++-------------- .../resources/drawable-hdpi/tabs_carat.png | Bin 192 -> 0 bytes .../tabs_count.png} | Bin 1177 -> 1235 bytes .../drawable-large-hdpi-v11/tabs_carat.png | Bin 1203 -> 0 bytes .../tabs_carat_expanded.png | Bin 1185 -> 0 bytes .../drawable-large-land-v11/tabs_level.xml | 14 ----------- .../tabs_carat_contracted.png | Bin 1096 -> 0 bytes .../tabs_carat_expanded.png | Bin 1096 -> 0 bytes .../drawable-large-xhdpi-v11/tabs_carat.png | Bin 1252 -> 0 bytes .../tabs_carat_contracted.png | Bin 1264 -> 0 bytes .../tabs_carat_expanded.png | Bin 1276 -> 0 bytes .../resources/drawable-mdpi/tabs_carat.png | Bin 147 -> 0 bytes .../tabs_count.png} | Bin 1124 -> 1152 bytes .../resources/drawable-xhdpi/tabs_carat.png | Bin 251 -> 0 bytes .../resources/drawable-xhdpi/tabs_count.png | Bin 0 -> 1319 bytes .../base/resources/drawable/tabs_level.xml | 12 ---------- .../layout-large-v11/browser_toolbar.xml | 15 ++++++++---- .../base/resources/layout/browser_toolbar.xml | 15 ++++++++---- .../base/resources/layout/tabs_counter.xml | 13 +++++++---- 20 files changed, 35 insertions(+), 57 deletions(-) delete mode 100644 mobile/android/base/resources/drawable-hdpi/tabs_carat.png rename mobile/android/base/resources/{drawable-large-hdpi-v11/tabs_carat_contracted.png => drawable-hdpi/tabs_count.png} (53%) delete mode 100644 mobile/android/base/resources/drawable-large-hdpi-v11/tabs_carat.png delete mode 100644 mobile/android/base/resources/drawable-large-hdpi-v11/tabs_carat_expanded.png delete mode 100644 mobile/android/base/resources/drawable-large-land-v11/tabs_level.xml delete mode 100644 mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat_contracted.png delete mode 100644 mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat_expanded.png delete mode 100644 mobile/android/base/resources/drawable-large-xhdpi-v11/tabs_carat.png delete mode 100644 mobile/android/base/resources/drawable-large-xhdpi-v11/tabs_carat_contracted.png delete mode 100644 mobile/android/base/resources/drawable-large-xhdpi-v11/tabs_carat_expanded.png delete mode 100644 mobile/android/base/resources/drawable-mdpi/tabs_carat.png rename mobile/android/base/resources/{drawable-large-mdpi-v11/tabs_carat.png => drawable-mdpi/tabs_count.png} (56%) delete mode 100644 mobile/android/base/resources/drawable-xhdpi/tabs_carat.png create mode 100644 mobile/android/base/resources/drawable-xhdpi/tabs_count.png delete mode 100644 mobile/android/base/resources/drawable/tabs_level.xml diff --git a/mobile/android/base/BrowserToolbar.java b/mobile/android/base/BrowserToolbar.java index 46eca69ee6b..00d8dc6a314 100644 --- a/mobile/android/base/BrowserToolbar.java +++ b/mobile/android/base/BrowserToolbar.java @@ -907,7 +907,6 @@ public class BrowserToolbar implements ViewSwitcher.ViewFactory, public void setIsSideBar(boolean isSideBar) { Resources resources = mActivity.getResources(); - mTabs.setImageDrawable(resources.getDrawable(R.drawable.tabs_level)); mTabs.setBackgroundDrawable(resources.getDrawable(R.drawable.shaped_button)); } diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index ba81d5d3ce7..fc6d543d3f9 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -597,7 +597,7 @@ RES_DRAWABLE_MDPI = \ res/drawable-mdpi/tab_close.png \ res/drawable-mdpi/tab_thumbnail_default.png \ res/drawable-mdpi/tab_thumbnail_shadow.png \ - res/drawable-mdpi/tabs_carat.png \ + res/drawable-mdpi/tabs_count.png \ res/drawable-mdpi/address_bar_url_default.9.png \ res/drawable-mdpi/address_bar_url_default_pb.9.png \ res/drawable-mdpi/address_bar_url_pressed.9.png \ @@ -695,7 +695,7 @@ RES_DRAWABLE_HDPI = \ res/drawable-hdpi/tab_close.png \ res/drawable-hdpi/tab_thumbnail_default.png \ res/drawable-hdpi/tab_thumbnail_shadow.png \ - res/drawable-hdpi/tabs_carat.png \ + res/drawable-hdpi/tabs_count.png \ res/drawable-hdpi/address_bar_url_default.9.png \ res/drawable-hdpi/address_bar_url_default_pb.9.png \ res/drawable-hdpi/address_bar_url_pressed.9.png \ @@ -782,7 +782,7 @@ RES_DRAWABLE_XHDPI = \ res/drawable-xhdpi/tab_close.png \ res/drawable-xhdpi/tab_thumbnail_default.png \ res/drawable-xhdpi/tab_thumbnail_shadow.png \ - res/drawable-xhdpi/tabs_carat.png \ + res/drawable-xhdpi/tabs_count.png \ res/drawable-xhdpi/doorhanger_popup_bg.9.png \ res/drawable-xhdpi/find_close.png \ res/drawable-xhdpi/find_next.png \ @@ -893,18 +893,11 @@ RES_DRAWABLE_XHDPI_V11 = \ res/drawable-xhdpi-v11/ic_status_logo.png \ $(NULL) -RES_DRAWABLE_LARGE_LAND_V11 = \ - res/drawable-large-land-v11/tabs_level.xml \ - $(NULL) - RES_DRAWABLE_LARGE_MDPI_V11 = \ res/drawable-large-mdpi-v11/doorhanger_popup_bg.9.png \ res/drawable-large-mdpi-v11/ic_menu_reload.png \ res/drawable-large-mdpi-v11/ic_menu_forward.png \ res/drawable-large-mdpi-v11/menu.png \ - res/drawable-large-mdpi-v11/tabs_carat.png \ - res/drawable-large-mdpi-v11/tabs_carat_contracted.png \ - res/drawable-large-mdpi-v11/tabs_carat_expanded.png \ $(NULL) RES_DRAWABLE_LARGE_HDPI_V11 = \ @@ -912,9 +905,6 @@ RES_DRAWABLE_LARGE_HDPI_V11 = \ res/drawable-large-hdpi-v11/ic_menu_reload.png \ res/drawable-large-hdpi-v11/ic_menu_forward.png \ res/drawable-large-hdpi-v11/menu.png \ - res/drawable-large-hdpi-v11/tabs_carat.png \ - res/drawable-large-hdpi-v11/tabs_carat_contracted.png \ - res/drawable-large-hdpi-v11/tabs_carat_expanded.png \ $(NULL) RES_DRAWABLE_LARGE_XHDPI_V11 = \ @@ -922,9 +912,6 @@ RES_DRAWABLE_LARGE_XHDPI_V11 = \ res/drawable-large-xhdpi-v11/ic_menu_reload.png \ res/drawable-large-xhdpi-v11/ic_menu_forward.png \ res/drawable-large-xhdpi-v11/menu.png \ - res/drawable-large-xhdpi-v11/tabs_carat.png \ - res/drawable-large-xhdpi-v11/tabs_carat_contracted.png \ - res/drawable-large-xhdpi-v11/tabs_carat_expanded.png \ $(NULL) RES_DRAWABLE_XLARGE_MDPI_V11 = \ @@ -1025,7 +1012,6 @@ MOZ_ANDROID_DRAWABLES += \ mobile/android/base/resources/drawable/tab_new_level.xml \ mobile/android/base/resources/drawable/tab_row.xml \ mobile/android/base/resources/drawable/tab_thumbnail.xml \ - mobile/android/base/resources/drawable/tabs_level.xml \ mobile/android/base/resources/drawable/tabs_panel_indicator.xml \ mobile/android/base/resources/drawable/textbox_bg.xml \ mobile/android/base/resources/drawable/webapp_titlebar_bg.xml \ @@ -1033,7 +1019,7 @@ MOZ_ANDROID_DRAWABLES += \ MOZ_BRANDING_DRAWABLE_MDPI = $(shell if test -e $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/android-resources.mn; then cat $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/android-resources.mn | tr '\n' ' '; fi) -RESOURCES=$(RES_LAYOUT) $(RES_LAYOUT_LARGE_LAND_V11) $(RES_LAYOUT_LARGE_V11) $(RES_LAYOUT_XLARGE_V11) $(RES_LAYOUT_XLARGE_LAND_V11) $(RES_VALUES) $(RES_VALUES_LAND) $(RES_VALUES_V11) $(RES_VALUES_LARGE_V11) $(RES_VALUES_LARGE_LAND_V11) $(RES_VALUES_XLARGE_V11) $(RES_VALUES_LAND_V14) $(RES_VALUES_V14) $(RES_XML) $(RES_ANIM) $(RES_DRAWABLE_MDPI) $(RES_DRAWABLE_LDPI) $(RES_DRAWABLE_HDPI) $(RES_DRAWABLE_XHDPI) $(RES_DRAWABLE_MDPI_V11) $(RES_DRAWABLE_HDPI_V11) $(RES_DRAWABLE_XHDPI_V11) $(RES_DRAWABLE_LARGE_LAND_V11) $(RES_DRAWABLE_LARGE_MDPI_V11) $(RES_DRAWABLE_LARGE_HDPI_V11) $(RES_DRAWABLE_LARGE_XHDPI_V11) $(RES_DRAWABLE_XLARGE_MDPI_V11) $(RES_DRAWABLE_XLARGE_HDPI_V11) $(RES_DRAWABLE_XLARGE_XHDPI_V11) $(RES_COLOR) $(RES_MENU) +RESOURCES=$(RES_LAYOUT) $(RES_LAYOUT_LARGE_LAND_V11) $(RES_LAYOUT_LARGE_V11) $(RES_LAYOUT_XLARGE_V11) $(RES_LAYOUT_XLARGE_LAND_V11) $(RES_VALUES) $(RES_VALUES_LAND) $(RES_VALUES_V11) $(RES_VALUES_LARGE_V11) $(RES_VALUES_LARGE_LAND_V11) $(RES_VALUES_XLARGE_V11) $(RES_VALUES_LAND_V14) $(RES_VALUES_V14) $(RES_XML) $(RES_ANIM) $(RES_DRAWABLE_MDPI) $(RES_DRAWABLE_LDPI) $(RES_DRAWABLE_HDPI) $(RES_DRAWABLE_XHDPI) $(RES_DRAWABLE_MDPI_V11) $(RES_DRAWABLE_HDPI_V11) $(RES_DRAWABLE_XHDPI_V11) $(RES_DRAWABLE_LARGE_MDPI_V11) $(RES_DRAWABLE_LARGE_HDPI_V11) $(RES_DRAWABLE_LARGE_XHDPI_V11) $(RES_DRAWABLE_XLARGE_MDPI_V11) $(RES_DRAWABLE_XLARGE_HDPI_V11) $(RES_DRAWABLE_XLARGE_XHDPI_V11) $(RES_COLOR) $(RES_MENU) RES_DIRS= \ res/layout \ diff --git a/mobile/android/base/resources/drawable-hdpi/tabs_carat.png b/mobile/android/base/resources/drawable-hdpi/tabs_carat.png deleted file mode 100644 index 157f3f8934b04d4b7adce3a3eb98360730999edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 192 zcmeAS@N?(olHy`uVBq!ia0vp^DnRVP!3HGfnT78JQth5Djv*Dd-dZ+Q)DgVmmMo*U971z6FE?(F^eeUAwkUMf55RlQnfL~^DgfSO))D57M O7(8A5T-G@yGywp5Ts=1c diff --git a/mobile/android/base/resources/drawable-large-hdpi-v11/tabs_carat_contracted.png b/mobile/android/base/resources/drawable-hdpi/tabs_count.png similarity index 53% rename from mobile/android/base/resources/drawable-large-hdpi-v11/tabs_carat_contracted.png rename to mobile/android/base/resources/drawable-hdpi/tabs_count.png index 35aa47c9718741dc32de8659e1bc3ff9872ca773..c81712cec96ae28ce1eeea8e240ebf5aa4222e2f 100644 GIT binary patch delta 441 zcmbQqd6`qOGr-TCmrII^fq{Y7)59eQNUMM_2OE%l$S`BZMny{|1t&*S17}l9M@Iv5 zXG23*BMWD9H%C_|M^_gM7bgQ(^T}0AGB8D!I2CPUN>VVev@kFMvb$| zHyZ^z-Xs5C%xt^h?7`6KTYfyDSitE2eTOGTVoFz+GHf&yTSqwks8aYrAMF2%x(bIW$RE@3!)@R>p*5HADbwm|k?tBfm- zi}|F^@cpv9AybmOK(^(cLo{FMl4A*l7u*%*nTZIQ>fXNo|776>b}6eDww8QW{?6=k z)sH(axOdQ7%Ho;om7Gm(_A5*|8n??!n^@VIJdt4$NMLy1YPXTi`QJWZY%qAb`njxg HN@xNA&MlgP delta 382 zcmcc2Ig?YdGr-TCmrII^fq{Y7)59eQNV@{D76%)Ue5yZf*+xZ6CIw>yS7S?aCj&D} z3ll>_S0g7gBO@mlOJipzCrdX=SF_1gOfpbKj&3*=ZDUGOFm*9DadmZeHgqyFFtac; zv~V^wv2=8EHgR+|HZ(9coovBeSHI@*-UC4Ek9)c}hE&{obKQ{ZkO4#M!!3I|!e4M! z9dByxe(>nQg63F}m^m?XtSVU62P~YiZ^9IfyHoTY)_-`c_9N1Fc4Rj1?>IItjRg%% z$b^pIl%UdAj9zzwM6*_}TkvD;q1C?ys!Q2a7xh@LVw>{P@0Gy16uAJqvcTQ(_f7o2 zgsi2qV&pT8^oIG?UHdv)yP|lY5BwmAy7NnjU{!jTytzxRiM`poBxeszSFX3MC=S!)Z7*w+H%s30 z(t@CVQ4tD$w1R(N)1f#RY<}2q!Zz5%T6KP?D8u%{K>R89E+8Q&ij5&@;>di0NL~Z@XFM+0R!P z+P1RH=Yr1Zo&qa&$FL8(hdayW@PH{<%+`I)iQ?hgoKZS0?jln`P)3 z6FiV*W<~YrU9^IHNDIkS!sGy;MKKA|f+&I(n&$w|a^w~hAT0}`%xCEO#Sm}4)hCzK zLfscxWtj@bp3JhfS}j>iC6V9H0!fl04xUdCi$pNwVk1nr!TJV+3Io%(J!~VFju?$z zRK;0_D4h+#@pOHT*bVB5A}M1-!(%~`V;v`oYsNajCHPjxyw*W^$b)PN2B_+rWrPMB70^{d7zGvN(Mq>SZ`2LbcB73=(E-iIt3u!23$22W9C{|hvOSLiK~1GK zO;JF;9=QV2Qm&w+b4m(uDS@eDtq;i>OT@5IdAw6DjV)4x(R8l($zra3pi6qjC(UvB zaC@9I)>Ki=mBYJ_@7`GcE4TL0)TQwGWPD^&9iLhj>tuFTW6l4v!>fOJy?CXn#&?-Z z&}3FPaOkYgCdOK}pJBFJ)Y90hja{eP4=i42GTQRPg!iib<-oX5{dD@y&13NkZF{bN zq4%Q8OPMRXZ?FBS``Z5hn}z8+57^tEUHo!v%Z1~Aynb@={g(i z|GaeL)?fGk?*IDUQ)SKgt%<3V6DQ*5wRN=@z@J7NPQ9;V-Ua4)2j2jC6_C#W diff --git a/mobile/android/base/resources/drawable-large-hdpi-v11/tabs_carat_expanded.png b/mobile/android/base/resources/drawable-large-hdpi-v11/tabs_carat_expanded.png deleted file mode 100644 index 11a1616352aa78abc87ab2c3cfc4d6b5b4377e01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1185 zcmbVMTWr%-7&e{Cs*1vfkhlmW%e-`GiGA$EiA~cIUotW+#Y!>}q*3A8r;XRz$F)z0 z+ecul_OchmZZEqCA$3B$Z4v@OHK{|L5H~R)7%yn!VTcKM0E9Ngj@zX4q2d9{K9~Re z-}hh6|NApz@V%byE!`AF^%Qq&WispJ+tIa}jCa{DPLOFc)@!(eMsU*%AeFb#FrTn)Iu^4Gy`X}} za?GMrwUR-rD1dZ2DI_co09q82Ae9zH@Gi}BfM+@KiV2XC)1u60=+?s!Yk@r?m$gF6 z7TM*PI>x@tvdv~Q*%Xo}7-fMZNihe{Cx}KOob<36CA@HZn?Zx26*xY2kVnUi<}hmD z978-^48iqFr6po7Y$b}MjEzj61xb!|-8ilV?GTsYOE*^34y%(sWXmu_jld%JF|xf4 zCb@gHp;(c4Bku_uaw+DxhOCAQJzUgs3^_^Kjx86mnF0Wr6qn&SF$+MJ%L)aBm-3RT z^Sl7s94lc3P8Xz1UKOQm3ILr~M4nePNl+C6 z7zI^?#@iKO)DcEu9r?6c5$WENX*pgjcqhJ~#dtLsI0vC!2#`xJWLS1q@F1-TDP31p zptK@aK}yOO)Kp#-04JoG7S?{9tg*xyHZG54< - - - - - - - - - - - diff --git a/mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat_contracted.png b/mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat_contracted.png deleted file mode 100644 index db1170cbb61e665d0752241ecb0319770de8db6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1096 zcmbVLO=#0l91l3Z<~DbjprY=XT{f^uUXrFswmRCR-3seIx`I8LCU0xp^0DM??S|mk zK@k)YFJ6ZTo^~22cu<%J1yMwI@uqlCFM1JF2J>ZWr-!kFA<291|Ng(<|NHvr@IY(x z$!3b8T62SXfvgPqP8~Wx{%4NdyiJx9I8(yo-UO~10isftS4JS`7?Y@g3~PSo1?r=y zeHFV{!lnF>YI+W1L^@2(@d=uu`uc0WVNM|o%4pJdlk~U8PiSCUN%}%O&*gm$RqVlq z0F5sU7tMt!Q?cm&^PsP$5&{Qd1Js;pH&km$dW%;j`$){vU`qv0CFyOaO8HTsc>w}( zMu?dlgg}xQD8?lTo&!7wd6pxu6oaA~msCCh>JLq<1=fUG(6e=0H1*rDo+s7Q%$cC3sGfA(S~;$fkKErDz$R7hr>9H>?N+Ma%Mn zq{t$K89puXd|FooEuB`fN=9m6b8d(Y*F+7wHnCgB@_S-cEkFkLf}-b5H#%Un;$bhW zcs|g^CD5HWOxukFJyC(Sa@aL%sa&!@ai7*`E*A22Kz6Jg3S(mOuNg;8j!k%ktf#ynOa`Z^zq5$J-}c z*I)j+(yeYBYai*n)VA63?9Q?{wusv0-+X)L(pCA*;>_wn@$2`oYquJt@?i=*rFz$o Ue)_myUX5luml@Vq(ifNh0CDkLH~;_u diff --git a/mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat_expanded.png b/mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat_expanded.png deleted file mode 100644 index 188244904ade3dd4213cbde68c85a24846e561d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1096 zcmbVLJ8aWX6g4U!R4A>WLMq~8+@(mw_Olbmwvx87owPwsiPA`f4aa_MtkxgwmnNwg z3QMU317bj`x>O7xA+azaBpBL-3GrJH1C#}^09yy7@|-4tq3VET`~B`Y_uTvLUCvLA z^>m-?CJ3S@JFXS*NaOF+p@aB;=J1`nco;zG5}I0HSZqGS^Tu)L>UK!8BZH6M7CTKQE?T9Mn@}%ne zkc`oM#9#p+1%U?9m>_@)B*y}dVeuNc{0P) zYBjpX)2=_m07;TU4vvdpi%8ILkY0~C!C;#~gMr~&9o#ZTSZ9ZZRnt^mZb0rZCa+B5#t#E;!!rvv4RMI$clVM;iQzLra6uWZI0crJe%gF zxDpj4F$zGMQv{AvG>KOgMaoENp^eQt0n!}d5trt~=MRfPBS8 zZcuSOQk@dWp`315PPlPCyr7+UHRxOO(9HO*O*S(uTe~QTX?!%DR#l+1B3D6FN@dh& zO638|$EX(8{GY5bSPT=E$3NxL-oiB)PCLbq7oGNj4(=I0Y>pG3R&is^XSGzZ{;~Xf zdwXO(zklM0+J9TV{{G8@qi3sIkJgv&uYXt+jUjRMz;dK#G#q za{s%n?X?x@Vb`z6Yu|pp9!(5f?0vS`*T4C6aqDf~6Ten^D;=`2)5G7rW5npEwiDCMqIqa&XJ<}!hwNOO zIh)<23c(i*rR_`mQlX^?l28bU53N*akwTF`WnbEo7ipntskRk_V3E=@$!_!^_@F;C zb8i3l{ns<|qa%m=dS2?GD5|eGtd+=^BX9WpHu8PrgG+nKup8^+cr2L2O)ElF-U%v* zE_zlKm5}AkoVbRDC~9lXEsx`I^G(?fJl0Bd*p?R(G(`;^YK4|Pg)m(~Ro7RTzrXpG zpcx5tAwmF7g zQ^8XTv+mTmIZCTRgy;+_q--7lS`=B3&WIv7Ktmotjwg?p0%LXX_oR68!ugorDlIA}yRsmJ8L zE|}!*$%Ya|;*ESXa!FCFx)#_C5Ba#LDGWJb9oLbKT-E>}o945S7jppQ_?%!App=(X z9YO(gIX1&eP&4#w-Vh}M1Uf8;5Ee8^PzwdgkaV$&E&4IGd>eJ`y2Ne=t3MGds}Ztr z5S4?V-tB+xzRa;K4FM1e=IWmtAM@gSoKXi4%T^^tZ~E{E@_X)+NHZidN7%8G(TBvTp#3>{;oZ`?{z9<%Nm&7N-CBrJuey_nh$S^<#~N zBb9S!uMFQ9T)uv!e!Ma9(O(Z1sV&bWXL?W0A8XsotLLuO&#&J8xKh|LKTzLo${*g_ zr5yfz|10T{7apGdanBDq?Z&D9w%=-B`2DxL=fA4`ylP(PgA%*S&i29HrSHMLy^i?y zV*C&1T>9e5&8wdb-5zNFI{*(Z-8XN(3jeImEPuI@{#1Xb-JaOBb2ACU@7|}jQaQ^N TK2rv7CI6kGKB6rZ-aY+4xZ;KG diff --git a/mobile/android/base/resources/drawable-large-xhdpi-v11/tabs_carat_contracted.png b/mobile/android/base/resources/drawable-large-xhdpi-v11/tabs_carat_contracted.png deleted file mode 100644 index 07d358b10e6a537b3632de026e851336d712a5b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1264 zcmbVMTWs4@7SYi7zaIbR`X1NzsIBpCnf5OKrDt z3!Tb@kXC6!0wf-I*vmw#PQXj1P3okMmx?{GA;!xtl{z6Iq!ADZDqy4KxQz=B)gG{Z z`<(Ni|NH*S`HxTc_r18Q?LZrXAiFY0g&Z7Thi`J{2h5^dm2H5e zRC5@h8C@=c9FWzC(QBX^L7K~2e$XAvzRW779+7>Uh^Jc+jUe5sl?1>MSKw}=g=Q7Bk4+>{#Huy&7jnwpn^T-AH6K76qL&V!SeO0_#Z*Xw7|v)^^z+K=o`uIvb8dhbd@n){|_ zhr|n&mU`3W^`*kxa_#i^>eSV@mKN{HzZSlc3LVx$=PL0<%iXzo`swoV)`TJC{ sd2JSH>9m>xx!P(qBsBZ&o2>+L?c4`vKL3(i_WwZ{u}}Cc{l=+(0Qh&XPyhe` diff --git a/mobile/android/base/resources/drawable-large-xhdpi-v11/tabs_carat_expanded.png b/mobile/android/base/resources/drawable-large-xhdpi-v11/tabs_carat_expanded.png deleted file mode 100644 index 6d3f4d185e9056ec4db4d83b5d5a75cea2745305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1276 zcmbVMeP|nH7{4^Llg)}Ug{`=8yP<4i?lZaMj^4WDF4>|>t!cpgvEeRvZ<8~*kKJ9G zYdg^iPUaX)HV`&PQHHaMo7h2R)wP2P)*&(wx;b>2;2(}i=NC@=e6LMv|0w&zRg2&NJn~yl!fCi_{8pRhi~hZkq6+g&Q0dsKC|Dg$u>aZ zs#ySNT9=C;3uJY0?+oZdkYGv6<=uQ{C$E?~F8e;Xr&|z>AYI*_B`am%q6JXY3;~;) zn8Z*`6|kox88Tyuprq{>vO(WaPfi&sE1ZgTZ$-O29unxll~GTx7!L0V*gP)}ZGV}- z(0LcPEMNyx9;H<|8amN73em!DzPH z&u67nGZvf)SjlxQo*-(q8eU^?(=HMe$8kOfO^2XI$Qd+T*$WxYrWS()9L3fwS2GRN zXOs(O)fF(PbRh-Z%48Oa4X0TsSTe$sErP;HLf8Gg=Di&^3;vU_thbXJv;dI>j#;%8 zxF7wST3}eaI|uR|p&I^4TZ5Y-S0q!Z>cDW*l7PW4xT>jqDi%#qR5VORX_AdmRE&%< zsRYf%IWbAo4AtUT4$IL}Dj7{MEC+#9l1{KRosc+2OeDAzmt+Bws#v^t=-WV)tPGA&f>W6{kSS(3;9aG)&_u@vP~VGuQ0DI zqaY$N;bc-2sYEk#kqUG1lo*bS3`H^#tcg|sPt^!0hVa{CNxQU`U=RA{V)Mhv;_(3n zJTo>t9Ot%;y^A1$N7GU~=Y7?<_TJ+wstB5xAfWX&fk#b@!j`aZ%i4pzx^duKi`PlyK8Fy>X;Q+ zxy1M{)Oh~p6E6giE0-QVa{J0$-v1w^lReUz I#GV)b1sw*t4*&oF diff --git a/mobile/android/base/resources/drawable-mdpi/tabs_carat.png b/mobile/android/base/resources/drawable-mdpi/tabs_carat.png deleted file mode 100644 index 459160f9d2937a0e911b9cf87f5f29a99429258e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^5vSZSLYdSGE&Rq(nsubQkC*HwLG oJKw%zS6FY&s$;X67#Kv%7=!AoPdQu6JqOa{>FVdQ&MBb@029eCy#N3J diff --git a/mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat.png b/mobile/android/base/resources/drawable-mdpi/tabs_count.png similarity index 56% rename from mobile/android/base/resources/drawable-large-mdpi-v11/tabs_carat.png rename to mobile/android/base/resources/drawable-mdpi/tabs_count.png index 280446aa2b5dbde1a5f0825b72e6dc3bc96b5f10..ff03864c1774a471e9f024f7bec78fa4019ba8d4 100644 GIT binary patch delta 357 zcmaFD(ZH$L8Q|y6%O%Cdz`(%k>ERLtq$NO@gAGVND7XEwQPGk~!O79oz}eK&%+bKy z+0f9{$ims&&C%7#(bdJm#mT_cd~y|&3`~(JPDR_8k`xRqEes3|%}or>w0@nZi(^Q|t)xHy|JyU`GAi5ZCa^y$P%vXk z@>BZypW)G4hds>_+)0f$+IZamu{^R#(wV_fTFES6zdTI9P;q18!B2B$6&`4EUnkeG z)WhVxwZMGlM^i5>aQ?_>H9_g{!36;u*d7_=IJ)>QaL?xck&(-Icm=ESm8N{}E!z^9 zxBOVD<)GKi=VW;I(F0-DXLahwn!H6K3g*qQk_>B=Vm4&w41E!)5Xai>e@yZIDh3V% ZhNRO5^Y4A+iw8QL!PC{xWt~$(69C1$byffX delta 329 zcmZqRe8QpF8Q|y6%O%Cdz`(%k>ERLtq-B8Ef`bi6zB8DyWuu}clY*s@i=&~Lxucn- zg`uILtC5qLk&%;&rLnVIvE+50S&Wo zHZ-wxbaOUwbT&3LFgBfR!CY5gy|zsjX#FHl7srr_TW@Zh=4>%wa1ETgQ9$>iQ(7Wp zQ&f{F#~~3z)*r7A{9qAR5)x@zaOc2L*QR!r-9L^=ygw&cVb1S>0uGcn%%A)^Y3hm# zo0f&Ou9p3G^}NyjRi~a#)a$ogn#K35>TBrY*Vc1F_T7HDLqDncwe_7vH-GhptlFh* m|Dp016AKGVjhqFy0mG|K$?5sW<{be#kHOQ`&t;ucLK6U85^*~K diff --git a/mobile/android/base/resources/drawable-xhdpi/tabs_carat.png b/mobile/android/base/resources/drawable-xhdpi/tabs_carat.png deleted file mode 100644 index 78e65eee3b9fdbf25756675dc5a9f8e0320b586a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^20)y^!3HFwdp;HbsY9MFjv*Dd-d^3vd&oef^|9O5@7`W5~z@5)~vSXG*s+oUwC}y3K{b=*Z&iG%zs;fBnxa tyy(BgeZ9BJx81M55HzhzLbJDFRTZ5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8KW+g=7RhMR$W{Yl!|Z$R@KEJl?AE#L8-<0 zrA5iW_()TRX$FQJev3c~fv&OgFUkZ)N@9*nesXDUYF>$_i>(q+MlU5Z#mddX+|AI? z+{D1#$iU3P(9pub!r0Bp$kNf$+11F%*brt0HodNHj+Tzb#!ij~=FWzOu0|Hl=5CIz zPL8fF7A{T(uI4bko_WP3iFwJXFncqB_CobK;?-;AT$Gwvl3x^(pPvIu0Rb8LCHch} z`2`Bj!Db2?zKO}1c_0BzPy|8z>ylcOS(cjOR+OKs01jcROe`)iu(SZCA5@>a7#dkv zm^)dxS~@!^LG`AP6KeWE$LNES2U2o@2?5g}hzU>pKn^_nq~-zhOc5}1#KtoIU|?Vj z^>lFzskrrK*1@bp4gziFt|CQ73+B~u{ALL9;QwW?&-cYa^AC(J8v*f}qb7Ot^4-kl`(hL!7o&9i2KJxy8~g70hD zv<(=QC#;;dcZ%GKW(I2gO&SnL87`wSNc7C4$0^WaEq!ok>t6-IttpOrrF?n*efaL%P; zTEWe8oGL{utj>J*P~1?Wv0;h83`>z2fgCR!UmtV)WWD+OU8X9pKaAVNCSR|1ebvvo zwfy+(D%*_O@au*1=gkn6zpz0&*eqTvb - - - - - - - - - diff --git a/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml b/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml index e5b6a8eedc1..c3b34b55874 100644 --- a/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml +++ b/mobile/android/base/resources/layout-large-v11/browser_toolbar.xml @@ -22,15 +22,22 @@ gecko:curveTowards="left" android:background="@drawable/shaped_button" android:gravity="center_vertical" - android:src="@drawable/tabs_level" android:paddingLeft="6dip" android:paddingRight="38dip"/> + diff --git a/mobile/android/base/resources/layout/browser_toolbar.xml b/mobile/android/base/resources/layout/browser_toolbar.xml index db483dbf74c..9809bf8ea5f 100644 --- a/mobile/android/base/resources/layout/browser_toolbar.xml +++ b/mobile/android/base/resources/layout/browser_toolbar.xml @@ -71,15 +71,22 @@ gecko:curveTowards="right" android:background="@drawable/shaped_button" android:gravity="center_vertical" - android:src="@drawable/tabs_level" android:paddingLeft="37dip" android:paddingRight="11dip"/> + diff --git a/mobile/android/base/resources/layout/tabs_counter.xml b/mobile/android/base/resources/layout/tabs_counter.xml index 0a06b8f8aac..4678019f55e 100644 --- a/mobile/android/base/resources/layout/tabs_counter.xml +++ b/mobile/android/base/resources/layout/tabs_counter.xml @@ -4,9 +4,14 @@ - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> From fce21ccaaf1e339cffe4f4afb38f952fcfe1545b Mon Sep 17 00:00:00 2001 From: Axel Hecht Date: Fri, 26 Apr 2013 17:11:47 +0200 Subject: [PATCH 133/155] bug 848297, allow overrides of locales for packages, r=bsmedberg --HG-- extra : rebase_source : 12a32470bdf6c7afd0c2e1ac50e3051773e3ad47 --- chrome/src/nsChromeRegistryChrome.cpp | 32 +++++++++++-- chrome/src/nsChromeRegistryChrome.h | 2 + chrome/test/unit/data/test_bug848297.manifest | 4 ++ chrome/test/unit/test_bug848297.js | 48 +++++++++++++++++++ chrome/test/unit/xpcshell.ini | 1 + 5 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 chrome/test/unit/data/test_bug848297.manifest create mode 100644 chrome/test/unit/test_bug848297.js diff --git a/chrome/src/nsChromeRegistryChrome.cpp b/chrome/src/nsChromeRegistryChrome.cpp index 0c2252d1905..8031eef70f1 100644 --- a/chrome/src/nsChromeRegistryChrome.cpp +++ b/chrome/src/nsChromeRegistryChrome.cpp @@ -36,6 +36,7 @@ #include "nsIObserverService.h" #include "nsIPrefBranch.h" #include "nsIPrefService.h" +#include "mozilla/Preferences.h" #include "nsIResProtocolHandler.h" #include "nsIScriptError.h" #include "nsIVersionComparator.h" @@ -48,6 +49,7 @@ #define MATCH_OS_LOCALE_PREF "intl.locale.matchOS" #define SELECTED_LOCALE_PREF "general.useragent.locale" #define SELECTED_SKIN_PREF "general.skins.selectedSkin" +#define PACKAGE_OVERRIDE_BRANCH "chrome.override_package." using namespace mozilla; @@ -196,20 +198,25 @@ NS_IMETHODIMP nsChromeRegistryChrome::GetLocalesForPackage(const nsACString& aPackage, nsIUTF8StringEnumerator* *aResult) { + nsCString realpackage; + nsresult rv = OverrideLocalePackage(aPackage, realpackage); + if (NS_FAILED(rv)) + return rv; + nsTArray *a = new nsTArray; if (!a) return NS_ERROR_OUT_OF_MEMORY; PackageEntry* entry = static_cast(PL_DHashTableOperate(&mPackagesHash, - & aPackage, + & realpackage, PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_BUSY(entry)) { entry->locales.EnumerateToArray(a); } - nsresult rv = NS_NewAdoptingUTF8StringEnumerator(aResult, a); + rv = NS_NewAdoptingUTF8StringEnumerator(aResult, a); if (NS_FAILED(rv)) delete a; @@ -267,9 +274,13 @@ nsresult nsChromeRegistryChrome::GetSelectedLocale(const nsACString& aPackage, nsACString& aLocale) { + nsCString realpackage; + nsresult rv = OverrideLocalePackage(aPackage, realpackage); + if (NS_FAILED(rv)) + return rv; PackageEntry* entry = static_cast(PL_DHashTableOperate(&mPackagesHash, - & aPackage, + & realpackage, PL_DHASH_LOOKUP)); if (PL_DHASH_ENTRY_IS_FREE(entry)) @@ -282,6 +293,21 @@ nsChromeRegistryChrome::GetSelectedLocale(const nsACString& aPackage, return NS_OK; } +nsresult +nsChromeRegistryChrome::OverrideLocalePackage(const nsACString& aPackage, + nsACString& aOverride) +{ + const nsACString& pref = NS_LITERAL_CSTRING(PACKAGE_OVERRIDE_BRANCH) + aPackage; + nsAdoptingCString override = mozilla::Preferences::GetCString(PromiseFlatCString(pref).get()); + if (override) { + aOverride = override; + } + else { + aOverride = aPackage; + } + return NS_OK; +} + nsresult nsChromeRegistryChrome::SelectLocaleFromPref(nsIPrefBranch* prefs) { diff --git a/chrome/src/nsChromeRegistryChrome.h b/chrome/src/nsChromeRegistryChrome.h index 211b54a79c9..57d3e6cb8b6 100644 --- a/chrome/src/nsChromeRegistryChrome.h +++ b/chrome/src/nsChromeRegistryChrome.h @@ -50,6 +50,8 @@ class nsChromeRegistryChrome : public nsChromeRegistry PLDHashEntryHdr *entry, uint32_t number, void *arg); + nsresult OverrideLocalePackage(const nsACString& aPackage, + nsACString& aOverride); nsresult SelectLocaleFromPref(nsIPrefBranch* prefs); nsresult UpdateSelectedLocale() MOZ_OVERRIDE; nsIURI* GetBaseURIFromPackage(const nsCString& aPackage, diff --git a/chrome/test/unit/data/test_bug848297.manifest b/chrome/test/unit/data/test_bug848297.manifest new file mode 100644 index 00000000000..d9730a9ce75 --- /dev/null +++ b/chrome/test/unit/data/test_bug848297.manifest @@ -0,0 +1,4 @@ +locale basepack en-US jar:en-US.jar!/locale/en-US/global/ +locale basepack fr jar:en-US.jar!/locale/en-US/global/ +locale overpack en-US jar:en-US.jar!/locale/en-US/global/ +locale overpack de jar:en-US.jar!/locale/en-US/global/ diff --git a/chrome/test/unit/test_bug848297.js b/chrome/test/unit/test_bug848297.js new file mode 100644 index 00000000000..0875370f791 --- /dev/null +++ b/chrome/test/unit/test_bug848297.js @@ -0,0 +1,48 @@ +/* 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/. + */ + +var MANIFESTS = [ + do_get_file("data/test_bug848297.manifest") +]; + +// Stub in the locale service so we can control what gets returned as the OS locale setting +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +registerManifests(MANIFESTS); + +var chromeReg = Cc["@mozilla.org/chrome/chrome-registry;1"] + .getService(Ci.nsIXULChromeRegistry) + .QueryInterface(Ci.nsIToolkitChromeRegistry); +chromeReg.checkForNewChrome(); + +var prefService = Cc["@mozilla.org/preferences-service;1"] + .getService(Ci.nsIPrefService) + .QueryInterface(Ci.nsIPrefBranch); + +function enum_to_array(strings) { + let rv = []; + while (strings.hasMore()) { + rv.push(strings.getNext()); + } + rv.sort(); + return rv; +} + +function run_test() { + + // without override + prefService.setCharPref("general.useragent.locale", "de"); + do_check_eq(chromeReg.getSelectedLocale("basepack"), "en-US"); + do_check_eq(chromeReg.getSelectedLocale("overpack"), "de"); + do_check_matches(enum_to_array(chromeReg.getLocalesForPackage("basepack")), + ['en-US', 'fr']); + + // with override + prefService.setCharPref("chrome.override_package.basepack", "overpack"); + do_check_eq(chromeReg.getSelectedLocale("basepack"), "de"); + do_check_matches(enum_to_array(chromeReg.getLocalesForPackage("basepack")), + ['de', 'en-US']); + +} diff --git a/chrome/test/unit/xpcshell.ini b/chrome/test/unit/xpcshell.ini index da5f4df5973..2134d8d95bf 100644 --- a/chrome/test/unit/xpcshell.ini +++ b/chrome/test/unit/xpcshell.ini @@ -11,6 +11,7 @@ tail = [test_bug415367.js] [test_bug519468.js] [test_bug564667.js] +[test_bug848297.js] [test_crlf.js] [test_data_protocol_registration.js] [test_no_remote_registration.js] From f23210bd1773862a3e4921cd9b0d3cbf863c7b46 Mon Sep 17 00:00:00 2001 From: "Adam Roach [:abr]" Date: Fri, 26 Apr 2013 12:18:19 -0500 Subject: [PATCH 134/155] Bug 866120 - Propagate reason phrases mid-session r=jesup --- media/webrtc/signaling/src/sipcc/core/ccapp/ccprovider.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/media/webrtc/signaling/src/sipcc/core/ccapp/ccprovider.c b/media/webrtc/signaling/src/sipcc/core/ccapp/ccprovider.c index a546e3ff5ca..295d573f4ea 100755 --- a/media/webrtc/signaling/src/sipcc/core/ccapp/ccprovider.c +++ b/media/webrtc/signaling/src/sipcc/core/ccapp/ccprovider.c @@ -1799,6 +1799,8 @@ static void ccappUpdateSessionData (session_update_t *sessUpd) data->state = sessUpd->update.ccSessionUpd.data.state_data.state; data->media_stream_track_id = sessUpd->update.ccSessionUpd.data.state_data.media_stream_track_id; data->media_stream_id = sessUpd->update.ccSessionUpd.data.state_data.media_stream_id; + strlib_free(data->status); + data->status = sessUpd->update.ccSessionUpd.data.state_data.reason_text; capset_get_allowed_features(gCCApp.mode, data->state, data->allowed_features); ccsnap_gen_callEvent(CCAPI_CALL_EV_STATE, CREATE_CALL_HANDLE_FROM_SESSION_ID(data->sess_id)); break; From 8203bd439113d7de4e14d7e196b585afbf3b4a56 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 26 Apr 2013 13:24:28 -0400 Subject: [PATCH 135/155] Bug 839641 - Add a stub NativePanZoomController class to start Java bindings to APZC. r=Cwiiis --- mobile/android/base/Makefile.in | 6 +- mobile/android/base/gfx/GeckoLayerClient.java | 1 + .../base/gfx/NativePanZoomController.java | 80 +++++++++ mobile/android/base/jni-generator.py | 2 + mozglue/android/jni-stubs.inc | 152 ++++++++++++++++++ widget/android/AndroidBridge.cpp | 48 +++++- widget/android/AndroidBridge.h | 19 ++- widget/android/AndroidJNI.cpp | 71 ++++++++ 8 files changed, 372 insertions(+), 7 deletions(-) create mode 100644 mobile/android/base/gfx/NativePanZoomController.java diff --git a/mobile/android/base/Makefile.in b/mobile/android/base/Makefile.in index fc6d543d3f9..87a3620ae5b 100644 --- a/mobile/android/base/Makefile.in +++ b/mobile/android/base/Makefile.in @@ -194,11 +194,12 @@ FENNEC_JAVA_FILES = \ gfx/LayerMarginsAnimator.java \ gfx/LayerRenderer.java \ gfx/LayerView.java \ - gfx/PluginLayer.java \ + gfx/NativePanZoomController.java \ gfx/NinePatchTileLayer.java \ gfx/PanningPerfAPI.java \ gfx/PanZoomController.java \ gfx/PanZoomTarget.java \ + gfx/PluginLayer.java \ gfx/PointUtils.java \ gfx/ProgressiveUpdateData.java \ gfx/RectUtils.java \ @@ -1118,7 +1119,8 @@ jars: CLASSES_WITH_JNI= \ org.mozilla.gecko.GeckoAppShell \ - org.mozilla.gecko.GeckoJavaSampler \ + org.mozilla.gecko.GeckoJavaSampler \ + org.mozilla.gecko.gfx.NativePanZoomController \ $(NULL) ifdef MOZ_WEBSMS_BACKEND diff --git a/mobile/android/base/gfx/GeckoLayerClient.java b/mobile/android/base/gfx/GeckoLayerClient.java index 0018d1ea338..e2c20dec0ed 100644 --- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -113,6 +113,7 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics(); mViewportMetrics = new ImmutableViewportMetrics(displayMetrics) .setViewportSize(view.getWidth(), view.getHeight()); + mFrameMetrics = mViewportMetrics; mZoomConstraints = new ZoomConstraints(false); mPanZoomController = PanZoomController.Factory.create(this, view, eventDispatcher); diff --git a/mobile/android/base/gfx/NativePanZoomController.java b/mobile/android/base/gfx/NativePanZoomController.java new file mode 100644 index 00000000000..75e18ff6e00 --- /dev/null +++ b/mobile/android/base/gfx/NativePanZoomController.java @@ -0,0 +1,80 @@ +/* -*- Mode: Java; c-basic-offset: 4; tab-width: 20; indent-tabs-mode: nil; -*- + * 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/. */ + +package org.mozilla.gecko.gfx; + +import org.mozilla.gecko.GeckoEvent; +import org.mozilla.gecko.GeckoThread; +import org.mozilla.gecko.util.EventDispatcher; +import org.mozilla.gecko.util.GeckoEventListener; + +import org.json.JSONObject; + +import android.graphics.PointF; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.View; + +class NativePanZoomController implements PanZoomController, GeckoEventListener { + private final EventDispatcher mDispatcher; + + NativePanZoomController(PanZoomTarget target, View view, EventDispatcher dispatcher) { + mDispatcher = dispatcher; + if (GeckoThread.checkLaunchState(GeckoThread.LaunchState.GeckoRunning)) { + init(); + } else { + mDispatcher.registerEventListener("Gecko:Ready", this); + } + } + + public void handleMessage(String event, JSONObject message) { + if ("Gecko:Ready".equals(event)) { + mDispatcher.unregisterEventListener("Gecko:Ready", this); + init(); + } + } + + public boolean onTouchEvent(MotionEvent event) { + // FIXME implement this + return false; + } + + public boolean onMotionEvent(MotionEvent event) { + // FIXME implement this + return false; + } + + public boolean onKeyEvent(KeyEvent event) { + // FIXME implement this + return false; + } + + public PointF getVelocityVector() { + // FIXME implement this + return new PointF(0, 0); + } + + public void pageRectUpdated() { + // no-op in APZC, I think + } + + public void abortPanning() { + // no-op in APZC, I think + } + + public void abortAnimation() { + // no-op in APZC, I think + } + + private native void init(); + private native void handleTouchEvent(GeckoEvent event); + private native void handleMotionEvent(GeckoEvent event); + + public native void destroy(); + public native void notifyDefaultActionPrevented(boolean prevented); + public native boolean getRedrawHint(); + public native void setOverScrollMode(int overscrollMode); + public native int getOverScrollMode(); +} diff --git a/mobile/android/base/jni-generator.py b/mobile/android/base/jni-generator.py index c7988152b52..2447411b95b 100644 --- a/mobile/android/base/jni-generator.py +++ b/mobile/android/base/jni-generator.py @@ -71,6 +71,8 @@ class Generator: returnValue = 'NULL' elif returnType in ('jint', 'jfloat', 'jdouble'): returnValue = '0' + elif returnType == 'jboolean': + returnValue = 'false' else: raise Exception(('Unsupported JNI return type %s found; ' + 'please update mobile/android/base/' diff --git a/mozglue/android/jni-stubs.inc b/mozglue/android/jni-stubs.inc index 67e6444e371..8ad766b135e 100644 --- a/mozglue/android/jni-stubs.inc +++ b/mozglue/android/jni-stubs.inc @@ -398,3 +398,155 @@ Java_org_mozilla_gecko_GeckoJavaSampler_getProfilerTime(JNIEnv * arg0, jclass ar xul_dlsym("Java_org_mozilla_gecko_GeckoJavaSampler_getProfilerTime", &f_Java_org_mozilla_gecko_GeckoJavaSampler_getProfilerTime); #endif +#ifdef JNI_STUBS + +typedef void (*Java_org_mozilla_gecko_gfx_NativePanZoomController_init_t)(JNIEnv *, jobject); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_init_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_init; +extern "C" NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_init(JNIEnv * arg0, jobject arg1) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_init) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return ; + } + f_Java_org_mozilla_gecko_gfx_NativePanZoomController_init(arg0, arg1); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_init", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_init); +#endif + +#ifdef JNI_STUBS + +typedef void (*Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent_t)(JNIEnv *, jobject, jobject); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent; +extern "C" NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent(JNIEnv * arg0, jobject arg1, jobject arg2) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return ; + } + f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent(arg0, arg1, arg2); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent); +#endif + +#ifdef JNI_STUBS + +typedef void (*Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent_t)(JNIEnv *, jobject, jobject); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent; +extern "C" NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent(JNIEnv * arg0, jobject arg1, jobject arg2) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return ; + } + f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent(arg0, arg1, arg2); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent); +#endif + +#ifdef JNI_STUBS + +typedef void (*Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy_t)(JNIEnv *, jobject); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy; +extern "C" NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy(JNIEnv * arg0, jobject arg1) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return ; + } + f_Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy(arg0, arg1); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy); +#endif + +#ifdef JNI_STUBS + +typedef void (*Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented_t)(JNIEnv *, jobject, jboolean); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented; +extern "C" NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented(JNIEnv * arg0, jobject arg1, jboolean arg2) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return ; + } + f_Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented(arg0, arg1, arg2); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented); +#endif + +#ifdef JNI_STUBS + +typedef jboolean (*Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint_t)(JNIEnv *, jobject); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint; +extern "C" NS_EXPORT jboolean JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint(JNIEnv * arg0, jobject arg1) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return false; + } + return f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint(arg0, arg1); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint); +#endif + +#ifdef JNI_STUBS + +typedef void (*Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode_t)(JNIEnv *, jobject, jint); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode; +extern "C" NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode(JNIEnv * arg0, jobject arg1, jint arg2) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return ; + } + f_Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode(arg0, arg1, arg2); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode); +#endif + +#ifdef JNI_STUBS + +typedef jint (*Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode_t)(JNIEnv *, jobject); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode; +extern "C" NS_EXPORT jint JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode(JNIEnv * arg0, jobject arg1) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return 0; + } + return f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode(arg0, arg1); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode); +#endif + diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index b64579acc0b..887860edc30 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -45,7 +45,7 @@ using namespace mozilla; NS_IMPL_THREADSAFE_ISUPPORTS0(nsFilePickerCallback) -AndroidBridge *AndroidBridge::sBridge = 0; +nsRefPtr AndroidBridge::sBridge = nullptr; static unsigned sJavaEnvThreadIndex = 0; static void JavaThreadDetachFunc(void *arg); @@ -2121,7 +2121,8 @@ AndroidBridge::SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayRes } AndroidBridge::AndroidBridge() - : mLayerClient(NULL) + : mLayerClient(NULL), + mNativePanZoomController(NULL) { } @@ -2693,3 +2694,46 @@ AndroidBridge::UnlockProfile() return ret; } +jobject +AndroidBridge::SetNativePanZoomController(jobject obj) +{ + jobject old = mNativePanZoomController; + mNativePanZoomController = obj; + return old; +} + +void +AndroidBridge::RequestContentRepaint(const mozilla::layers::FrameMetrics& aFrameMetrics) +{ + // FIXME implement this +} + +void +AndroidBridge::HandleDoubleTap(const nsIntPoint& aPoint) +{ + // FIXME implement this +} + +void +AndroidBridge::HandleSingleTap(const nsIntPoint& aPoint) +{ + // FIXME implement this +} + +void +AndroidBridge::HandleLongTap(const nsIntPoint& aPoint) +{ + // FIXME implement this +} + +void +AndroidBridge::SendAsyncScrollDOMEvent(const gfx::Rect& aContentRect, const gfx::Size& aScrollableSize) +{ + // FIXME implement this +} + +void +AndroidBridge::PostDelayedTask(Task* task, int delay_ms) +{ + // FIXME implement this +} diff --git a/widget/android/AndroidBridge.h b/widget/android/AndroidBridge.h index 45d8210845d..65499b413b4 100644 --- a/widget/android/AndroidBridge.h +++ b/widget/android/AndroidBridge.h @@ -29,6 +29,7 @@ #include "mozilla/Likely.h" #include "mozilla/StaticPtr.h" +#include "mozilla/layers/GeckoContentController.h" // Some debug #defines // #define DEBUG_ANDROID_EVENTS @@ -92,7 +93,7 @@ protected: virtual ~nsFilePickerCallback() {} }; -class AndroidBridge +class AndroidBridge : public mozilla::layers::GeckoContentController { public: enum { @@ -109,7 +110,7 @@ public: static void ConstructBridge(JNIEnv *jEnv, jclass jGeckoAppShellClass); static AndroidBridge *Bridge() { - return sBridge; + return sBridge.get(); } static JavaVM *GetVM() { @@ -384,7 +385,7 @@ public: const int32_t aPort, nsACString & aResult); protected: - static AndroidBridge *sBridge; + static nsRefPtr sBridge; nsTArray > mSmsRequests; // the global JavaVM @@ -543,6 +544,18 @@ protected: int (* Surface_unlockAndPost)(void* surface); void (* Region_constructor)(void* region); void (* Region_set)(void* region, void* rect); + +private: + jobject mNativePanZoomController; +public: + jobject SetNativePanZoomController(jobject obj); + // GeckoContentController methods + void RequestContentRepaint(const mozilla::layers::FrameMetrics& aFrameMetrics) MOZ_OVERRIDE; + void HandleDoubleTap(const nsIntPoint& aPoint) MOZ_OVERRIDE; + void HandleSingleTap(const nsIntPoint& aPoint) MOZ_OVERRIDE; + void HandleLongTap(const nsIntPoint& aPoint) MOZ_OVERRIDE; + void SendAsyncScrollDOMEvent(const gfx::Rect& aContentRect, const gfx::Size& aScrollableSize) MOZ_OVERRIDE; + void PostDelayedTask(Task* task, int delay_ms) MOZ_OVERRIDE; }; class AutoJObject { diff --git a/widget/android/AndroidJNI.cpp b/widget/android/AndroidJNI.cpp index fa55853e071..e6d08c5e1fe 100644 --- a/widget/android/AndroidJNI.cpp +++ b/widget/android/AndroidJNI.cpp @@ -35,6 +35,7 @@ #include "mozilla/dom/mobilemessage/Types.h" #include "mozilla/dom/mobilemessage/PSms.h" #include "mozilla/dom/mobilemessage/SmsParent.h" +#include "mozilla/layers/AsyncPanZoomController.h" #include "nsIMobileMessageDatabaseService.h" #include "nsPluginInstanceOwner.h" #include "nsSurfaceTexture.h" @@ -43,6 +44,7 @@ using namespace mozilla; using namespace mozilla::dom; using namespace mozilla::dom::mobilemessage; +using namespace mozilla::layers; /* Forward declare all the JNI methods as extern "C" */ @@ -883,4 +885,73 @@ Java_org_mozilla_gecko_GeckoJavaSampler_getProfilerTime(JNIEnv *jenv, jclass jc) return profiler_time(); } +NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_init(JNIEnv* env, jobject instance) +{ + if (!AndroidBridge::Bridge()) { + return; + } + + jobject oldRef = AndroidBridge::Bridge()->SetNativePanZoomController(env->NewGlobalRef(instance)); + if (oldRef) { + MOZ_ASSERT(false, "Registering a new NPZC when we already have one"); + env->DeleteGlobalRef(oldRef); + } + nsWindow::SetPanZoomController(new AsyncPanZoomController(AndroidBridge::Bridge(), AsyncPanZoomController::USE_GESTURE_DETECTOR)); +} + +NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent(JNIEnv* env, jobject instance, jobject event) +{ + // FIXME implement this +} + +NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent(JNIEnv* env, jobject instance, jobject event) +{ + // FIXME implement this +} + +NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy(JNIEnv* env, jobject instance) +{ + if (!AndroidBridge::Bridge()) { + return; + } + + nsWindow::SetPanZoomController(nullptr); + jobject oldRef = AndroidBridge::Bridge()->SetNativePanZoomController(NULL); + if (!oldRef) { + MOZ_ASSERT(false, "Clearing a non-existent NPZC"); + } else { + env->DeleteGlobalRef(oldRef); + } +} + +NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented(JNIEnv* env, jobject instance, jboolean prevented) +{ + // FIXME implement this +} + +NS_EXPORT jboolean JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_getRedrawHint(JNIEnv* env, jobject instance) +{ + // FIXME implement this + return true; +} + +NS_EXPORT void JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_setOverScrollMode(JNIEnv* env, jobject instance, jint overscrollMode) +{ + // FIXME implement this +} + +NS_EXPORT jint JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_getOverScrollMode(JNIEnv* env, jobject instance) +{ + // FIXME implement this + return 0; +} + } From 98388c43df0d5d482a41fb2f563d79ed48ebbdf0 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 26 Apr 2013 13:24:28 -0400 Subject: [PATCH 136/155] Bug 839641 - Send touch events and prevent-default notifications to APZC. r=Cwiiis --- mobile/android/base/GeckoApp.java | 2 +- mobile/android/base/GeckoEvent.java | 20 ++++--- .../base/gfx/NativePanZoomController.java | 3 +- widget/android/AndroidJNI.cpp | 15 +++++- widget/android/AndroidJavaWrappers.cpp | 54 +++++++++++++++++++ widget/android/AndroidJavaWrappers.h | 2 + 6 files changed, 86 insertions(+), 10 deletions(-) diff --git a/mobile/android/base/GeckoApp.java b/mobile/android/base/GeckoApp.java index f63fb78717a..1abf3c5c996 100644 --- a/mobile/android/base/GeckoApp.java +++ b/mobile/android/base/GeckoApp.java @@ -2440,7 +2440,7 @@ abstract public class GeckoApp } } - GeckoAppShell.sendEventToGecko(GeckoEvent.createMotionEvent(event)); + GeckoAppShell.sendEventToGecko(GeckoEvent.createMotionEvent(event, false)); return true; } diff --git a/mobile/android/base/GeckoEvent.java b/mobile/android/base/GeckoEvent.java index ef6e0b7c470..01947346d51 100644 --- a/mobile/android/base/GeckoEvent.java +++ b/mobile/android/base/GeckoEvent.java @@ -329,13 +329,19 @@ public class GeckoEvent { } } - public static GeckoEvent createMotionEvent(MotionEvent m) { + /** + * Creates a GeckoEvent that contains the data from the MotionEvent. + * The keepInViewCoordinates parameter can be set to false to convert from the Java + * coordinate system (device pixels relative to the LayerView) to a coordinate system + * relative to gecko's coordinate system (CSS pixels relative to gecko scroll position). + */ + public static GeckoEvent createMotionEvent(MotionEvent m, boolean keepInViewCoordinates) { GeckoEvent event = new GeckoEvent(NativeGeckoEvent.MOTION_EVENT); - event.initMotionEvent(m); + event.initMotionEvent(m, keepInViewCoordinates); return event; } - private void initMotionEvent(MotionEvent m) { + private void initMotionEvent(MotionEvent m, boolean keepInViewCoordinates) { mAction = m.getActionMasked(); mTime = (System.currentTimeMillis() - SystemClock.elapsedRealtime()) + m.getEventTime(); mMetaState = m.getMetaState(); @@ -358,7 +364,7 @@ public class GeckoEvent { mPointRadii = new Point[mCount]; mPointerIndex = m.getActionIndex(); for (int i = 0; i < mCount; i++) { - addMotionPoint(i, i, m); + addMotionPoint(i, i, m, keepInViewCoordinates); } break; } @@ -374,10 +380,12 @@ public class GeckoEvent { } } - private void addMotionPoint(int index, int eventIndex, MotionEvent event) { + private void addMotionPoint(int index, int eventIndex, MotionEvent event, boolean keepInViewCoordinates) { try { PointF geckoPoint = new PointF(event.getX(eventIndex), event.getY(eventIndex)); - geckoPoint = GeckoApp.mAppContext.getLayerView().convertViewPointToLayerPoint(geckoPoint); + if (!keepInViewCoordinates) { + geckoPoint = GeckoApp.mAppContext.getLayerView().convertViewPointToLayerPoint(geckoPoint); + } mPoints[index] = new Point(Math.round(geckoPoint.x), Math.round(geckoPoint.y)); mPointIndicies[index] = event.getPointerId(eventIndex); diff --git a/mobile/android/base/gfx/NativePanZoomController.java b/mobile/android/base/gfx/NativePanZoomController.java index 75e18ff6e00..8a317d16cb0 100644 --- a/mobile/android/base/gfx/NativePanZoomController.java +++ b/mobile/android/base/gfx/NativePanZoomController.java @@ -37,7 +37,8 @@ class NativePanZoomController implements PanZoomController, GeckoEventListener { } public boolean onTouchEvent(MotionEvent event) { - // FIXME implement this + GeckoEvent wrapped = GeckoEvent.createMotionEvent(event, true); + handleTouchEvent(wrapped); return false; } diff --git a/widget/android/AndroidJNI.cpp b/widget/android/AndroidJNI.cpp index e6d08c5e1fe..935b6e54091 100644 --- a/widget/android/AndroidJNI.cpp +++ b/widget/android/AndroidJNI.cpp @@ -903,7 +903,15 @@ Java_org_mozilla_gecko_gfx_NativePanZoomController_init(JNIEnv* env, jobject ins NS_EXPORT void JNICALL Java_org_mozilla_gecko_gfx_NativePanZoomController_handleTouchEvent(JNIEnv* env, jobject instance, jobject event) { - // FIXME implement this + AsyncPanZoomController *controller = nsWindow::GetPanZoomController(); + if (controller) { + AndroidGeckoEvent* wrapper = AndroidGeckoEvent::MakeFromJavaObject(env, event); + const MultiTouchInput& input = wrapper->MakeMultiTouchInput(nsWindow::TopWindow()); + delete wrapper; + if (input.mType >= 0) { + controller->ReceiveInputEvent(input); + } + } } NS_EXPORT void JNICALL @@ -931,7 +939,10 @@ Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy(JNIEnv* env, jobject NS_EXPORT void JNICALL Java_org_mozilla_gecko_gfx_NativePanZoomController_notifyDefaultActionPrevented(JNIEnv* env, jobject instance, jboolean prevented) { - // FIXME implement this + AsyncPanZoomController *controller = nsWindow::GetPanZoomController(); + if (controller) { + controller->ContentReceivedTouch(prevented); + } } NS_EXPORT jboolean JNICALL diff --git a/widget/android/AndroidJavaWrappers.cpp b/widget/android/AndroidJavaWrappers.cpp index 14b8397ad15..944d68a1228 100644 --- a/widget/android/AndroidJavaWrappers.cpp +++ b/widget/android/AndroidJavaWrappers.cpp @@ -744,6 +744,60 @@ AndroidGeckoEvent::MakeTouchEvent(nsIWidget* widget) return event; } +MultiTouchInput +AndroidGeckoEvent::MakeMultiTouchInput(nsIWidget* widget) +{ + MultiTouchInput::MultiTouchType type = (MultiTouchInput::MultiTouchType)-1; + int startIndex = 0; + int endIndex = Count(); + + switch (Action()) { + case AndroidMotionEvent::ACTION_DOWN: + case AndroidMotionEvent::ACTION_POINTER_DOWN: { + type = MultiTouchInput::MULTITOUCH_START; + break; + } + case AndroidMotionEvent::ACTION_MOVE: { + type = MultiTouchInput::MULTITOUCH_MOVE; + break; + } + case AndroidMotionEvent::ACTION_UP: + case AndroidMotionEvent::ACTION_POINTER_UP: { + // for pointer-up events we only want the data from + // the one pointer that went up + startIndex = PointerIndex(); + endIndex = startIndex + 1; + type = MultiTouchInput::MULTITOUCH_END; + break; + } + case AndroidMotionEvent::ACTION_OUTSIDE: + case AndroidMotionEvent::ACTION_CANCEL: { + type = MultiTouchInput::MULTITOUCH_CANCEL; + break; + } + } + + MultiTouchInput event(type, Time()); + + if (type < 0) { + // An event we don't know about + return event; + } + + const nsIntPoint& offset = widget->WidgetToScreenOffset(); + event.mTouches.SetCapacity(endIndex - startIndex); + for (int i = startIndex; i < endIndex; i++) { + SingleTouchData data(PointIndicies()[i], + Points()[i] - offset, + PointRadii()[i], + Orientations()[i], + Pressures()[i]); + event.mTouches.AppendElement(data); + } + + return event; +} + void AndroidPoint::Init(JNIEnv *jenv, jobject jobj) { diff --git a/widget/android/AndroidJavaWrappers.h b/widget/android/AndroidJavaWrappers.h index f83fb2aa992..699d4b3c94f 100644 --- a/widget/android/AndroidJavaWrappers.h +++ b/widget/android/AndroidJavaWrappers.h @@ -17,6 +17,7 @@ #include "nsTArray.h" #include "mozilla/gfx/Rect.h" #include "mozilla/dom/Touch.h" +#include "InputData.h" //#define FORCE_ALOG 1 @@ -556,6 +557,7 @@ public: int Width() { return mWidth; } int Height() { return mHeight; } nsTouchEvent MakeTouchEvent(nsIWidget* widget); + MultiTouchInput MakeMultiTouchInput(nsIWidget* widget); void UnionRect(nsIntRect const& aRect); protected: From 59ba0d1140d551ab1f620fe8be3c29d779f60537 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 26 Apr 2013 13:24:28 -0400 Subject: [PATCH 137/155] Bug 839641 - Use the mozilla::layers namespace in nsWindow.cpp. r=Cwiiis --- widget/android/nsWindow.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/widget/android/nsWindow.cpp b/widget/android/nsWindow.cpp index 2e396b46cb7..b0fa71b1085 100644 --- a/widget/android/nsWindow.cpp +++ b/widget/android/nsWindow.cpp @@ -55,6 +55,7 @@ using mozilla::unused; using namespace mozilla; using namespace mozilla::dom; using namespace mozilla::widget; +using namespace mozilla::layers; NS_IMPL_ISUPPORTS_INHERITED0(nsWindow, nsBaseWidget) @@ -2468,7 +2469,7 @@ nsWindow::NeedsPaint() return nsIWidget::NeedsPaint(); } -class AndroidCompositorParent : public mozilla::layers::CompositorParent { +class AndroidCompositorParent : public CompositorParent { public: AndroidCompositorParent(nsIWidget* aWidget, bool aRenderToEGLSurface, int aSurfaceWidth, int aSurfaceHeight) @@ -2479,13 +2480,12 @@ public: } } - virtual void ShadowLayersUpdated(mozilla::layers::LayerTransactionParent* aLayerTree, - const mozilla::layers::TargetConfig& aTargetConfig, + virtual void ShadowLayersUpdated(LayerTransactionParent* aLayerTree, const TargetConfig& aTargetConfig, bool isFirstPaint) MOZ_OVERRIDE { CompositorParent::ShadowLayersUpdated(aLayerTree, aTargetConfig, isFirstPaint); - mozilla::layers::Layer* targetLayer = GetLayerManager()->GetPrimaryScrollableLayer(); - mozilla::layers::AsyncPanZoomController* controller = nsWindow::GetPanZoomController(); + Layer* targetLayer = GetLayerManager()->GetPrimaryScrollableLayer(); + AsyncPanZoomController* controller = nsWindow::GetPanZoomController(); if (targetLayer && targetLayer->AsContainerLayer() && controller) { targetLayer->SetAsyncPanZoomController(controller); controller->NotifyLayersUpdated(targetLayer->AsContainerLayer()->GetFrameMetrics(), isFirstPaint); @@ -2493,14 +2493,14 @@ public: } }; -mozilla::layers::CompositorParent* +CompositorParent* nsWindow::NewCompositorParent(int aSurfaceWidth, int aSurfaceHeight) { return new AndroidCompositorParent(this, true, aSurfaceWidth, aSurfaceHeight); } void -nsWindow::SetPanZoomController(mozilla::layers::AsyncPanZoomController* apzc) +nsWindow::SetPanZoomController(AsyncPanZoomController* apzc) { if (sApzc) { sApzc->SetCompositorParent(nullptr); @@ -2512,7 +2512,7 @@ nsWindow::SetPanZoomController(mozilla::layers::AsyncPanZoomController* apzc) } } -mozilla::layers::AsyncPanZoomController* +AsyncPanZoomController* nsWindow::GetPanZoomController() { return sApzc; From ec0ecf5c7892d2dbfc126c58d2e0ba603fd50ed7 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 26 Apr 2013 13:26:39 -0400 Subject: [PATCH 138/155] Bug 839641 - Add a syncFrameMetrics code path to push viewport changes from APZC to Java. r=Cwiiis, BenWa --- gfx/layers/ipc/AsyncPanZoomController.cpp | 4 +- gfx/layers/ipc/AsyncPanZoomController.h | 3 +- gfx/layers/ipc/CompositorParent.cpp | 15 ++++++- gfx/layers/ipc/CompositorParent.h | 6 +++ mobile/android/base/gfx/GeckoLayerClient.java | 15 +++++++ widget/android/AndroidBridge.cpp | 13 +++++++ widget/android/AndroidBridge.h | 3 ++ widget/android/AndroidJavaWrappers.cpp | 39 +++++++++++++++++++ widget/android/AndroidJavaWrappers.h | 4 ++ widget/android/nsWindow.cpp | 18 +++++++++ 10 files changed, 116 insertions(+), 4 deletions(-) diff --git a/gfx/layers/ipc/AsyncPanZoomController.cpp b/gfx/layers/ipc/AsyncPanZoomController.cpp index 893fbe8c5c9..3c99253b0e4 100644 --- a/gfx/layers/ipc/AsyncPanZoomController.cpp +++ b/gfx/layers/ipc/AsyncPanZoomController.cpp @@ -1112,7 +1112,8 @@ AsyncPanZoomController::FireAsyncScrollOnTimeout() bool AsyncPanZoomController::SampleContentTransformForFrame(const TimeStamp& aSampleTime, ContainerLayer* aLayer, - ViewTransform* aNewTransform) { + ViewTransform* aNewTransform, + gfxPoint* aScrollOffset) { // The eventual return value of this function. The compositor needs to know // whether or not to advance by a frame as soon as it can. For example, if a // fling is happening, it has to keep compositing so that the animation is @@ -1221,6 +1222,7 @@ bool AsyncPanZoomController::SampleContentTransformForFrame(const TimeStamp& aSa gfxPoint scrollCompensation( (scrollOffset / rootScale - metricsScrollOffset) * localScale); *aNewTransform = ViewTransform(-scrollCompensation, localScale); + *aScrollOffset = scrollOffset * localScale; mLastSampleTime = aSampleTime; diff --git a/gfx/layers/ipc/AsyncPanZoomController.h b/gfx/layers/ipc/AsyncPanZoomController.h index c64610c8b46..5a927f195e1 100644 --- a/gfx/layers/ipc/AsyncPanZoomController.h +++ b/gfx/layers/ipc/AsyncPanZoomController.h @@ -177,7 +177,8 @@ public: */ bool SampleContentTransformForFrame(const TimeStamp& aSampleTime, ContainerLayer* aLayer, - ViewTransform* aTransform); + ViewTransform* aNewTransform, + gfxPoint* aScrollOffset); /** * A shadow layer update has arrived. |aViewportFrame| is the new FrameMetrics diff --git a/gfx/layers/ipc/CompositorParent.cpp b/gfx/layers/ipc/CompositorParent.cpp index 203ca539083..591f750e15d 100644 --- a/gfx/layers/ipc/CompositorParent.cpp +++ b/gfx/layers/ipc/CompositorParent.cpp @@ -846,10 +846,22 @@ CompositorParent::ApplyAsyncContentTransformToTree(TimeStamp aCurrentFrame, LayerComposite* layerComposite = aLayer->AsLayerComposite(); ViewTransform treeTransform; + gfxPoint scrollOffset; *aWantNextFrame |= controller->SampleContentTransformForFrame(aCurrentFrame, container, - &treeTransform); + &treeTransform, + &scrollOffset); + + gfx::Margin fixedLayerMargins(0, 0, 0, 0); + float offsetX = 0, offsetY = 0; + SyncFrameMetrics(aLayer, treeTransform, scrollOffset, fixedLayerMargins, + offsetX, offsetY, mIsFirstPaint, mLayersUpdated); + mIsFirstPaint = false; + mLayersUpdated = false; + + // Apply the render offset + mLayerManager->GetCompositor()->SetScreenRenderOffset(gfx::Point(offsetX, offsetY)); gfx3DMatrix transform(gfx3DMatrix(treeTransform) * aLayer->GetTransform()); // The transform already takes the resolution scale into account. Since we @@ -863,7 +875,6 @@ CompositorParent::ApplyAsyncContentTransformToTree(TimeStamp aCurrentFrame, 1); layerComposite->SetShadowTransform(transform); - gfx::Margin fixedLayerMargins(0, 0, 0, 0); TransformFixedLayers( aLayer, -treeTransform.mTranslation / treeTransform.mScale, diff --git a/gfx/layers/ipc/CompositorParent.h b/gfx/layers/ipc/CompositorParent.h index 1bb4f3cbcd8..75f77e32c34 100644 --- a/gfx/layers/ipc/CompositorParent.h +++ b/gfx/layers/ipc/CompositorParent.h @@ -181,6 +181,12 @@ protected: virtual void SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); + virtual void SyncFrameMetrics(Layer* aLayer, const ViewTransform& aTreeTransform, + const gfxPoint& aScrollOffset, gfx::Margin& aFixedLayerMargins, + float& aOffsetX, float& aOffsetY, + bool aIsFirstPaint, bool aLayersUpdated) { + } + void SetEGLSurfaceSize(int width, int height); private: diff --git a/mobile/android/base/gfx/GeckoLayerClient.java b/mobile/android/base/gfx/GeckoLayerClient.java index e2c20dec0ed..7f01f3a98dd 100644 --- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -657,6 +657,21 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget return mCurrentViewTransform; } + /* Invoked by JNI from the compositor thread */ + public ViewTransform syncFrameMetrics(float offsetX, float offsetY, float zoom, + float cssPageLeft, float cssPageTop, float cssPageRight, float cssPageBottom, + boolean layersUpdated, int x, int y, int width, int height, float resolution, + boolean isFirstPaint) + { + if (isFirstPaint) { + RectF pageRect = RectUtils.scale(new RectF(cssPageLeft, cssPageTop, cssPageRight, cssPageBottom), zoom); + setFirstPaintViewport(offsetX, offsetY, zoom, pageRect.left, pageRect.top, pageRect.right, + pageRect.bottom, cssPageLeft, cssPageTop, cssPageRight, cssPageBottom); + } + + return syncViewportInfo(x, y, width, height, resolution, layersUpdated); + } + /** This function is invoked by Gecko via JNI; be careful when modifying signature. */ public LayerRenderer.Frame createFrame() { // Create the shaders and textures if necessary. diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index 887860edc30..30ae668e6da 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -2120,6 +2120,19 @@ AndroidBridge::SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayRes aOffsetX, aOffsetY); } +void AndroidBridge::SyncFrameMetrics(const gfx::Point& aOffset, float aZoom, const gfx::Rect& aCssPageRect, + bool aLayersUpdated, const gfx::Rect& aDisplayPort, float aDisplayResolution, + bool aIsFirstPaint, gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY) +{ + AndroidGeckoLayerClient *client = mLayerClient; + if (!client) + return; + + client->SyncFrameMetrics(aOffset, aZoom, aCssPageRect, + aLayersUpdated, aDisplayPort, aDisplayResolution, + aIsFirstPaint, aFixedLayerMargins, aOffsetX, aOffsetY); +} + AndroidBridge::AndroidBridge() : mLayerClient(NULL), mNativePanZoomController(NULL) diff --git a/widget/android/AndroidBridge.h b/widget/android/AndroidBridge.h index 65499b413b4..34d5312d84d 100644 --- a/widget/android/AndroidBridge.h +++ b/widget/android/AndroidBridge.h @@ -344,6 +344,9 @@ public: void SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); + void SyncFrameMetrics(const gfx::Point& aOffset, float aZoom, const gfx::Rect& aCssPageRect, + bool aLayersUpdated, const gfx::Rect& aDisplayPort, float aDisplayResolution, + bool aIsFirstPaint, gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); void AddPluginView(jobject view, const gfxRect& rect, bool isFullScreen); void RemovePluginView(jobject view, bool isFullScreen); diff --git a/widget/android/AndroidJavaWrappers.cpp b/widget/android/AndroidJavaWrappers.cpp index 944d68a1228..e5923f58817 100644 --- a/widget/android/AndroidJavaWrappers.cpp +++ b/widget/android/AndroidJavaWrappers.cpp @@ -89,6 +89,7 @@ jclass AndroidGeckoLayerClient::jDisplayportClass = 0; jmethodID AndroidGeckoLayerClient::jSetFirstPaintViewport = 0; jmethodID AndroidGeckoLayerClient::jSetPageRect = 0; jmethodID AndroidGeckoLayerClient::jSyncViewportInfoMethod = 0; +jmethodID AndroidGeckoLayerClient::jSyncFrameMetricsMethod = 0; jmethodID AndroidGeckoLayerClient::jCreateFrameMethod = 0; jmethodID AndroidGeckoLayerClient::jActivateProgramMethod = 0; jmethodID AndroidGeckoLayerClient::jDeactivateProgramMethod = 0; @@ -349,6 +350,8 @@ AndroidGeckoLayerClient::InitGeckoLayerClientClass(JNIEnv *jEnv) jSetPageRect = getMethod("setPageRect", "(FFFF)V"); jSyncViewportInfoMethod = getMethod("syncViewportInfo", "(IIIIFZ)Lorg/mozilla/gecko/gfx/ViewTransform;"); + jSyncFrameMetricsMethod = getMethod("syncFrameMetrics", + "(FFFFFFFZIIIIFZ)Lorg/mozilla/gecko/gfx/ViewTransform;"); jCreateFrameMethod = getMethod("createFrame", "()Lorg/mozilla/gecko/gfx/LayerRenderer$Frame;"); jActivateProgramMethod = getMethod("activateProgram", "()V"); jDeactivateProgramMethod = getMethod("deactivateProgram", "()V"); @@ -911,6 +914,42 @@ AndroidGeckoLayerClient::SyncViewportInfo(const nsIntRect& aDisplayPort, float a aOffsetY = viewTransform.GetOffsetY(env); } +void +AndroidGeckoLayerClient::SyncFrameMetrics(const gfx::Point& aOffset, float aZoom, const gfx::Rect& aCssPageRect, + bool aLayersUpdated, const gfx::Rect& aDisplayPort, float aDisplayResolution, + bool aIsFirstPaint, gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY) +{ + NS_ASSERTION(!isNull(), "SyncFrameMetrics called on null layer client!"); + JNIEnv *env = GetJNIForThread(); // this is called on the compositor thread + if (!env) + return; + + AutoLocalJNIFrame jniFrame(env); + + // convert the displayport rect from scroll-relative CSS pixels to document-relative device pixels + int dpX = NS_lround((aDisplayPort.x * aDisplayResolution) + aOffset.x); + int dpY = NS_lround((aDisplayPort.y * aDisplayResolution) + aOffset.y); + int dpW = NS_lround(aDisplayPort.width * aDisplayResolution); + int dpH = NS_lround(aDisplayPort.height * aDisplayResolution); + + jobject viewTransformJObj = env->CallObjectMethod(wrapped_obj, jSyncFrameMetricsMethod, + aOffset.x, aOffset.y, aZoom, + aCssPageRect.x, aCssPageRect.y, aCssPageRect.XMost(), aCssPageRect.YMost(), + aLayersUpdated, dpX, dpY, dpW, dpH, aDisplayResolution, + aIsFirstPaint); + + if (jniFrame.CheckForException()) + return; + + NS_ABORT_IF_FALSE(viewTransformJObj, "No view transform object!"); + + AndroidViewTransform viewTransform; + viewTransform.Init(viewTransformJObj); + viewTransform.GetFixedLayerMargins(env, aFixedLayerMargins); + aOffsetX = viewTransform.GetOffsetX(env); + aOffsetY = viewTransform.GetOffsetY(env); +} + bool AndroidGeckoLayerClient::ProgressiveUpdateCallback(bool aHasPendingNewThebesContent, const gfx::Rect& aDisplayPort, diff --git a/widget/android/AndroidJavaWrappers.h b/widget/android/AndroidJavaWrappers.h index 699d4b3c94f..079d89df301 100644 --- a/widget/android/AndroidJavaWrappers.h +++ b/widget/android/AndroidJavaWrappers.h @@ -272,6 +272,9 @@ public: void SyncViewportInfo(const nsIntRect& aDisplayPort, float aDisplayResolution, bool aLayersUpdated, nsIntPoint& aScrollOffset, float& aScaleX, float& aScaleY, gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); + void SyncFrameMetrics(const gfx::Point& aOffset, float aZoom, const gfx::Rect& aCssPageRect, + bool aLayersUpdated, const gfx::Rect& aDisplayPort, float aDisplayResolution, + bool aIsFirstPaint, gfx::Margin& aFixedLayerMargins, float& aOffsetX, float& aOffsetY); bool ProgressiveUpdateCallback(bool aHasPendingNewThebesContent, const gfx::Rect& aDisplayPort, float aDisplayResolution, bool aDrawingCritical, gfx::Rect& aViewport, float& aScaleX, float& aScaleY); bool CreateFrame(AutoLocalJNIFrame *jniFrame, AndroidLayerRendererFrame& aFrame); bool ActivateProgram(AutoLocalJNIFrame *jniFrame); @@ -283,6 +286,7 @@ protected: static jmethodID jSetFirstPaintViewport; static jmethodID jSetPageRect; static jmethodID jSyncViewportInfoMethod; + static jmethodID jSyncFrameMetricsMethod; static jmethodID jCreateFrameMethod; static jmethodID jActivateProgramMethod; static jmethodID jDeactivateProgramMethod; diff --git a/widget/android/nsWindow.cpp b/widget/android/nsWindow.cpp index b0fa71b1085..bebd5fd7313 100644 --- a/widget/android/nsWindow.cpp +++ b/widget/android/nsWindow.cpp @@ -2491,6 +2491,24 @@ public: controller->NotifyLayersUpdated(targetLayer->AsContainerLayer()->GetFrameMetrics(), isFirstPaint); } } + + virtual void SyncFrameMetrics(Layer* aLayer, const ViewTransform& aTreeTransform, + const gfxPoint& aScrollOffset, mozilla::gfx::Margin& aFixedLayerMargins, + float& aOffsetX, float& aOffsetY, + bool aIsFirstPaint, bool aLayersUpdated) MOZ_OVERRIDE + { + const gfx3DMatrix& rootTransform = GetLayerManager()->GetRoot()->GetTransform(); + ContainerLayer* container = aLayer->AsContainerLayer(); + const FrameMetrics& metrics = container->GetFrameMetrics(); + + mozilla::gfx::Rect displayPortLayersPixels(metrics.mCriticalDisplayPort.IsEmpty() ? + metrics.mDisplayPort : metrics.mCriticalDisplayPort); + mozilla::gfx::Point scrollOffset(aScrollOffset.x, aScrollOffset.y); + + AndroidBridge::Bridge()->SyncFrameMetrics(scrollOffset, aTreeTransform.mScale.width, metrics.mScrollableRect, + aLayersUpdated, displayPortLayersPixels, 1 / rootTransform.GetXScale(), + aIsFirstPaint, aFixedLayerMargins, aOffsetX, aOffsetY); + } }; CompositorParent* From 23bf9f79777a4e4cf00c1d5d18ff48f552c0fad6 Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 26 Apr 2013 13:26:46 -0400 Subject: [PATCH 139/155] Bug 839641 - Implement handling for APZC-reported gestures. r=Cwiiis --- widget/android/AndroidBridge.cpp | 13 ++++++++++--- widget/android/AndroidJavaWrappers.h | 8 ++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index 30ae668e6da..9262802a436 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -34,6 +34,7 @@ #include "nsIDOMClientRect.h" #include "StrongPointer.h" #include "mozilla/ClearOnShutdown.h" +#include "nsPrintfCString.h" #ifdef DEBUG #define ALOG_BRIDGE(args...) ALOG(args) @@ -2724,19 +2725,25 @@ AndroidBridge::RequestContentRepaint(const mozilla::layers::FrameMetrics& aFrame void AndroidBridge::HandleDoubleTap(const nsIntPoint& aPoint) { - // FIXME implement this + nsCString data = nsPrintfCString("{ \"x\": %d, \"y\": %d }", aPoint.x, aPoint.y); + nsAppShell::gAppShell->PostEvent(AndroidGeckoEvent::MakeBroadcastEvent( + NS_LITERAL_CSTRING("Gesture:DoubleTap"), data)); } void AndroidBridge::HandleSingleTap(const nsIntPoint& aPoint) { - // FIXME implement this + nsCString data = nsPrintfCString("{ \"x\": %d, \"y\": %d }", aPoint.x, aPoint.y); + nsAppShell::gAppShell->PostEvent(AndroidGeckoEvent::MakeBroadcastEvent( + NS_LITERAL_CSTRING("Gesture:SingleTap"), data)); } void AndroidBridge::HandleLongTap(const nsIntPoint& aPoint) { - // FIXME implement this + nsCString data = nsPrintfCString("{ \"x\": %d, \"y\": %d }", aPoint.x, aPoint.y); + nsAppShell::gAppShell->PostEvent(AndroidGeckoEvent::MakeBroadcastEvent( + NS_LITERAL_CSTRING("Gesture:LongPress"), data)); } void diff --git a/widget/android/AndroidJavaWrappers.h b/widget/android/AndroidJavaWrappers.h index 079d89df301..d311be1b67d 100644 --- a/widget/android/AndroidJavaWrappers.h +++ b/widget/android/AndroidJavaWrappers.h @@ -516,6 +516,14 @@ public: return event; } + static AndroidGeckoEvent* MakeBroadcastEvent(const nsCString& topic, const nsCString& data) { + AndroidGeckoEvent* event = new AndroidGeckoEvent(); + event->Init(BROADCAST); + CopyUTF8toUTF16(topic, event->mCharacters); + CopyUTF8toUTF16(data, event->mCharactersExtra); + return event; + } + int Action() { return mAction; } int Type() { return mType; } bool AckNeeded() { return mAckNeeded; } From 407d7d396999575d5a151a46b87e3b1ab9d7230b Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 26 Apr 2013 13:26:46 -0400 Subject: [PATCH 140/155] Bug 839641 - Implement the RequestContentRepaint callback for APZC in AndroidBridge. r=Cwiiis --- mobile/android/base/gfx/GeckoLayerClient.java | 10 +++++----- .../base/gfx/JavaPanZoomController.java | 8 ++++---- mobile/android/base/gfx/LayerView.java | 2 +- .../base/gfx/NativePanZoomController.java | 7 +++++++ mobile/android/base/gfx/PanZoomTarget.java | 2 +- widget/android/AndroidBridge.cpp | 20 ++++++++++++++++++- widget/android/AndroidBridge.h | 2 ++ 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/mobile/android/base/gfx/GeckoLayerClient.java b/mobile/android/base/gfx/GeckoLayerClient.java index 7f01f3a98dd..ecbcfd459b7 100644 --- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -694,11 +694,11 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget mLayerRenderer.deactivateDefaultProgram(); } - private void geometryChanged() { + private void geometryChanged(DisplayPortMetrics displayPort) { /* Let Gecko know if the screensize has changed */ sendResizeEventIfNecessary(false); if (getRedrawHint()) { - adjustViewport(null); + adjustViewport(displayPort); } } @@ -794,7 +794,7 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget mView.requestRender(); if (notifyGecko && mGeckoIsReady) { - geometryChanged(); + geometryChanged(null); } setShadowVisibility(); } @@ -856,10 +856,10 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget /** Implementation of PanZoomTarget */ @Override - public void forceRedraw() { + public void forceRedraw(DisplayPortMetrics displayPort) { mForceRedraw = true; if (mGeckoIsReady) { - geometryChanged(); + geometryChanged(displayPort); } } diff --git a/mobile/android/base/gfx/JavaPanZoomController.java b/mobile/android/base/gfx/JavaPanZoomController.java index aff04fa047a..c245fb4967d 100644 --- a/mobile/android/base/gfx/JavaPanZoomController.java +++ b/mobile/android/base/gfx/JavaPanZoomController.java @@ -355,7 +355,7 @@ class JavaPanZoomController // transitions. synchronized (mTarget.getLock()) { mTarget.setViewportMetrics(getValidViewportMetrics()); - mTarget.forceRedraw(); + mTarget.forceRedraw(null); } break; } @@ -413,7 +413,7 @@ class JavaPanZoomController // We just interrupted a double-tap animation, so force a redraw in // case this touchstart is just a tap that doesn't end up triggering // a redraw - mTarget.forceRedraw(); + mTarget.forceRedraw(null); // fall through case FLING: case AUTONAV: @@ -967,7 +967,7 @@ class JavaPanZoomController stopAnimationTimer(); // Force a viewport synchronisation - mTarget.forceRedraw(); + mTarget.forceRedraw(null); } /* Returns the nearest viewport metrics with no overscroll visible. */ @@ -1187,7 +1187,7 @@ class JavaPanZoomController startTouch(detector.getFocusX(), detector.getFocusY(), detector.getEventTime()); // Force a viewport synchronisation - mTarget.forceRedraw(); + mTarget.forceRedraw(null); PointF point = new PointF(detector.getFocusX(), detector.getFocusY()); GeckoEvent event = GeckoEvent.createNativeGestureEvent(GeckoEvent.ACTION_MAGNIFY_END, point, getMetrics().zoomFactor); diff --git a/mobile/android/base/gfx/LayerView.java b/mobile/android/base/gfx/LayerView.java index 1bc84abcf84..24164762ca0 100644 --- a/mobile/android/base/gfx/LayerView.java +++ b/mobile/android/base/gfx/LayerView.java @@ -245,7 +245,7 @@ public class LayerView extends FrameLayout { public void setInputConnectionHandler(InputConnectionHandler inputConnectionHandler) { mInputConnectionHandler = inputConnectionHandler; - mLayerClient.forceRedraw(); + mLayerClient.forceRedraw(null); } @Override diff --git a/mobile/android/base/gfx/NativePanZoomController.java b/mobile/android/base/gfx/NativePanZoomController.java index 8a317d16cb0..96e2618344b 100644 --- a/mobile/android/base/gfx/NativePanZoomController.java +++ b/mobile/android/base/gfx/NativePanZoomController.java @@ -18,9 +18,11 @@ import android.view.MotionEvent; import android.view.View; class NativePanZoomController implements PanZoomController, GeckoEventListener { + private final PanZoomTarget mTarget; private final EventDispatcher mDispatcher; NativePanZoomController(PanZoomTarget target, View view, EventDispatcher dispatcher) { + mTarget = target; mDispatcher = dispatcher; if (GeckoThread.checkLaunchState(GeckoThread.LaunchState.GeckoRunning)) { init(); @@ -78,4 +80,9 @@ class NativePanZoomController implements PanZoomController, GeckoEventListener { public native boolean getRedrawHint(); public native void setOverScrollMode(int overscrollMode); public native int getOverScrollMode(); + + /* Invoked from JNI */ + private void requestContentRepaint(float x, float y, float width, float height, float resolution) { + mTarget.forceRedraw(new DisplayPortMetrics(x, y, x + width, y + height, resolution)); + } } diff --git a/mobile/android/base/gfx/PanZoomTarget.java b/mobile/android/base/gfx/PanZoomTarget.java index 8a82266c101..4cf58306704 100644 --- a/mobile/android/base/gfx/PanZoomTarget.java +++ b/mobile/android/base/gfx/PanZoomTarget.java @@ -19,7 +19,7 @@ public interface PanZoomTarget { public void scrollBy(float dx, float dy); public void panZoomStopped(); /** This triggers an (asynchronous) viewport update/redraw. */ - public void forceRedraw(); + public void forceRedraw(DisplayPortMetrics displayPort); public boolean post(Runnable action); public Object getLock(); diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index 9262802a436..fec307f8580 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -6,6 +6,7 @@ #include "mozilla/Util.h" #include "mozilla/layers/CompositorChild.h" #include "mozilla/layers/CompositorParent.h" +#include "mozilla/layers/AsyncPanZoomController.h" #include #include @@ -226,6 +227,9 @@ AndroidBridge::Init(JNIEnv *jEnv, jProvideEGLSurfaceMethod = jEnv->GetMethodID(glControllerClass, "provideEGLSurface", "()Ljavax/microedition/khronos/egl/EGLSurface;"); + jclass nativePanZoomControllerClass = jEnv->FindClass("org/mozilla/gecko/gfx/NativePanZoomController"); + jRequestContentRepaint = jEnv->GetMethodID(nativePanZoomControllerClass, "requestContentRepaint", "(FFFFF)V"); + jclass eglClass = jEnv->FindClass("com/google/android/gles_jni/EGLSurfaceImpl"); if (eglClass) { jEGLSurfacePointerField = jEnv->GetFieldID(eglClass, "mEGLSurface", "I"); @@ -2719,7 +2723,21 @@ AndroidBridge::SetNativePanZoomController(jobject obj) void AndroidBridge::RequestContentRepaint(const mozilla::layers::FrameMetrics& aFrameMetrics) { - // FIXME implement this + ALOG_BRIDGE("AndroidBridge::RequestContentRepaint"); + JNIEnv* env = GetJNIForThread(); // called on the compositor thread + if (!env || !mNativePanZoomController) { + return; + } + + float resolution = mozilla::layers::AsyncPanZoomController::CalculateResolution(aFrameMetrics).width; + float dpX = (aFrameMetrics.mDisplayPort.x + aFrameMetrics.mScrollOffset.x) * resolution; + float dpY = (aFrameMetrics.mDisplayPort.y + aFrameMetrics.mScrollOffset.y) * resolution; + float dpW = aFrameMetrics.mDisplayPort.width * resolution; + float dpH = aFrameMetrics.mDisplayPort.height * resolution; + + AutoLocalJNIFrame jniFrame(env, 0); + env->CallVoidMethod(mNativePanZoomController, jRequestContentRepaint, + dpX, dpY, dpW, dpH, resolution); } void diff --git a/widget/android/AndroidBridge.h b/widget/android/AndroidBridge.h index 34d5312d84d..6e2b7a2558f 100644 --- a/widget/android/AndroidBridge.h +++ b/widget/android/AndroidBridge.h @@ -527,6 +527,8 @@ protected: jfieldID jEGLSurfacePointerField; jobject mGLControllerObj; + jmethodID jRequestContentRepaint; + // some convinient types to have around jclass jStringClass; From 0553da9e215a0358958d953eabed0a7d60c93b4a Mon Sep 17 00:00:00 2001 From: Kartikaya Gupta Date: Fri, 26 Apr 2013 13:26:46 -0400 Subject: [PATCH 141/155] Bug 839641 - Implement the PostDelayedTask callback for APZC in AndroidBridge. r=Cwiiis, blassey --- mobile/android/base/gfx/GeckoLayerClient.java | 6 ++ .../base/gfx/NativePanZoomController.java | 18 ++++++ mobile/android/base/gfx/PanZoomTarget.java | 1 + mobile/android/base/jni-generator.py | 2 +- mozglue/android/jni-stubs.inc | 19 +++++++ widget/android/AndroidBridge.cpp | 56 ++++++++++++++++++- widget/android/AndroidBridge.h | 36 +++++++++++- widget/android/AndroidJNI.cpp | 10 ++++ 8 files changed, 144 insertions(+), 4 deletions(-) diff --git a/mobile/android/base/gfx/GeckoLayerClient.java b/mobile/android/base/gfx/GeckoLayerClient.java index ecbcfd459b7..62027df0504 100644 --- a/mobile/android/base/gfx/GeckoLayerClient.java +++ b/mobile/android/base/gfx/GeckoLayerClient.java @@ -869,6 +869,12 @@ public class GeckoLayerClient implements LayerView.Listener, PanZoomTarget return mView.post(action); } + /** Implementation of PanZoomTarget */ + @Override + public boolean postDelayed(Runnable action, long delayMillis) { + return mView.postDelayed(action, delayMillis); + } + /** Implementation of PanZoomTarget */ @Override public Object getLock() { diff --git a/mobile/android/base/gfx/NativePanZoomController.java b/mobile/android/base/gfx/NativePanZoomController.java index 96e2618344b..8177deb926e 100644 --- a/mobile/android/base/gfx/NativePanZoomController.java +++ b/mobile/android/base/gfx/NativePanZoomController.java @@ -20,10 +20,12 @@ import android.view.View; class NativePanZoomController implements PanZoomController, GeckoEventListener { private final PanZoomTarget mTarget; private final EventDispatcher mDispatcher; + private final CallbackRunnable mCallbackRunnable; NativePanZoomController(PanZoomTarget target, View view, EventDispatcher dispatcher) { mTarget = target; mDispatcher = dispatcher; + mCallbackRunnable = new CallbackRunnable(); if (GeckoThread.checkLaunchState(GeckoThread.LaunchState.GeckoRunning)) { init(); } else { @@ -74,6 +76,7 @@ class NativePanZoomController implements PanZoomController, GeckoEventListener { private native void init(); private native void handleTouchEvent(GeckoEvent event); private native void handleMotionEvent(GeckoEvent event); + private native long runDelayedCallback(); public native void destroy(); public native void notifyDefaultActionPrevented(boolean prevented); @@ -85,4 +88,19 @@ class NativePanZoomController implements PanZoomController, GeckoEventListener { private void requestContentRepaint(float x, float y, float width, float height, float resolution) { mTarget.forceRedraw(new DisplayPortMetrics(x, y, x + width, y + height, resolution)); } + + /* Invoked from JNI */ + private void postDelayedCallback(long delay) { + mTarget.postDelayed(mCallbackRunnable, delay); + } + + class CallbackRunnable implements Runnable { + @Override + public void run() { + long nextDelay = runDelayedCallback(); + if (nextDelay >= 0) { + mTarget.postDelayed(this, nextDelay); + } + } + } } diff --git a/mobile/android/base/gfx/PanZoomTarget.java b/mobile/android/base/gfx/PanZoomTarget.java index 4cf58306704..ef01a723099 100644 --- a/mobile/android/base/gfx/PanZoomTarget.java +++ b/mobile/android/base/gfx/PanZoomTarget.java @@ -22,6 +22,7 @@ public interface PanZoomTarget { public void forceRedraw(DisplayPortMetrics displayPort); public boolean post(Runnable action); + public boolean postDelayed(Runnable action, long delayMillis); public Object getLock(); public PointF convertViewPointToLayerPoint(PointF viewPoint); } diff --git a/mobile/android/base/jni-generator.py b/mobile/android/base/jni-generator.py index 2447411b95b..577cea059b3 100644 --- a/mobile/android/base/jni-generator.py +++ b/mobile/android/base/jni-generator.py @@ -69,7 +69,7 @@ class Generator: returnValue = '' elif returnType == 'jobject': returnValue = 'NULL' - elif returnType in ('jint', 'jfloat', 'jdouble'): + elif returnType in ('jint', 'jfloat', 'jdouble', 'jlong'): returnValue = '0' elif returnType == 'jboolean': returnValue = 'false' diff --git a/mozglue/android/jni-stubs.inc b/mozglue/android/jni-stubs.inc index 8ad766b135e..92cb258cef6 100644 --- a/mozglue/android/jni-stubs.inc +++ b/mozglue/android/jni-stubs.inc @@ -457,6 +457,25 @@ Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent(JNIEnv * ar #ifdef JNI_STUBS +typedef jlong (*Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback_t)(JNIEnv *, jobject); +static Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback; +extern "C" NS_EXPORT jlong JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback(JNIEnv * arg0, jobject arg1) { + if (!f_Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback) { + arg0->ThrowNew(arg0->FindClass("java/lang/UnsupportedOperationException"), + "JNI Function called before it was loaded"); + return 0; + } + return f_Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback(arg0, arg1); +} +#endif + +#ifdef JNI_BINDINGS + xul_dlsym("Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback", &f_Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback); +#endif + +#ifdef JNI_STUBS + typedef void (*Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy_t)(JNIEnv *, jobject); static Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy_t f_Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy; extern "C" NS_EXPORT void JNICALL diff --git a/widget/android/AndroidBridge.cpp b/widget/android/AndroidBridge.cpp index fec307f8580..b88d76d26aa 100644 --- a/widget/android/AndroidBridge.cpp +++ b/widget/android/AndroidBridge.cpp @@ -229,6 +229,7 @@ AndroidBridge::Init(JNIEnv *jEnv, jclass nativePanZoomControllerClass = jEnv->FindClass("org/mozilla/gecko/gfx/NativePanZoomController"); jRequestContentRepaint = jEnv->GetMethodID(nativePanZoomControllerClass, "requestContentRepaint", "(FFFFF)V"); + jPostDelayedCallback = jEnv->GetMethodID(nativePanZoomControllerClass, "postDelayedCallback", "(J)V"); jclass eglClass = jEnv->FindClass("com/google/android/gles_jni/EGLSurfaceImpl"); if (eglClass) { @@ -2771,7 +2772,58 @@ AndroidBridge::SendAsyncScrollDOMEvent(const gfx::Rect& aContentRect, const gfx: } void -AndroidBridge::PostDelayedTask(Task* task, int delay_ms) +AndroidBridge::PostDelayedTask(Task* aTask, int aDelayMs) { - // FIXME implement this + JNIEnv* env = GetJNIForThread(); + if (!env || !mNativePanZoomController) { + return; + } + + // add the new task into the mDelayedTaskQueue, sorted with + // the earliest task first in the queue + DelayedTask* newTask = new DelayedTask(aTask, aDelayMs); + uint32_t i = 0; + while (i < mDelayedTaskQueue.Length()) { + if (newTask->IsEarlierThan(mDelayedTaskQueue[i])) { + mDelayedTaskQueue.InsertElementAt(i, newTask); + break; + } + i++; + } + if (i == mDelayedTaskQueue.Length()) { + // this new task will run after all the existing tasks in the queue + mDelayedTaskQueue.AppendElement(newTask); + } + if (i == 0) { + // if we're inserting it at the head of the queue, notify Java because + // we need to get a callback at an earlier time than the last scheduled + // callback + AutoLocalJNIFrame jniFrame(env, 0); + env->CallVoidMethod(mNativePanZoomController, jPostDelayedCallback, (int64_t)aDelayMs); + } +} + +int64_t +AndroidBridge::RunDelayedTasks() +{ + while (mDelayedTaskQueue.Length() > 0) { + DelayedTask* nextTask = mDelayedTaskQueue[0]; + int64_t timeLeft = nextTask->MillisecondsToRunTime(); + if (timeLeft > 0) { + // this task (and therefore all remaining tasks) + // have not yet reached their runtime. return the + // time left until we should be called again + return timeLeft; + } + + // we have a delayed task to run. extract it from + // the wrapper and free the wrapper + + mDelayedTaskQueue.RemoveElementAt(0); + Task* task = nextTask->GetTask(); + delete nextTask; + + task->Run(); + } + return -1; } diff --git a/widget/android/AndroidBridge.h b/widget/android/AndroidBridge.h index 6e2b7a2558f..caec78bfb9b 100644 --- a/widget/android/AndroidBridge.h +++ b/widget/android/AndroidBridge.h @@ -30,6 +30,7 @@ #include "mozilla/Likely.h" #include "mozilla/StaticPtr.h" #include "mozilla/layers/GeckoContentController.h" +#include "mozilla/TimeStamp.h" // Some debug #defines // #define DEBUG_ANDROID_EVENTS @@ -93,6 +94,32 @@ protected: virtual ~nsFilePickerCallback() {} }; +class DelayedTask { +public: + DelayedTask(Task* aTask, int aDelayMs) { + mTask = aTask; + mRunTime = TimeStamp::Now() + TimeDuration::FromMilliseconds(aDelayMs); + } + + bool IsEarlierThan(DelayedTask *aOther) { + return mRunTime < aOther->mRunTime; + } + + int64_t MillisecondsToRunTime() { + TimeDuration timeLeft = mRunTime - TimeStamp::Now(); + return (int64_t)timeLeft.ToMilliseconds(); + } + + Task* GetTask() { + return mTask; + } + +private: + Task* mTask; + TimeStamp mRunTime; +}; + + class AndroidBridge : public mozilla::layers::GeckoContentController { public: @@ -528,6 +555,7 @@ protected: jobject mGLControllerObj; jmethodID jRequestContentRepaint; + jmethodID jPostDelayedCallback; // some convinient types to have around jclass jStringClass; @@ -552,6 +580,11 @@ protected: private: jobject mNativePanZoomController; + // This will always be accessed from one thread (the APZC "controller" + // thread, which is the Java UI thread), so we don't need to do locking + // to touch it + nsTArray mDelayedTaskQueue; + public: jobject SetNativePanZoomController(jobject obj); // GeckoContentController methods @@ -560,7 +593,8 @@ public: void HandleSingleTap(const nsIntPoint& aPoint) MOZ_OVERRIDE; void HandleLongTap(const nsIntPoint& aPoint) MOZ_OVERRIDE; void SendAsyncScrollDOMEvent(const gfx::Rect& aContentRect, const gfx::Size& aScrollableSize) MOZ_OVERRIDE; - void PostDelayedTask(Task* task, int delay_ms) MOZ_OVERRIDE; + void PostDelayedTask(Task* aTask, int aDelayMs) MOZ_OVERRIDE; + int64_t RunDelayedTasks(); }; class AutoJObject { diff --git a/widget/android/AndroidJNI.cpp b/widget/android/AndroidJNI.cpp index 935b6e54091..398b92c6944 100644 --- a/widget/android/AndroidJNI.cpp +++ b/widget/android/AndroidJNI.cpp @@ -920,6 +920,16 @@ Java_org_mozilla_gecko_gfx_NativePanZoomController_handleMotionEvent(JNIEnv* env // FIXME implement this } +NS_EXPORT jlong JNICALL +Java_org_mozilla_gecko_gfx_NativePanZoomController_runDelayedCallback(JNIEnv* env, jobject instance) +{ + if (!AndroidBridge::Bridge()) { + return -1; + } + + return AndroidBridge::Bridge()->RunDelayedTasks(); +} + NS_EXPORT void JNICALL Java_org_mozilla_gecko_gfx_NativePanZoomController_destroy(JNIEnv* env, jobject instance) { From e9fca1d653009c3398f65fd32e352a23333caed4 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Fri, 26 Apr 2013 13:41:21 -0400 Subject: [PATCH 142/155] Bug 865964. Remove dead WrapCallbackInterface code. r=smaug --- dom/bindings/BindingUtils.cpp | 13 ------------- dom/bindings/BindingUtils.h | 20 -------------------- dom/bindings/Codegen.py | 5 +---- 3 files changed, 1 insertion(+), 37 deletions(-) diff --git a/dom/bindings/BindingUtils.cpp b/dom/bindings/BindingUtils.cpp index 1adf6289bc0..6f32d44c5a2 100644 --- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -1259,19 +1259,6 @@ HasPropertyOnPrototype(JSContext* cx, JSObject* proxy, DOMProxyHandler* handler, return !GetPropertyOnPrototype(cx, proxy, id, &found, NULL) || found; } -bool -WrapCallbackInterface(JSContext *cx, JSObject *scope, nsISupports* callback, - JS::Value* vp) -{ - nsCOMPtr wrappedJS = do_QueryInterface(callback); - MOZ_ASSERT(wrappedJS, "How can we not have an XPCWrappedJS here?"); - JSObject* obj; - DebugOnly rv = wrappedJS->GetJSObject(&obj); - MOZ_ASSERT(NS_SUCCEEDED(rv) && obj, "What are we wrapping?"); - *vp = JS::ObjectValue(*obj); - return JS_WrapValue(cx, vp); -} - JSObject* GetXrayExpandoChain(JSObject* obj) { diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index 36966f27483..daef382f909 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -1002,26 +1002,6 @@ WrapObject(JSContext* cx, JSObject* scope, JSObject& p, JS::Value* vp) return true; } -bool -WrapCallbackInterface(JSContext *cx, JSObject *scope, nsISupports* callback, - JS::Value* vp); - -static inline bool -WrapCallbackInterface(JSContext *cx, JSObject *scope, nsISupports& callback, - JS::Value* vp) -{ - return WrapCallbackInterface(cx, scope, &callback, vp); -} - -// Helper for smart pointers (nsAutoPtr/nsRefPtr/nsCOMPtr). -template