Commit Graph

181 Commits

Author SHA1 Message Date
JW Wang
ffd7b45558 Bug 1265311. Part 2 - constify some functions. r=jya.
MozReview-Commit-ID: HMlg0M64PhQ
2016-04-19 16:14:33 +08:00
Matt Woodrow
fd534aefc7 Bug 1257013 - Part 3: Stop checking for corrupt frames in MediaDecoderStateMachine since we no longer produce them. r=ajones
--HG--
extra : rebase_source : a68da2757970cd28da5719d77e3036f9051041e5
2016-03-21 18:50:41 +13:00
Bryce Van Dyk
2be9a949c6 Bug 1251460 - MDSM now waits on a promise to enqueue first frame loaded. r=jya
MediaDecoderStateMachine's EnqueueFIrstFrameLoadedEvent would previously call
into MediaDecoderReader to update MDR's buffered ranges and enqueue the frame
loaded event. This commit aims to instead have the buffered update take place,
and only afterwards enqueue the event. This should remove the possibility that
the event will be fired and handled before the update of the buffered ranges has
taken place.

MozReview-Commit-ID: GP8w2nF4xmj

--HG--
extra : transplant_source : %A0m%13%95%E3Gs%ACMd%1F%F4%25%B9qE%28J%21R
2016-03-09 15:32:49 +13:00
Jean-Yves Avenard
e345db00ed Bug 1243608: P4. Have MediaDecoderReader::SeekPromise return a TimeUnit. r=cpearce 2016-02-02 18:57:13 +11:00
Jean-Yves Avenard
83fff9be79 Bug 1243608: P2. Pass the full SeekTarget object to MediaDecoderReader::Seek. r=cpearce
This will allow the reader to know if we are performing a fast seek.
2016-02-02 18:57:12 +11:00
JW Wang
e4cbe0c128 Bug 1228939 - 1. add mSeekable to MediaInfo. 2. use MediaEventSource to notify the decoder when the media is not seekable. 3. remove unused code. r=jya. 2015-12-02 15:42:32 +08:00
JW Wang
518cc44e44 Bug 1219142. Part 2 - remove unused code. r=jya. 2015-11-18 09:01:01 +08:00
JW Wang
fbb85ac25a Bug 1219142. Part 1 - add AbstractMediaDecoder::DataArrivedEvent() to publish events. r=jya. 2015-11-18 09:00:56 +08:00
JW Wang
8dedbfa33d Bug 1223599 - Remove the throttling argument from AbstractMediaDecoder::NotifyDataArrived(). r=jya. 2015-11-11 17:59:16 +08:00
JW Wang
2344481e8c Bug 1220558. Part 2 - remove unused members. r=jya. 2015-11-11 07:43:41 +08:00
JW Wang
4f2d0e76bc Bug 1220558. Part 1 - remove unused arguments from MediaDecoderReader::DispatchNotifyDataArrived() and its callees/callers. r=jya. 2015-11-11 07:43:38 +08:00
JW Wang
2c0bf35e10 Bug 1220551. Part 2 - remove arguments from NotifyDataArrivedInternal(). r=jya. 2015-11-02 21:28:57 +08:00
JW Wang
924432c2ee Bug 1217714 - Remove some unused functions from MediaDecoderReader. r=jya. 2015-10-26 14:10:29 +08:00
JW Wang
ab48413bfa Bug 1217692. Part 2 - fix some styles to keep 80 cols limit. r=jya. 2015-10-26 11:29:48 +08:00
JW Wang
82503359f9 Bug 1217692. Part 1 - move members that don't have to be public to protected or private sections. r=jya. 2015-10-26 11:25:25 +08:00
James Cheng
f01266ed3f Bug 1194606 - Make MediaDecoderStateMachine capable of requesting different kind (decoded/raw) of media data. r=jya 2015-10-20 05:33:00 -04:00
JW Wang
1deed476dc Bug 1216850. Part 3 - backout bug 1214073. r=me. 2015-10-21 14:04:20 +08:00
JW Wang
8e64159f84 Bug 1216850. Part 2 - backout bug 1214498. r=me. 2015-10-21 11:45:53 +08:00
JW Wang
8cbe3a5118 Bug 1216850. Part 1 - backout bug 1215003. r=me. 2015-10-21 10:59:56 +08:00
JW Wang
cc0244c899 Bug 1215003. Part 3 - fix AsyncReadMetadata() and its callers. r=gerald. 2015-10-19 10:52:34 +08:00
JW Wang
9e488683b4 Bug 1215003. Part 2 - rename AsyncReadMetadata and move it to the private section. r=gerald. 2015-10-19 10:52:15 +08:00
JW Wang
2b5568154e Bug 1215003. Part 1 - Move MediaDecoderReader::ReadMetadata and overrides to private sections. r=gerald. 2015-10-19 10:51:48 +08:00
Nathan Froyd
01583602a9 Bug 1207245 - part 6 - rename nsRefPtr<T> to RefPtr<T>; r=ehsan; a=Tomcat
The bulk of this commit was generated with a script, executed at the top
level of a typical source code checkout.  The only non-machine-generated
part was modifying MFBT's moz.build to reflect the new naming.

CLOSED TREE makes big refactorings like this a piece of cake.

 # The main substitution.
find . -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.mm' -o -name '*.idl'| \
    xargs perl -p -i -e '
 s/nsRefPtr\.h/RefPtr\.h/g; # handle includes
 s/nsRefPtr ?</RefPtr</g;   # handle declarations and variables
'

 # Handle a special friend declaration in gfx/layers/AtomicRefCountedWithFinalize.h.
perl -p -i -e 's/::nsRefPtr;/::RefPtr;/' gfx/layers/AtomicRefCountedWithFinalize.h

 # Handle nsRefPtr.h itself, a couple places that define constructors
 # from nsRefPtr, and code generators specially.  We do this here, rather
 # than indiscriminantly s/nsRefPtr/RefPtr/, because that would rename
 # things like nsRefPtrHashtable.
perl -p -i -e 's/nsRefPtr/RefPtr/g' \
     mfbt/nsRefPtr.h \
     xpcom/glue/nsCOMPtr.h \
     xpcom/base/OwningNonNull.h \
     ipc/ipdl/ipdl/lower.py \
     ipc/ipdl/ipdl/builtin.py \
     dom/bindings/Codegen.py \
     python/lldbutils/lldbutils/utils.py

 # In our indiscriminate substitution above, we renamed
 # nsRefPtrGetterAddRefs, the class behind getter_AddRefs.  Fix that up.
find . -name '*.cpp' -o -name '*.h' -o -name '*.idl' | \
    xargs perl -p -i -e 's/nsRefPtrGetterAddRefs/RefPtrGetterAddRefs/g'

if [ -d .git ]; then
    git mv mfbt/nsRefPtr.h mfbt/RefPtr.h
else
    hg mv mfbt/nsRefPtr.h mfbt/RefPtr.h
fi

--HG--
rename : mfbt/nsRefPtr.h => mfbt/RefPtr.h
2015-10-18 01:24:48 -04:00
Nathan Froyd
583afa0965 Bug 1207245 - part 3 - switch all uses of mozilla::RefPtr<T> to nsRefPtr<T>; r=ehsan
This commit was generated using the following script, executed at the
top level of a typical source code checkout.

 # Don't modify select files in mfbt/ because it's not worth trying to
 # tease out the dependencies currently.
 #
 # Don't modify anything in media/gmp-clearkey/0.1/ because those files
 # use their own RefPtr, defined in their own RefCounted.h.
find . -name '*.cpp' -o -name '*.h' -o -name '*.mm' -o -name '*.idl'| \
    grep -v 'mfbt/RefPtr.h' | \
    grep -v 'mfbt/nsRefPtr.h' | \
    grep -v 'mfbt/RefCounted.h' | \
    grep -v 'media/gmp-clearkey/0.1/' | \
    xargs perl -p -i -e '
 s/mozilla::RefPtr/nsRefPtr/g; # handle declarations in headers
 s/\bRefPtr</nsRefPtr</g; # handle local variables in functions
 s#mozilla/RefPtr.h#mozilla/nsRefPtr.h#; # handle #includes
 s#mfbt/RefPtr.h#mfbt/nsRefPtr.h#;       # handle strange #includes
'

 # |using mozilla::RefPtr;| is OK; |using nsRefPtr;| is invalid syntax.
find . -name '*.cpp' -o -name '*.mm' | xargs sed -i -e '/using nsRefPtr/d'

 # RefPtr.h used |byRef| for dealing with COM-style outparams.
 # nsRefPtr.h uses |getter_AddRefs|.
 # Fixup that mismatch.
find . -name '*.cpp' -o -name '*.h'| \
    xargs perl -p -i -e 's/byRef/getter_AddRefs/g'
2015-10-18 00:40:10 -04:00
JW Wang
1065049ddb Bug 1214498 - MediaDecoderReader::DisableHardwareAcceleration should figure out which thread to dispatch the job. r=gerald. 2015-10-14 14:25:01 +08:00
JW Wang
6765563707 Bug 1214073 - MediaDecoderReader::ReleaseMediaResources will do dispatch if necessary. r=gerald. 2015-10-14 11:52:26 +08:00
JW Wang
d3c9b0b0df Bug 1212723. Part 2 - remove unused argument aCloneDonor from MediaDecoderReader::Init(). r=jya. 2015-10-13 15:28:57 +08:00
JW Wang
146f761ff8 Bug 1212246. Part 2 - remove mTaskQueueIsBorrowed and unnecessary checks for mTaskQueue is never null. r=jya. 2015-10-09 09:25:43 +08:00
JW Wang
32c513290f Bug 1212246. Part 1 - remove the aBorrowedTaskQueue parameter from the MediaDecoderReader constructor. r=jya. 2015-10-09 09:25:23 +08:00
JW Wang
88f2b7fbdf Bug 1209887. Part 1 - add assertions. r=jya. 2015-09-30 06:55:20 +08:00
JW Wang
0bb44154c7 Bug 1208932 - Remove ReadMetadataFailureReason::WAITING_FOR_RESOURCES. r=jya. 2015-09-27 20:48:09 +08:00
JW Wang
93c354616a Bug 1208931 - Remove MediaDecoderReader::IsWaitingMediaResources(). r=jya. 2015-09-27 20:38:43 +08:00
JW Wang
7651430ef0 Bug 1208922. Part 6 - IsWaitingOnCDMResource() is not used by MDSM anymore. Remove it from MediaDecoderReader and make it private in MediaFormatReader. r=cpearce. 2015-09-27 18:59:52 +08:00
JW Wang
b502b0fe56 Bug 1208922. Part 2 - add MediaDecoderReader::SetCDMProxy so it won't need to ask MediaDecoder for a CDMProxy. r=cpearce. 2015-09-27 18:40:03 +08:00
Jean-Yves Avenard
24d19f7f4e Bug 1193670: P2. Remove use of SharedDecoderManager from MediaDecoderReader. r=cpearce 2015-09-16 18:14:16 +10:00
Jean-Yves Avenard
82279827e6 Bug 1204419: P3. Remove now unused MediaDecoderReader functions. r=cpearce 2015-09-16 18:14:12 +10:00
James Cheng
6930bc717c Bug 1203047 - Make MediaDecoderReader know less about AudioData/VideoData by using MediaData instead. r=jya
--HG--
extra : rebase_source : 928721bb5a8669445725cab86e43be002f38c88a
2015-09-10 03:06:00 +02:00
JW Wang
300d859812 Bug 1195158. Part 2 - Have OggReader send TimedMetadata events through a event source instead of direct calls to AbstractMediaDecoder::QueueMetadata. r=cpearce. 2015-09-07 11:37:32 +08:00
Jean-Yves Avenard
3bca678d28 Bug 1197075: P2. Revert "Bug 1171257 - Add force decode ahead to MediaFormatReader r=jya,bholley". r=edwin 2015-08-26 15:36:53 +10:00
Bobby Holley
04eaf4c167 Bug 1184634 - Move various includes into the mozilla namespace. r=gerald
I did my a quick best-effort pass to fix up the most egregious ordering
problems. I left some big pre-existing messes alone.
2015-07-16 22:23:18 -07:00
Bobby Holley
997543e6ba Bug 1184634 - Rename MediaTaskQueue to TaskQueue. r=gerald 2015-07-16 22:23:06 -07:00
Bobby Holley
78001ffc43 Bug 1184634 - Rename "TaskQueue()" accessor to "OwnerThread()". r=gerald
Otherwise this name will collide with the rename of MediaTaskQueue to TaskQueue.
It's also a better naming convention, because it generalizes to things that are
owned by an AbstractThread that is not a Task Queue.

We rename to Queue() in TestMozPromise, because that's more accurate.
2015-07-16 22:22:07 -07:00
Bobby Holley
407d2c5f90 Bug 1184634 - Rename MediaPromise to MozPromise. r=gerald 2015-07-16 22:21:56 -07:00
Sotaro Ikeda
05e6073126 Bug 1171257 - Add force decode ahead to MediaFormatReader r=jya,bholley 2015-07-05 09:39:30 -07:00
Bobby Holley
d529126326 Bug 1178938 - Make MediaDecoderReader::DecodeToFirstVideoData async. r=jww 2015-07-02 12:38:44 -07:00
Bobby Holley
f15bd05ef7 Bug 1179110 - Use a Maybe<> to store start time, rather than using -1 as a sentinel. r=jya
This allows us to properly support videos with a negative start time, which
is happening here.
2015-07-02 12:05:17 -07:00
Bobby Holley
2324e58fb3 Bug 1178437 - Do the dormant-enabled tracking on the main thread. r=jww,r=jya
This is purely a question of policy, so there's no reason it needs to live on
the off-main-thread decoding machinery.
2015-07-01 18:47:41 -07:00
Bobby Holley
3985c88eb7 Bug 1175768 - Throttle NotifyDataArrived. r=jya 2015-06-27 01:19:14 -07:00
Bobby Holley
a80e87862b Bug 1175768 - Use mirroring for buffered ranges. r=jya 2015-06-27 01:19:13 -07:00
Bobby Holley
f25ea07acc Bug 1175768 - Dispatch NotifyDataArrived and remove the aBuffer argument. r=jya
It would be nice to remove the argument in a separate patch, but we can't
perform MediaResource reads on the main thread, so the SilentReadAt stuff
needs to happen at the same time as the off-main-thread stuff.
2015-06-27 01:19:10 -07:00
Ryan VanderMeulen
d9ca5de3ed Backed out 8 changesets (bug 1175768) for frequent media test failures.
Backed out changeset a369cfb95b59 (bug 1175768)
Backed out changeset e02dd312d622 (bug 1175768)
Backed out changeset 6776ce74b9e5 (bug 1175768)
Backed out changeset 6aa5fa1d318e (bug 1175768)
Backed out changeset a8bd7a0d2aea (bug 1175768)
Backed out changeset 41ffc9a9ac48 (bug 1175768)
Backed out changeset 2d2cefa397dc (bug 1175768)
Backed out changeset 4e06368496d2 (bug 1175768)

CLOSED TREE
2015-06-23 16:20:15 -04:00
Bobby Holley
6925b1f100 Bug 1175768 - Throttle NotifyDataArrived. r=jya 2015-06-22 22:53:09 -07:00
Bobby Holley
5c20ea36aa Bug 1175768 - Use mirroring for buffered ranges. r=jya 2015-06-22 22:53:09 -07:00
Bobby Holley
23c16e6894 Bug 1175768 - Dispatch NotifyDataArrived and remove the aBuffer argument. r=jya
It would be nice to remove the argument in a separate patch, but we can't
perform MediaResource reads on the main thread, so the SilentReadAt stuff
needs to happen at the same time as the off-main-thread stuff.
2015-06-22 22:53:07 -07:00
Bobby Holley
56a6ea9edb Bug 1172264 - Mirror duration from the MDSM to the MediaDecoderReader and remove MDSM::GetDuration. r=jww 2015-06-17 09:49:10 -07:00
Bobby Holley
32845f3c94 Bug 1163223 - Remove MediaDecoderStateMachine::mStartTime. r=jww CLOSED TREE 2015-06-16 15:08:45 -07:00
Bobby Holley
b3e7a4b2a3 Bug 1163223 - Use AwaitStartTime to invoke MediaDecoderReader::SetStartTime. r=jww 2015-06-16 15:08:33 -07:00
Bobby Holley
d9860a80b4 Bug 1163223 - Introduce StartTimeRendezvous and route samples through it. r=jww
No sample adjusting is done yet - this just makes the data available.
2015-06-16 15:08:30 -07:00
Wes Kocher
f45cfb1d2d Backed out 8 changesets (bug 1163223) for getting in the way of me backing out f46a712edf7e
Backed out changeset c1b33c43f0c5 (bug 1163223)
Backed out changeset a7ee6eb45f62 (bug 1163223)
Backed out changeset b2e10f194455 (bug 1163223)
Backed out changeset 9e7651567cad (bug 1163223)
Backed out changeset 20e25e93ed5f (bug 1163223)
Backed out changeset 5193508738f8 (bug 1163223)
Backed out changeset aea6b8d15318 (bug 1163223)
Backed out changeset 7b6804398fc3 (bug 1163223)
2015-06-16 14:47:50 -07:00
Bobby Holley
c202ec98d9 Bug 1163223 - Remove MediaDecoderStateMachine::mStartTime. r=jww 2015-06-16 13:00:00 -07:00
Bobby Holley
a5b9b2b399 Bug 1163223 - Use AwaitStartTime to invoke MediaDecoderReader::SetStartTime. r=jww 2015-06-16 12:59:58 -07:00
Bobby Holley
06087fe59c Bug 1163223 - Introduce StartTimeRendezvous and route samples through it. r=jww
No sample adjusting is done yet - this just makes the data available.
2015-06-16 12:59:57 -07:00
Bobby Holley
c2bf6e7564 Bug 1173001 - Fix up some task queue naming to make MediaDecoderReader consistent with MDSM. r=jww 2015-06-10 14:17:26 -07:00
Bobby Holley
adc66a3dab Bug 1173001 - Initialize reader task queue in the constructor. r=jww
This is a necessary step towards having mirrored/canonical values, since those
need to know the task queue in their constructor.
2015-06-10 14:17:25 -07:00
Sotaro Ikeda
6a032542b6 Bug 1168456 - Remove NotifyWaitingForResourcesStatusChanged() call from MediaCodecReader r=bholley,bwu 2015-05-28 11:11:46 -07:00
Sotaro Ikeda
f8d4370472 Bug 1167608 - Remove NotifyWaitingForResourcesStatusChanged() call from MediaOmxReader r=bholley,bwu 2015-05-27 14:25:48 -07:00
Jean-Yves Avenard
4ef7b191ea Bug 1163227: Part2. Add MediaDecoderReader::NotifyDataRemoved method. r=cpearce 2015-05-25 15:09:16 +10:00
Jean-Yves Avenard
54a681396b Bug 1163445: Part5. Replace dom::TimeRanges with TimeIntervals object. r=mattwoodrow 2015-05-18 16:15:47 +10:00
Jean-Yves Avenard
df6daad9ba Bug 1157075: Part1. Rename and make AsyncReadMetadata virtual. r=bholley 2015-05-01 15:37:29 +10:00
Bobby Holley
e9a60fe021 Bug 1144519 - Rename MediaDecoderReader::OnDecodeThread to MediaDecoderReader::OnTaskQueue. r=jya 2015-03-27 11:50:20 -07:00
Bobby Holley
40a80320a6 Bug 1136873 - Use promises for metadata decoding. r=mattwoodrow 2015-03-23 13:17:51 -07:00
Matt Woodrow
10ced0676b Bug 1131638 - Disable hardware decoding if too many frames are invalid. r=cpearce 2015-03-12 22:14:51 +13:00
Jean-Yves Avenard
3a14d38778 Bug 1128380: Make AmpleVideoFrames calculation dynamic. r=cpearce 2015-03-09 14:17:30 +11:00
Bobby Holley
bf69dac697 Bug 1135170 - Streamline seek initiation logic and abolish manual seek cancels and retries. r=mattwoodrow
The model we're moving towards is one where the MDSM can just disconnect all of
its promises, send a ResetDecode down the pipe, and start doing something
unrelated.
2015-03-06 19:16:59 -08:00
Bobby Holley
fae2353de3 Bug 1125970 - Reject promises in MediaDecoderReader::ResetDecode and don't re-request audio and video when the promises have been rejected. v1 r=cpearce 2015-02-16 09:03:25 -08:00
Karl Tomlinson
1d41559e74 bug 1095251 clear mDecoder on reader during Shutdown() r=cpearce
--HG--
extra : rebase_source : 7bd0c13ca1aa821998f6ec46ba578c6ed8a0d8f9
2015-02-10 15:50:02 +13:00
Bobby Holley
41a5994f7f Bug 1128811 - Reject data wait promises when we seek. r=cpearce 2015-02-04 17:33:40 -08:00
Masatoshi Kimura
6cc5dabbee Bug 1111290 - Part 3: Remove TypedEnum.h and fold TypedEnumInternal.h into TypedEnumBits.h. r=waldo 2015-01-26 07:22:11 +09:00
Bobby Holley
a18cc7d480 Bug 1123983 - Implement exclusivity checking for MediaPromises. r=cpearce 2015-01-21 14:34:26 -08:00
Bobby Holley
986f783e03 Bug 1121692 - Make seeks cancelable. r=cpearce,r=mattwoodrow 2015-01-16 10:58:00 -08:00
Bobby Holley
e814d359c3 Bug 1121692 - Remove unnecessary arguments to ::Seek. r=mattwoodrow,sr=cpearce 2015-01-16 10:57:59 -08:00
Chris Pearce
59325224ff Bug 1112445 - Ignore the audio stream when determining whether we should skip-t-o-next-keyframe for async readers. r=mattwoodrow 2015-01-13 22:31:03 +13:00
Matt Woodrow
972dde5588 Bug 1105066 - Make SeekPromise return the time we actually seeked to; r=kentuckyfriedtakahe 2015-01-12 10:57:14 +13:00
Matt Woodrow
fe5df5dec4 Bug 1116284 - Don't run MP4Reader::Update after we've shut the reader down. r=cpearce 2015-01-12 09:43:11 +13:00
Bobby Holley
49601684ad Bug 1109437 - Implement non-polling buffering. r=cpearce 2014-12-22 00:20:31 -08:00
Bobby Holley
05224076bc Bug 1109437 - Generalize GetBufferingWait to UseBufferingHeuristics. r=cpearce 2014-12-22 00:20:30 -08:00
Matt Woodrow
675718e2ea Bug 1112446 - Add logging for media queue lengths. r=ajones 2014-12-18 12:41:19 +13:00
Matt Woodrow
646b842413 Bug 1111413 - Part 2: Remove RequestSampleCallback. r=bholley 2014-12-16 23:08:42 +13:00
Matt Woodrow
2c7e571767 Bug 1111413 - Part 1: Use MediaPromises for seeking. r=bholley 2014-12-16 22:52:57 +13:00
Bobby Holley
65fb74f0e7 Bug 1108701 - Replace AudioDecodeRendezvous with promise-y goodness. r=cpearce,karlt 2014-12-10 14:03:56 -08:00
Bobby Holley
60c0158fdd Bug 1108701 - Use MediaPromises for RequestAudioData and RequestVideoData. r=cpearce 2014-12-10 14:03:56 -08:00
Bobby Holley
312651fc98 Bug 1108707 - Make reader shutdown asynchronous. r=cpearce (relanding on a CLOSED TREE because it wasn't the source of the leaks) 2014-12-09 11:43:21 -08:00
Ryan VanderMeulen
073573c2a9 Backed out changeset 18c302f80bce (bug 1108707) for nsTArray_base leaks.
CLOSED TREE
2014-12-09 15:49:38 -05:00
Bobby Holley
fc5e0383a6 Bug 1108707 - Make reader shutdown asynchronous. r=cpearce 2014-12-09 11:43:21 -08:00
Bobby Holley
8c9d29f7fe Bug 1097823 - Move NotDecodedReason from RequestSampleCallback to MediaDecoderReader. r=cpearce 2014-12-08 14:45:36 -08:00
Ryan VanderMeulen
0aae88bf85 Backed out changesets ae63e2dda6e0, a9ca0113db3c, and d0a6757e24bd (bug 1097823) for bustage.
DONTBUILD CLOSED TREE
2014-12-08 15:00:02 -05:00
Bobby Holley
7aa1467674 Bug 1097823 - Move NotDecodedReason from RequestSampleCallback to MediaDecoderReader. r=cpearce 2014-12-08 11:34:50 -08:00
Bobby Holley
aa27b00ccd Backed out changeset c405b4271e64 (bug 1097823) 2014-12-07 17:09:12 -08:00
Bobby Holley
8327697375 Backed out changeset b76636e9f49a (bug 1097823) 2014-12-07 17:09:08 -08:00
Bobby Holley
60f876f46a Backed out changeset ab6ddc8ac28a (bug 1097823) 2014-12-07 17:09:06 -08:00