diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 30eee5883bd..fd484db6c8c 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,5 +1,84 @@ # Release notes +### 2.14.2 (2021-07-20) + +* Core Library: + * Explicitly mark several methods on `SimpleExoPlayer` as `@Deprecated`. + These methods are all overrides and are already deprecated on `Player` + and the respective `ExoPlayer` component classes (since 2.14.0). +* Video: + * Fix `IncorrectContextUseViolation` strict mode warning on Android 11 + ([#8246](https://github.com/google/ExoPlayer/pull/8246)). +* Audio: + * Fix track selection for E-AC-3 streams. + * Use `AudioTrack.isDirectPlaybackSupported` to check for encoded audio + passthrough capability from API 29 onwards, instead of using the HDMI + audio plug intent + ([#6500](https://github.com/google/ExoPlayer/pull/6500)). +* Extractors: + * Fix issue where a `trun` atom could be associated with the wrong track + in an FMP4 stream + ([#9056](https://github.com/google/ExoPlayer/pull/9056)). The fix + removes a previous workaround to handle content in which the `track_ID` + is set incorrectly + ([#4083](https://github.com/google/ExoPlayer/issues/4083)). Such content + is malformed and should be re-encoded. + * Improve support for truncated Ogg streams + ([#7608](https://github.com/google/ExoPlayer/issues/7608)). + * Add support for MP4 H263 atom type + ([#9158](https://github.com/google/ExoPlayer/issues/9158)). + * Fix issue around TS synchronization when reading a file's duration + ([#9100](https://github.com/google/ExoPlayer/pull/9100)). +* HLS: + * Fix issue where playback of a live event could become stuck rather than + transitioning to `STATE_ENDED` when the event ends + ([#9067](https://github.com/google/ExoPlayer/issues/9067)). + * Fix issue where a new initialization segment, as specified by an + `EXT-X-MAP` tag in a media playlist, would not be loaded when + encountered during playback + ([#9004](https://github.com/google/ExoPlayer/issues/9004)). + * Forward the FRAME-RATE value from the master playlist to renditions. + ([#8960](https://github.com/google/ExoPlayer/issues/8960)). + * Fix issue where HLS events would start at positions greater than + specified by an `EXT-X-START` tag when placed in a playlist + ([#9037](https://github.com/google/ExoPlayer/issues/9037)). +* Ad playback: + * Use the content URI when auto-generating an ad ID (in addition to the + media ID and ad tag URI) + ([#9106](https://github.com/google/ExoPlayer/issues/9106). +* DRM: + * Allow repeated provisioning in `DefaultDrmSession(Manager)`. + * Fix a crash due to `DefaultDrmSessionManager.release()` incorrectly + releasing too many keep-alive `DefaultDrmSession` references, resulting + in `DefaultDrmSession.release()` throwing an `IllegalStateException` + ([#9193](https://github.com/google/ExoPlayer/issues/9193)). +* Metadata: + * Fix handling of emsg messages with an unset duration + ([#9123](https://github.com/google/ExoPlayer/issues/9123)). +* UI: + * Add `PendingIntent.FLAG_IMMUTABLE` flag when creating a broadcast intent + in `PlayerNotificationManager`. This is required to avoid an error on + Android 12. + * Fix focusability of `StyledPlayerView` and `StyledPlayerControlView` + popup menus on API levels prior to 26 + ([#9061](https://github.com/google/ExoPlayer/issues/9061)). + * Fix progress bar flickering immediately after the user seeks + ([#9049](https://github.com/google/ExoPlayer/pull/9049)). + * Fix `StyledPlayerView` and `StyledPlayerControlView` popup menu items + not expanding to occupy the full width of the popup + ([#9086](https://github.com/google/ExoPlayer/issues/9086)). + * Don't propagate `AttributeSet` from `SubtitleView` constructor into + `CanvasSubtitleOutput`. Just passing the `Context` is enough, and + ensures programmatic changes to the `SubtitleView` will propagate down. +* RTSP + * Fix session description (SDP) parsing to use a HashMap-like behaviour + for duplicated attributes. + ([#9014](https://github.com/google/ExoPlayer/issues/9014)). + * Allow using absolute URI in the control attribute in a media description + ([#9183](https://github.com/google/ExoPlayer/issues/9183)). + * Allow the timeout to be customised via + `RtspMediaSource.Factory.setTimeoutMs`. + ### 2.14.1 (2021-06-11) * Core Library: diff --git a/constants.gradle b/constants.gradle index 01b67460515..68ce165ecc4 100644 --- a/constants.gradle +++ b/constants.gradle @@ -13,13 +13,13 @@ // limitations under the License. project.ext { // ExoPlayer version and version code. - releaseVersion = '2.14.1' - releaseVersionCode = 2014001 + releaseVersion = '2.14.2' + releaseVersionCode = 2014002 minSdkVersion = 16 appTargetSdkVersion = 29 targetSdkVersion = 28 // TODO: Bump once b/143232359 is resolved. Also fix TODOs in UtilTest. compileSdkVersion = 30 - dexmakerVersion = '2.21.0' + dexmakerVersion = '2.28.1' junitVersion = '4.13.2' guavaVersion = '27.1-android' mockitoVersion = '2.28.2' @@ -29,7 +29,7 @@ project.ext { checkerframeworkCompatVersion = '2.5.0' jsr305Version = '3.0.2' kotlinAnnotationsVersion = '1.3.70' - androidxAnnotationVersion = '1.1.0' + androidxAnnotationVersion = '1.2.0' androidxAppCompatVersion = '1.1.0' androidxCollectionVersion = '1.1.0' androidxCoreVersion = '1.3.2' diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index 05a36b7fa0e..0513dda6019 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -573,10 +573,6 @@ "name": "Google Play (Flac)", "uri": "https://storage.googleapis.com/exoplayer-test-media-1/flac/play.flac" }, - { - "name": "Big Buck Bunny video (FLV)", - "uri": "https://vod.leasewebcdn.com/bbb.flv?ri=1024&rs=150&start=0" - }, { "name": "Big Buck Bunny 480p (MP4, AV1)", "uri": "https://storage.googleapis.com/downloads.webmproject.org/av1/exoplayer/bbb-av1-480p.mp4" diff --git a/docs/_page_fragments/supported-formats-rtsp.md b/docs/_page_fragments/supported-formats-rtsp.md index c87dd690ffc..36a3d0351f1 100644 --- a/docs/_page_fragments/supported-formats-rtsp.md +++ b/docs/_page_fragments/supported-formats-rtsp.md @@ -1,11 +1,18 @@ -ExoPlayer supports both live and on demand RTSP. Supported formats and network -types are listed below. +ExoPlayer supports both live and on demand RTSP. Supported sample formats and +network types are listed below. -**Supported formats** -* H264 -* AAC (with ADTS bitstream) -* AC3 +### Supported sample formats ### -**Supported network types** -* RTP over UDP unicast (multicast is not supported) -* Interleaved RTSP, RTP over RTSP using TCP +* H264 (the SDP media description must include SPS/PPS data in the fmtp + attribute for decoder initialization). +* AAC (with ADTS bitstream). +* AC3. + +Please comment on [this issue](https://github.com/google/ExoPlayer/issues/9210) +to request support for additional sample formats. +{:.info} + +### Supported network types ### + +* RTP over UDP unicast (multicast is not supported). +* Interleaved RTSP, RTP over RTSP using TCP. diff --git a/docs/ad-insertion.md b/docs/ad-insertion.md index 8ca6e00ba76..972f07a9c59 100644 --- a/docs/ad-insertion.md +++ b/docs/ad-insertion.md @@ -67,12 +67,12 @@ described below. ### Playlists with ads ### When playing a [playlist][] with multiple media items, the default behavior is -to request the ad tag and store ad playback state once for each media ID and ad -tag URI combination. This means that users will see ads for every media item -with ads that has a distinct media ID, even if the ad tag URIs match. If a -media item is repeated, the user will see the corresponding ads only once (the -ad playback state stores whether ads have been played, so they are skipped -after their first occurrence). +to request the ad tag and store ad playback state once for each media ID, +content URI and ad tag URI combination. This means that users will see ads for +every media item with ads that has a distinct media ID or content URI, even if +the ad tag URIs match. If a media item is repeated, the user will see the +corresponding ads only once (the ad playback state stores whether ads have been +played, so they are skipped after their first occurrence). It's possible to customize this behavior by passing an opaque ads identifier with which ad playback state for a given media item is linked, based on object diff --git a/docs/doc/reference/allclasses-frame.html b/docs/doc/reference/allclasses-frame.html deleted file mode 100644 index 41f2b2ad383..00000000000 --- a/docs/doc/reference/allclasses-frame.html +++ /dev/null @@ -1,1126 +0,0 @@ - - - - -All Classes (ExoPlayer library) - - - - - - - - - - - -

All Classes

-
- -
- - diff --git a/docs/doc/reference/allclasses-index.html b/docs/doc/reference/allclasses-index.html index 4bfd88f5892..41f2dff59c4 100644 --- a/docs/doc/reference/allclasses-index.html +++ b/docs/doc/reference/allclasses-index.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":1,"i46":2,"i47":2,"i48":1,"i49":2,"i50":2,"i51":1,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":2,"i58":32,"i59":2,"i60":2,"i61":32,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":2,"i77":32,"i78":2,"i79":1,"i80":32,"i81":2,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":1,"i88":32,"i89":2,"i90":2,"i91":8,"i92":2,"i93":2,"i94":2,"i95":2,"i96":2,"i97":1,"i98":1,"i99":1,"i100":2,"i101":8,"i102":1,"i103":2,"i104":1,"i105":8,"i106":8,"i107":1,"i108":32,"i109":8,"i110":8,"i111":2,"i112":2,"i113":1,"i114":1,"i115":2,"i116":2,"i117":2,"i118":2,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":8,"i126":2,"i127":2,"i128":2,"i129":2,"i130":2,"i131":1,"i132":2,"i133":1,"i134":2,"i135":1,"i136":1,"i137":2,"i138":2,"i139":2,"i140":2,"i141":2,"i142":2,"i143":2,"i144":2,"i145":32,"i146":32,"i147":32,"i148":32,"i149":32,"i150":32,"i151":32,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":1,"i169":8,"i170":1,"i171":2,"i172":2,"i173":2,"i174":8,"i175":2,"i176":2,"i177":2,"i178":32,"i179":1,"i180":2,"i181":32,"i182":2,"i183":2,"i184":1,"i185":1,"i186":2,"i187":2,"i188":1,"i189":1,"i190":2,"i191":2,"i192":32,"i193":2,"i194":2,"i195":2,"i196":2,"i197":2,"i198":2,"i199":2,"i200":2,"i201":2,"i202":1,"i203":1,"i204":1,"i205":2,"i206":2,"i207":2,"i208":1,"i209":1,"i210":2,"i211":2,"i212":8,"i213":32,"i214":1,"i215":2,"i216":2,"i217":2,"i218":2,"i219":2,"i220":2,"i221":1,"i222":2,"i223":2,"i224":2,"i225":1,"i226":2,"i227":2,"i228":8,"i229":1,"i230":2,"i231":1,"i232":2,"i233":2,"i234":2,"i235":8,"i236":2,"i237":2,"i238":32,"i239":2,"i240":2,"i241":32,"i242":2,"i243":32,"i244":32,"i245":32,"i246":1,"i247":1,"i248":2,"i249":2,"i250":2,"i251":2,"i252":8,"i253":2,"i254":2,"i255":1,"i256":2,"i257":2,"i258":8,"i259":1,"i260":2,"i261":1,"i262":2,"i263":1,"i264":1,"i265":1,"i266":1,"i267":2,"i268":2,"i269":2,"i270":2,"i271":8,"i272":2,"i273":2,"i274":2,"i275":32,"i276":32,"i277":2,"i278":1,"i279":2,"i280":2,"i281":2,"i282":8,"i283":2,"i284":32,"i285":8,"i286":2,"i287":32,"i288":32,"i289":2,"i290":8,"i291":2,"i292":2,"i293":1,"i294":2,"i295":8,"i296":32,"i297":2,"i298":2,"i299":2,"i300":2,"i301":2,"i302":2,"i303":2,"i304":2,"i305":2,"i306":2,"i307":2,"i308":2,"i309":2,"i310":2,"i311":2,"i312":2,"i313":2,"i314":8,"i315":32,"i316":2,"i317":2,"i318":2,"i319":2,"i320":2,"i321":2,"i322":2,"i323":2,"i324":2,"i325":2,"i326":2,"i327":2,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":1,"i335":2,"i336":2,"i337":32,"i338":2,"i339":2,"i340":2,"i341":2,"i342":2,"i343":2,"i344":2,"i345":2,"i346":2,"i347":2,"i348":2,"i349":2,"i350":2,"i351":2,"i352":2,"i353":32,"i354":2,"i355":2,"i356":32,"i357":1,"i358":2,"i359":2,"i360":32,"i361":32,"i362":2,"i363":1,"i364":1,"i365":1,"i366":1,"i367":8,"i368":2,"i369":1,"i370":8,"i371":1,"i372":2,"i373":1,"i374":2,"i375":2,"i376":2,"i377":2,"i378":8,"i379":2,"i380":2,"i381":2,"i382":1,"i383":8,"i384":32,"i385":1,"i386":2,"i387":1,"i388":1,"i389":1,"i390":2,"i391":2,"i392":2,"i393":2,"i394":2,"i395":2,"i396":1,"i397":2,"i398":2,"i399":2,"i400":2,"i401":1,"i402":2,"i403":2,"i404":2,"i405":1,"i406":32,"i407":2,"i408":8,"i409":32,"i410":1,"i411":1,"i412":2,"i413":1,"i414":2,"i415":2,"i416":2,"i417":2,"i418":2,"i419":2,"i420":2,"i421":2,"i422":2,"i423":2,"i424":1,"i425":1,"i426":2,"i427":2,"i428":32,"i429":2,"i430":1,"i431":1,"i432":1,"i433":1,"i434":2,"i435":8,"i436":32,"i437":1,"i438":1,"i439":1,"i440":2,"i441":1,"i442":1,"i443":1,"i444":1,"i445":2,"i446":2,"i447":2,"i448":8,"i449":32,"i450":1,"i451":2,"i452":1,"i453":1,"i454":32,"i455":2,"i456":2,"i457":2,"i458":1,"i459":2,"i460":1,"i461":1,"i462":1,"i463":2,"i464":2,"i465":2,"i466":2,"i467":2,"i468":2,"i469":2,"i470":2,"i471":2,"i472":2,"i473":2,"i474":2,"i475":2,"i476":2,"i477":2,"i478":2,"i479":2,"i480":2,"i481":2,"i482":2,"i483":8,"i484":2,"i485":2,"i486":2,"i487":2,"i488":2,"i489":1,"i490":2,"i491":2,"i492":2,"i493":2,"i494":2,"i495":2,"i496":2,"i497":2,"i498":2,"i499":1,"i500":2,"i501":2,"i502":2,"i503":2,"i504":8,"i505":2,"i506":2,"i507":2,"i508":8,"i509":2,"i510":2,"i511":32,"i512":1,"i513":2,"i514":2,"i515":2,"i516":2,"i517":2,"i518":8,"i519":2,"i520":2,"i521":32,"i522":32,"i523":2,"i524":2,"i525":2,"i526":2,"i527":2,"i528":2,"i529":2,"i530":2,"i531":2,"i532":2,"i533":2,"i534":2,"i535":2,"i536":2,"i537":2,"i538":2,"i539":32,"i540":2,"i541":2,"i542":2,"i543":2,"i544":8,"i545":2,"i546":2,"i547":2,"i548":2,"i549":2,"i550":2,"i551":2,"i552":2,"i553":2,"i554":2,"i555":1,"i556":1,"i557":2,"i558":2,"i559":1,"i560":2,"i561":1,"i562":2,"i563":2,"i564":2,"i565":2,"i566":1,"i567":2,"i568":2,"i569":2,"i570":32,"i571":2,"i572":2,"i573":2,"i574":2,"i575":2,"i576":2,"i577":32,"i578":2,"i579":2,"i580":8,"i581":1,"i582":1,"i583":1,"i584":1,"i585":8,"i586":8,"i587":1,"i588":2,"i589":2,"i590":2,"i591":2,"i592":1,"i593":1,"i594":2,"i595":8,"i596":1,"i597":8,"i598":32,"i599":8,"i600":8,"i601":2,"i602":2,"i603":2,"i604":2,"i605":2,"i606":2,"i607":2,"i608":2,"i609":1,"i610":2,"i611":2,"i612":2,"i613":8,"i614":2,"i615":2,"i616":2,"i617":2,"i618":2,"i619":2,"i620":2,"i621":2,"i622":8,"i623":1,"i624":2,"i625":2,"i626":2,"i627":2,"i628":2,"i629":2,"i630":2,"i631":2,"i632":2,"i633":1,"i634":1,"i635":1,"i636":1,"i637":2,"i638":1,"i639":1,"i640":2,"i641":1,"i642":8,"i643":1,"i644":2,"i645":1,"i646":2,"i647":2,"i648":2,"i649":2,"i650":2,"i651":2,"i652":2,"i653":2,"i654":2,"i655":1,"i656":2,"i657":2,"i658":2,"i659":32,"i660":2,"i661":2,"i662":1,"i663":1,"i664":1,"i665":2,"i666":1,"i667":1,"i668":2,"i669":8,"i670":2,"i671":2,"i672":8,"i673":1,"i674":2,"i675":8,"i676":8,"i677":2,"i678":2,"i679":1,"i680":8,"i681":2,"i682":2,"i683":2,"i684":2,"i685":2,"i686":2,"i687":2,"i688":2,"i689":2,"i690":1,"i691":1,"i692":2,"i693":2,"i694":2,"i695":32,"i696":2,"i697":2,"i698":2,"i699":2,"i700":1,"i701":1,"i702":2,"i703":1,"i704":2,"i705":2,"i706":1,"i707":1,"i708":1,"i709":2,"i710":1,"i711":1,"i712":32,"i713":1,"i714":1,"i715":1,"i716":1,"i717":1,"i718":2,"i719":1,"i720":1,"i721":2,"i722":1,"i723":2,"i724":2,"i725":8,"i726":32,"i727":2,"i728":1,"i729":1,"i730":1,"i731":2,"i732":1,"i733":2,"i734":2,"i735":2,"i736":2,"i737":2,"i738":2,"i739":32,"i740":2,"i741":32,"i742":2,"i743":2,"i744":2,"i745":2,"i746":2,"i747":2,"i748":2,"i749":2,"i750":1,"i751":32,"i752":2,"i753":2,"i754":2,"i755":32,"i756":2,"i757":2,"i758":2,"i759":2,"i760":2,"i761":2,"i762":2,"i763":8,"i764":2,"i765":2,"i766":2,"i767":1,"i768":2,"i769":2,"i770":2,"i771":2,"i772":8,"i773":2,"i774":1,"i775":2,"i776":2,"i777":2,"i778":2,"i779":2,"i780":2,"i781":2,"i782":2,"i783":2,"i784":2,"i785":1,"i786":1,"i787":1,"i788":2,"i789":2,"i790":2,"i791":2,"i792":2,"i793":1,"i794":1,"i795":32,"i796":2,"i797":2,"i798":32,"i799":32,"i800":1,"i801":2,"i802":1,"i803":32,"i804":32,"i805":32,"i806":2,"i807":32,"i808":32,"i809":32,"i810":2,"i811":1,"i812":1,"i813":2,"i814":1,"i815":2,"i816":1,"i817":1,"i818":2,"i819":2,"i820":1,"i821":1,"i822":1,"i823":32,"i824":32,"i825":2,"i826":32,"i827":2,"i828":2,"i829":2,"i830":2,"i831":8,"i832":2,"i833":2,"i834":2,"i835":2,"i836":2,"i837":1,"i838":1,"i839":2,"i840":2,"i841":2,"i842":2,"i843":2,"i844":2,"i845":2,"i846":2,"i847":2,"i848":2,"i849":2,"i850":8,"i851":1,"i852":32,"i853":32,"i854":1,"i855":1,"i856":32,"i857":32,"i858":32,"i859":32,"i860":2,"i861":1,"i862":2,"i863":2,"i864":32,"i865":2,"i866":2,"i867":2,"i868":2,"i869":32,"i870":2,"i871":1,"i872":2,"i873":2,"i874":1,"i875":2,"i876":2,"i877":2,"i878":2,"i879":2,"i880":2,"i881":2,"i882":2,"i883":1,"i884":1,"i885":2,"i886":2,"i887":2,"i888":8,"i889":2,"i890":2,"i891":2,"i892":1,"i893":8,"i894":1,"i895":32,"i896":32,"i897":1,"i898":1,"i899":2,"i900":1,"i901":2,"i902":2,"i903":2,"i904":2,"i905":2,"i906":2,"i907":2,"i908":2,"i909":2,"i910":2,"i911":2,"i912":2,"i913":2,"i914":1,"i915":1,"i916":2,"i917":1,"i918":2,"i919":1,"i920":1,"i921":2,"i922":1,"i923":2,"i924":1,"i925":1,"i926":1,"i927":1,"i928":2,"i929":2,"i930":1,"i931":2,"i932":2,"i933":2,"i934":2,"i935":2,"i936":2,"i937":2,"i938":2,"i939":2,"i940":2,"i941":2,"i942":2,"i943":2,"i944":2,"i945":2,"i946":2,"i947":2,"i948":2,"i949":2,"i950":2,"i951":2,"i952":2,"i953":1,"i954":2,"i955":2,"i956":1,"i957":1,"i958":1,"i959":1,"i960":1,"i961":1,"i962":1,"i963":1,"i964":1,"i965":2,"i966":2,"i967":1,"i968":2,"i969":2,"i970":2,"i971":2,"i972":2,"i973":2,"i974":2,"i975":2,"i976":2,"i977":1,"i978":1,"i979":2,"i980":2,"i981":2,"i982":2,"i983":2,"i984":8,"i985":2,"i986":2,"i987":2,"i988":2,"i989":2,"i990":2,"i991":2,"i992":2,"i993":2,"i994":1,"i995":1,"i996":1,"i997":2,"i998":32,"i999":2,"i1000":1,"i1001":1,"i1002":8,"i1003":1,"i1004":2,"i1005":2,"i1006":2,"i1007":32,"i1008":2,"i1009":2,"i1010":2,"i1011":2,"i1012":1,"i1013":2,"i1014":2,"i1015":2,"i1016":2,"i1017":2,"i1018":2,"i1019":2,"i1020":32,"i1021":2,"i1022":32,"i1023":32,"i1024":2,"i1025":1,"i1026":2,"i1027":2,"i1028":1,"i1029":1,"i1030":2,"i1031":2,"i1032":2,"i1033":2,"i1034":2,"i1035":2,"i1036":1,"i1037":2,"i1038":1,"i1039":2,"i1040":2,"i1041":2,"i1042":2,"i1043":1,"i1044":2,"i1045":2,"i1046":32,"i1047":2,"i1048":2,"i1049":2,"i1050":1,"i1051":1,"i1052":2,"i1053":32,"i1054":1,"i1055":2,"i1056":2,"i1057":1,"i1058":2,"i1059":2,"i1060":2,"i1061":1,"i1062":2,"i1063":1,"i1064":2,"i1065":1,"i1066":2,"i1067":1,"i1068":2,"i1069":2,"i1070":1,"i1071":32,"i1072":2,"i1073":32,"i1074":1,"i1075":2,"i1076":2,"i1077":1,"i1078":32,"i1079":2,"i1080":2,"i1081":2,"i1082":2,"i1083":2,"i1084":8,"i1085":32,"i1086":8,"i1087":8,"i1088":32,"i1089":2,"i1090":2,"i1091":2,"i1092":2,"i1093":2,"i1094":2,"i1095":2,"i1096":2,"i1097":2,"i1098":2,"i1099":1,"i1100":1,"i1101":2,"i1102":1,"i1103":1,"i1104":2,"i1105":2,"i1106":2,"i1107":2,"i1108":2,"i1109":2,"i1110":2,"i1111":2,"i1112":2,"i1113":8,"i1114":2,"i1115":2,"i1116":2,"i1117":2,"i1118":2,"i1119":2,"i1120":2,"i1121":2,"i1122":32,"i1123":32,"i1124":2,"i1125":2,"i1126":2,"i1127":2,"i1128":2,"i1129":2,"i1130":2,"i1131":2,"i1132":1,"i1133":2}; +var data = {"i0":2,"i1":32,"i2":2,"i3":2,"i4":2,"i5":2,"i6":2,"i7":2,"i8":32,"i9":2,"i10":2,"i11":2,"i12":2,"i13":2,"i14":2,"i15":2,"i16":2,"i17":2,"i18":2,"i19":2,"i20":2,"i21":2,"i22":2,"i23":2,"i24":2,"i25":2,"i26":2,"i27":2,"i28":2,"i29":2,"i30":2,"i31":2,"i32":2,"i33":2,"i34":2,"i35":2,"i36":2,"i37":2,"i38":2,"i39":2,"i40":2,"i41":2,"i42":2,"i43":2,"i44":2,"i45":1,"i46":2,"i47":2,"i48":1,"i49":2,"i50":2,"i51":1,"i52":2,"i53":2,"i54":2,"i55":2,"i56":2,"i57":2,"i58":32,"i59":2,"i60":2,"i61":32,"i62":1,"i63":1,"i64":2,"i65":8,"i66":32,"i67":2,"i68":32,"i69":2,"i70":1,"i71":2,"i72":2,"i73":2,"i74":2,"i75":1,"i76":2,"i77":32,"i78":2,"i79":1,"i80":32,"i81":2,"i82":2,"i83":2,"i84":2,"i85":2,"i86":2,"i87":1,"i88":32,"i89":2,"i90":2,"i91":8,"i92":2,"i93":2,"i94":2,"i95":2,"i96":2,"i97":1,"i98":1,"i99":1,"i100":2,"i101":8,"i102":1,"i103":2,"i104":1,"i105":8,"i106":8,"i107":1,"i108":32,"i109":8,"i110":8,"i111":2,"i112":2,"i113":1,"i114":1,"i115":2,"i116":2,"i117":2,"i118":2,"i119":2,"i120":2,"i121":2,"i122":2,"i123":2,"i124":2,"i125":8,"i126":2,"i127":2,"i128":2,"i129":2,"i130":2,"i131":1,"i132":2,"i133":1,"i134":2,"i135":1,"i136":1,"i137":2,"i138":2,"i139":2,"i140":2,"i141":2,"i142":2,"i143":2,"i144":2,"i145":32,"i146":32,"i147":32,"i148":32,"i149":32,"i150":32,"i151":32,"i152":32,"i153":32,"i154":32,"i155":32,"i156":32,"i157":32,"i158":32,"i159":32,"i160":32,"i161":32,"i162":32,"i163":32,"i164":32,"i165":32,"i166":32,"i167":32,"i168":1,"i169":8,"i170":1,"i171":2,"i172":2,"i173":2,"i174":8,"i175":2,"i176":2,"i177":2,"i178":32,"i179":1,"i180":2,"i181":32,"i182":2,"i183":2,"i184":1,"i185":1,"i186":2,"i187":2,"i188":1,"i189":1,"i190":2,"i191":2,"i192":32,"i193":2,"i194":2,"i195":2,"i196":2,"i197":2,"i198":2,"i199":2,"i200":2,"i201":2,"i202":1,"i203":1,"i204":1,"i205":2,"i206":2,"i207":2,"i208":1,"i209":1,"i210":2,"i211":2,"i212":8,"i213":32,"i214":1,"i215":2,"i216":2,"i217":2,"i218":2,"i219":2,"i220":2,"i221":1,"i222":2,"i223":2,"i224":2,"i225":1,"i226":2,"i227":2,"i228":8,"i229":1,"i230":2,"i231":1,"i232":2,"i233":2,"i234":2,"i235":8,"i236":2,"i237":2,"i238":32,"i239":2,"i240":2,"i241":32,"i242":2,"i243":32,"i244":32,"i245":32,"i246":1,"i247":1,"i248":2,"i249":2,"i250":2,"i251":2,"i252":8,"i253":2,"i254":2,"i255":1,"i256":2,"i257":2,"i258":8,"i259":1,"i260":2,"i261":1,"i262":2,"i263":1,"i264":1,"i265":1,"i266":1,"i267":2,"i268":2,"i269":2,"i270":2,"i271":8,"i272":2,"i273":2,"i274":2,"i275":32,"i276":32,"i277":2,"i278":1,"i279":2,"i280":2,"i281":2,"i282":8,"i283":2,"i284":32,"i285":8,"i286":2,"i287":32,"i288":32,"i289":2,"i290":8,"i291":2,"i292":2,"i293":1,"i294":2,"i295":8,"i296":32,"i297":2,"i298":2,"i299":2,"i300":2,"i301":2,"i302":2,"i303":2,"i304":2,"i305":2,"i306":2,"i307":2,"i308":2,"i309":2,"i310":2,"i311":2,"i312":2,"i313":2,"i314":8,"i315":32,"i316":2,"i317":2,"i318":2,"i319":2,"i320":2,"i321":2,"i322":2,"i323":2,"i324":2,"i325":2,"i326":2,"i327":2,"i328":2,"i329":2,"i330":2,"i331":2,"i332":2,"i333":2,"i334":1,"i335":2,"i336":2,"i337":32,"i338":2,"i339":2,"i340":2,"i341":2,"i342":2,"i343":2,"i344":2,"i345":2,"i346":2,"i347":2,"i348":2,"i349":2,"i350":2,"i351":2,"i352":2,"i353":32,"i354":2,"i355":2,"i356":32,"i357":1,"i358":2,"i359":2,"i360":32,"i361":32,"i362":2,"i363":1,"i364":1,"i365":1,"i366":1,"i367":8,"i368":2,"i369":1,"i370":8,"i371":1,"i372":2,"i373":1,"i374":2,"i375":2,"i376":2,"i377":2,"i378":8,"i379":2,"i380":2,"i381":2,"i382":1,"i383":8,"i384":32,"i385":1,"i386":2,"i387":1,"i388":1,"i389":1,"i390":2,"i391":2,"i392":2,"i393":2,"i394":2,"i395":2,"i396":1,"i397":2,"i398":2,"i399":2,"i400":2,"i401":1,"i402":2,"i403":2,"i404":2,"i405":1,"i406":32,"i407":2,"i408":8,"i409":32,"i410":1,"i411":1,"i412":2,"i413":1,"i414":2,"i415":2,"i416":2,"i417":2,"i418":2,"i419":2,"i420":2,"i421":2,"i422":2,"i423":2,"i424":1,"i425":1,"i426":2,"i427":2,"i428":32,"i429":2,"i430":1,"i431":1,"i432":1,"i433":1,"i434":2,"i435":8,"i436":32,"i437":1,"i438":1,"i439":1,"i440":2,"i441":1,"i442":1,"i443":1,"i444":1,"i445":2,"i446":2,"i447":2,"i448":8,"i449":32,"i450":1,"i451":2,"i452":1,"i453":1,"i454":32,"i455":2,"i456":2,"i457":2,"i458":1,"i459":2,"i460":1,"i461":1,"i462":1,"i463":2,"i464":2,"i465":2,"i466":2,"i467":2,"i468":2,"i469":2,"i470":2,"i471":2,"i472":2,"i473":2,"i474":2,"i475":2,"i476":2,"i477":2,"i478":2,"i479":2,"i480":2,"i481":2,"i482":2,"i483":2,"i484":2,"i485":8,"i486":2,"i487":2,"i488":2,"i489":2,"i490":2,"i491":1,"i492":2,"i493":2,"i494":2,"i495":2,"i496":2,"i497":2,"i498":2,"i499":2,"i500":2,"i501":1,"i502":2,"i503":2,"i504":2,"i505":2,"i506":8,"i507":2,"i508":2,"i509":2,"i510":8,"i511":2,"i512":2,"i513":32,"i514":1,"i515":2,"i516":2,"i517":2,"i518":2,"i519":2,"i520":8,"i521":2,"i522":2,"i523":32,"i524":32,"i525":2,"i526":2,"i527":2,"i528":2,"i529":2,"i530":2,"i531":2,"i532":2,"i533":2,"i534":2,"i535":2,"i536":2,"i537":2,"i538":2,"i539":2,"i540":2,"i541":32,"i542":2,"i543":2,"i544":2,"i545":2,"i546":8,"i547":2,"i548":2,"i549":2,"i550":2,"i551":2,"i552":2,"i553":2,"i554":2,"i555":2,"i556":2,"i557":1,"i558":1,"i559":2,"i560":2,"i561":1,"i562":2,"i563":1,"i564":2,"i565":2,"i566":2,"i567":2,"i568":1,"i569":2,"i570":2,"i571":2,"i572":32,"i573":2,"i574":2,"i575":2,"i576":2,"i577":2,"i578":2,"i579":32,"i580":2,"i581":2,"i582":8,"i583":1,"i584":1,"i585":1,"i586":1,"i587":8,"i588":8,"i589":1,"i590":2,"i591":2,"i592":2,"i593":2,"i594":1,"i595":1,"i596":2,"i597":8,"i598":1,"i599":8,"i600":32,"i601":8,"i602":8,"i603":2,"i604":2,"i605":2,"i606":2,"i607":2,"i608":2,"i609":2,"i610":2,"i611":1,"i612":2,"i613":2,"i614":2,"i615":8,"i616":2,"i617":2,"i618":2,"i619":2,"i620":2,"i621":2,"i622":2,"i623":2,"i624":8,"i625":1,"i626":2,"i627":2,"i628":2,"i629":2,"i630":2,"i631":2,"i632":2,"i633":2,"i634":2,"i635":1,"i636":1,"i637":1,"i638":1,"i639":2,"i640":1,"i641":1,"i642":2,"i643":1,"i644":8,"i645":1,"i646":2,"i647":1,"i648":2,"i649":2,"i650":2,"i651":2,"i652":2,"i653":2,"i654":2,"i655":2,"i656":2,"i657":1,"i658":2,"i659":2,"i660":2,"i661":32,"i662":2,"i663":2,"i664":1,"i665":1,"i666":1,"i667":2,"i668":1,"i669":1,"i670":2,"i671":8,"i672":2,"i673":2,"i674":8,"i675":1,"i676":2,"i677":8,"i678":8,"i679":2,"i680":2,"i681":1,"i682":8,"i683":2,"i684":2,"i685":2,"i686":2,"i687":2,"i688":2,"i689":2,"i690":2,"i691":2,"i692":1,"i693":1,"i694":2,"i695":2,"i696":2,"i697":32,"i698":2,"i699":2,"i700":2,"i701":2,"i702":1,"i703":1,"i704":2,"i705":1,"i706":2,"i707":2,"i708":1,"i709":1,"i710":1,"i711":2,"i712":1,"i713":1,"i714":32,"i715":1,"i716":1,"i717":1,"i718":1,"i719":1,"i720":2,"i721":1,"i722":1,"i723":2,"i724":1,"i725":2,"i726":2,"i727":8,"i728":32,"i729":2,"i730":1,"i731":1,"i732":1,"i733":2,"i734":1,"i735":2,"i736":2,"i737":2,"i738":2,"i739":2,"i740":2,"i741":32,"i742":2,"i743":32,"i744":2,"i745":2,"i746":2,"i747":2,"i748":2,"i749":2,"i750":2,"i751":2,"i752":1,"i753":32,"i754":2,"i755":2,"i756":2,"i757":32,"i758":2,"i759":2,"i760":2,"i761":2,"i762":2,"i763":2,"i764":2,"i765":8,"i766":2,"i767":2,"i768":2,"i769":1,"i770":2,"i771":2,"i772":2,"i773":2,"i774":8,"i775":2,"i776":1,"i777":2,"i778":2,"i779":2,"i780":2,"i781":2,"i782":2,"i783":2,"i784":2,"i785":2,"i786":2,"i787":1,"i788":1,"i789":1,"i790":2,"i791":2,"i792":2,"i793":2,"i794":2,"i795":1,"i796":1,"i797":32,"i798":2,"i799":2,"i800":32,"i801":32,"i802":1,"i803":2,"i804":1,"i805":32,"i806":32,"i807":32,"i808":2,"i809":32,"i810":32,"i811":32,"i812":2,"i813":1,"i814":1,"i815":2,"i816":1,"i817":2,"i818":1,"i819":1,"i820":2,"i821":2,"i822":1,"i823":1,"i824":1,"i825":32,"i826":32,"i827":2,"i828":32,"i829":2,"i830":2,"i831":2,"i832":2,"i833":8,"i834":2,"i835":2,"i836":2,"i837":2,"i838":2,"i839":1,"i840":1,"i841":2,"i842":2,"i843":2,"i844":2,"i845":2,"i846":2,"i847":2,"i848":2,"i849":2,"i850":2,"i851":2,"i852":8,"i853":1,"i854":32,"i855":32,"i856":1,"i857":1,"i858":32,"i859":32,"i860":32,"i861":32,"i862":2,"i863":1,"i864":2,"i865":2,"i866":32,"i867":2,"i868":2,"i869":2,"i870":2,"i871":32,"i872":2,"i873":1,"i874":2,"i875":2,"i876":1,"i877":2,"i878":2,"i879":2,"i880":2,"i881":2,"i882":2,"i883":2,"i884":2,"i885":1,"i886":1,"i887":2,"i888":2,"i889":2,"i890":8,"i891":2,"i892":2,"i893":2,"i894":1,"i895":8,"i896":1,"i897":32,"i898":32,"i899":1,"i900":1,"i901":2,"i902":1,"i903":2,"i904":2,"i905":2,"i906":2,"i907":2,"i908":2,"i909":2,"i910":2,"i911":2,"i912":2,"i913":2,"i914":2,"i915":2,"i916":1,"i917":1,"i918":2,"i919":1,"i920":2,"i921":1,"i922":1,"i923":2,"i924":1,"i925":2,"i926":1,"i927":1,"i928":1,"i929":1,"i930":2,"i931":2,"i932":1,"i933":2,"i934":2,"i935":2,"i936":2,"i937":2,"i938":2,"i939":2,"i940":2,"i941":2,"i942":2,"i943":2,"i944":2,"i945":2,"i946":2,"i947":2,"i948":2,"i949":2,"i950":2,"i951":2,"i952":2,"i953":2,"i954":2,"i955":1,"i956":2,"i957":2,"i958":1,"i959":1,"i960":1,"i961":1,"i962":1,"i963":1,"i964":1,"i965":1,"i966":1,"i967":2,"i968":2,"i969":1,"i970":2,"i971":2,"i972":2,"i973":2,"i974":2,"i975":2,"i976":2,"i977":2,"i978":2,"i979":1,"i980":1,"i981":2,"i982":2,"i983":2,"i984":2,"i985":2,"i986":8,"i987":2,"i988":2,"i989":2,"i990":2,"i991":2,"i992":2,"i993":2,"i994":2,"i995":2,"i996":1,"i997":1,"i998":1,"i999":2,"i1000":32,"i1001":2,"i1002":1,"i1003":1,"i1004":8,"i1005":1,"i1006":2,"i1007":2,"i1008":2,"i1009":32,"i1010":2,"i1011":2,"i1012":2,"i1013":2,"i1014":1,"i1015":2,"i1016":2,"i1017":2,"i1018":2,"i1019":2,"i1020":2,"i1021":2,"i1022":32,"i1023":2,"i1024":32,"i1025":32,"i1026":2,"i1027":1,"i1028":2,"i1029":2,"i1030":1,"i1031":1,"i1032":2,"i1033":2,"i1034":2,"i1035":2,"i1036":2,"i1037":2,"i1038":1,"i1039":2,"i1040":1,"i1041":2,"i1042":2,"i1043":2,"i1044":2,"i1045":1,"i1046":2,"i1047":2,"i1048":32,"i1049":2,"i1050":2,"i1051":2,"i1052":1,"i1053":1,"i1054":2,"i1055":32,"i1056":1,"i1057":2,"i1058":2,"i1059":1,"i1060":2,"i1061":2,"i1062":2,"i1063":1,"i1064":2,"i1065":1,"i1066":2,"i1067":1,"i1068":2,"i1069":1,"i1070":2,"i1071":2,"i1072":1,"i1073":32,"i1074":2,"i1075":32,"i1076":1,"i1077":2,"i1078":2,"i1079":1,"i1080":32,"i1081":2,"i1082":2,"i1083":2,"i1084":2,"i1085":2,"i1086":8,"i1087":32,"i1088":8,"i1089":8,"i1090":32,"i1091":2,"i1092":2,"i1093":2,"i1094":2,"i1095":2,"i1096":2,"i1097":2,"i1098":2,"i1099":2,"i1100":2,"i1101":1,"i1102":1,"i1103":2,"i1104":1,"i1105":1,"i1106":2,"i1107":2,"i1108":2,"i1109":2,"i1110":2,"i1111":2,"i1112":2,"i1113":2,"i1114":2,"i1115":8,"i1116":2,"i1117":2,"i1118":2,"i1119":2,"i1120":2,"i1121":2,"i1122":2,"i1123":2,"i1124":32,"i1125":32,"i1126":2,"i1127":2,"i1128":2,"i1129":2,"i1130":2,"i1131":2,"i1132":2,"i1133":2,"i1134":1,"i1135":2}; var tabs = {65535:["t0","All Classes"],1:["t1","Interface Summary"],2:["t2","Class Summary"],8:["t4","Exception Summary"],32:["t6","Annotation Types Summary"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -335,7 +335,7 @@

All Classes

Action.WaitForIsLoading -
Waits for a specified loading state, returning either immediately or after a call to Player.EventListener.onIsLoadingChanged(boolean).
+
Waits for a specified loading state, returning either immediately or after a call to Player.Listener.onIsLoadingChanged(boolean).
@@ -353,27 +353,27 @@

All Classes

Action.WaitForPlaybackState -
Waits for a specified playback state, returning either immediately or after a call to Player.EventListener.onPlaybackStateChanged(int).
+
Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
Action.WaitForPlayWhenReady
Waits for a specified playWhenReady value, returning either immediately or after a call to - Player.EventListener.onPlayWhenReadyChanged(boolean, int).
+ Player.Listener.onPlayWhenReadyChanged(boolean, int). Action.WaitForPositionDiscontinuity -
Waits for Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, + Action.WaitForTimelineChanged - + @@ -2943,839 +2943,851 @@

All Classes

+ExtractorUtil + +
Extractor related utility methods.
+ + + FailOnCloseDataSink
A DataSink that can simulate caching the bytes being written to it, and then failing to persist them when FailOnCloseDataSink.close() is called.
- + FailOnCloseDataSink.Factory
Factory to create a FailOnCloseDataSink.
- + FakeAdaptiveDataSet
Fake data set emulating the data of an adaptive media source.
- + FakeAdaptiveDataSet.Factory
Factory for FakeAdaptiveDataSets.
- + FakeAdaptiveDataSet.Iterator
MediaChunkIterator for the chunks defined by a fake adaptive data set.
- + FakeAdaptiveMediaPeriod
Fake MediaPeriod that provides tracks from the given TrackGroupArray.
- + FakeAdaptiveMediaSource
Fake MediaSource that provides a given timeline.
- + FakeAudioRenderer - + FakeChunkSource
Fake ChunkSource with adaptive media chunks of a given duration.
- + FakeChunkSource.Factory
Factory for a FakeChunkSource.
- + FakeClock
Fake Clock implementation that allows to advance the time manually to trigger pending timed messages.
- + FakeDataSet
Collection of FakeDataSet.FakeData to be served by a FakeDataSource.
- + FakeDataSet.FakeData
Container of fake data to be served by a FakeDataSource.
- + FakeDataSet.FakeData.Segment
A segment of FakeDataSet.FakeData.
- + FakeDataSource
A fake DataSource capable of simulating various scenarios.
- + FakeDataSource.Factory
Factory to create a FakeDataSource.
- + FakeExoMediaDrm
A fake implementation of ExoMediaDrm for use in tests.
- + +FakeExoMediaDrm.Builder + +
Builder for FakeExoMediaDrm instances.
+ + + FakeExoMediaDrm.LicenseServer
An license server implementation to interact with FakeExoMediaDrm.
- + FakeExtractorInput
A fake ExtractorInput capable of simulating various scenarios.
- + FakeExtractorInput.Builder
Builder of FakeExtractorInput instances.
- + FakeExtractorInput.SimulatedIOException
Thrown when simulating an IOException.
- + FakeExtractorOutput - + FakeMediaChunk - + FakeMediaChunkIterator - + FakeMediaClockRenderer
Fake abstract Renderer which is also a MediaClock.
- + FakeMediaPeriod
Fake MediaPeriod that provides tracks from the given TrackGroupArray.
- + FakeMediaPeriod.TrackDataFactory
A factory to create the test data for a particular track.
- + FakeMediaSource
Fake MediaSource that provides a given timeline.
- + FakeMediaSource.InitialTimeline
A forwarding timeline to provide an initial timeline for fake multi window sources.
- + FakeRenderer
Fake Renderer that supports any format with the matching track type.
- + FakeSampleStream
Fake SampleStream that outputs a given Format and any amount of items.
- + FakeSampleStream.FakeSampleStreamItem - + FakeShuffleOrder
Fake ShuffleOrder which returns a reverse order.
- + FakeTimeline
Fake Timeline which can be setup to return custom FakeTimeline.TimelineWindowDefinitions.
- + FakeTimeline.TimelineWindowDefinition
Definition used to define a FakeTimeline.
- + FakeTrackOutput
A fake TrackOutput.
- + FakeTrackOutput.Factory
Factory for FakeTrackOutput instances.
- + FakeTrackSelection
A fake ExoTrackSelection that only returns 1 fixed track, and allows querying the number of calls to its methods.
- + FakeTrackSelector - + FakeVideoRenderer - + FfmpegAudioRenderer
Decodes and renders audio using FFmpeg.
- + FfmpegDecoderException
Thrown when an FFmpeg decoder error occurs.
- + FfmpegLibrary
Configures and queries the underlying native library.
- + FileDataSource
A DataSource for reading local files.
- + FileDataSource.Factory - + FileDataSource.FileDataSourceException
Thrown when a FileDataSource encounters an error reading a file.
- + FileDataSourceFactory Deprecated. - + FileTypes
Defines common file type constants and helper methods.
- + FileTypes.Type
File types.
- + FilterableManifest<T>
A manifest that can generate copies of itself including only the streams specified by the given keys.
- + FilteringHlsPlaylistParserFactory
A HlsPlaylistParserFactory that includes only the streams identified by the given stream keys.
- + FilteringManifestParser<T extends FilterableManifest<T>>
A manifest parser that includes only the streams identified by the given stream keys.
- + FixedTrackSelection
A TrackSelection consisting of a single track.
- + FlacConstants
Defines constants used by the FLAC extractor.
- + FlacDecoder
Flac decoder.
- + FlacDecoderException
Thrown when an Flac decoder error occurs.
- + FlacExtractor
Facilitates the extraction of data from the FLAC container format.
- + FlacExtractor
Extracts data from FLAC container format.
- + FlacExtractor.Flags
Flags controlling the behavior of the extractor.
- + FlacExtractor.Flags
Flags controlling the behavior of the extractor.
- + FlacFrameReader
Reads and peeks FLAC frame elements according to the FLAC format specification.
- + FlacFrameReader.SampleNumberHolder
Holds a sample number.
- + FlacLibrary
Configures and queries the underlying native library.
- + FlacMetadataReader
Reads and peeks FLAC stream metadata elements according to the FLAC format specification.
- + FlacMetadataReader.FlacStreamMetadataHolder - + FlacSeekTableSeekMap
A SeekMap implementation for FLAC streams that contain a seek table.
- + FlacStreamMetadata
Holder for FLAC metadata.
- + FlacStreamMetadata.SeekTable
A FLAC seek table.
- + FlvExtractor
Extracts data from the FLV container format.
- + Format
Represents a media format.
- + Format.Builder
Builds Format instances.
- + FormatHolder
Holds a Format.
- + ForwardingAudioSink
An overridable AudioSink implementation forwarding all methods to another sink.
- + ForwardingExtractorInput
An overridable ExtractorInput implementation forwarding all methods to another input.
- + ForwardingTimeline
An overridable Timeline implementation forwarding all methods to another timeline.
- + FragmentedMp4Extractor
Extracts data from the FMP4 container format.
- + FragmentedMp4Extractor.Flags
Flags controlling the behavior of the extractor.
- + FrameworkMediaCrypto
An ExoMediaCrypto implementation that contains the necessary information to build or update a framework MediaCrypto.
- + FrameworkMediaDrm
An ExoMediaDrm implementation that wraps the framework MediaDrm.
- + GaplessInfoHolder
Holder for gapless playback information.
- + Gav1Decoder
Gav1 decoder.
- + Gav1DecoderException
Thrown when a libgav1 decoder error occurs.
- + Gav1Library
Configures and queries the underlying native library.
- + GeobFrame
GEOB (General Encapsulated Object) ID3 frame.
- + GlUtil
GL utilities.
- + GlUtil.Attribute
GL attribute, which can be attached to a buffer with GlUtil.Attribute.setBuffer(float[], int).
- + GlUtil.Uniform
GL uniform, which can be attached to a sampler using GlUtil.Uniform.setSamplerTexId(int, int).
- + GvrAudioProcessor Deprecated.
If you still need this component, please contact us by filing an issue on our issue tracker.
- + H262Reader
Parses a continuous H262 byte stream and extracts individual frames.
- + H263Reader
Parses an ISO/IEC 14496-2 (MPEG-4 Part 2) or ITU-T Recommendation H.263 byte stream and extracts individual frames.
- + H264Reader
Parses a continuous H264 byte stream and extracts individual frames.
- + H265Reader
Parses a continuous H.265 byte stream and extracts individual frames.
- + HandlerWrapper
An interface to call through to a Handler.
- + HandlerWrapper.Message
A message obtained from the handler.
- + HeartRating
A rating expressed as "heart" or "no heart".
- + HevcConfig
HEVC configuration data.
- + HlsDataSourceFactory
Creates DataSources for HLS playlists, encryption and media chunks.
- + HlsDownloader
A downloader for HLS streams.
- + HlsExtractorFactory
Factory for HLS media chunk extractors.
- + HlsManifest
Holds a master playlist along with a snapshot of one of its media playlists.
- + HlsMasterPlaylist
Represents an HLS master playlist.
- + HlsMasterPlaylist.Rendition
A rendition (i.e.
- + HlsMasterPlaylist.Variant
A variant (i.e.
- + HlsMediaChunkExtractor
Extracts samples and track Formats from HlsMediaChunks.
- + HlsMediaPeriod
A MediaPeriod that loads an HLS stream.
- + HlsMediaPlaylist
Represents an HLS media playlist.
- + HlsMediaPlaylist.Part
A media part.
- + HlsMediaPlaylist.PlaylistType
Type of the playlist, as defined by #EXT-X-PLAYLIST-TYPE.
- + HlsMediaPlaylist.RenditionReport
A rendition report for an alternative rendition defined in another media playlist.
- + HlsMediaPlaylist.Segment
Media segment reference.
- + HlsMediaPlaylist.SegmentBase
The base for a HlsMediaPlaylist.Segment or a HlsMediaPlaylist.Part required for playback.
- + HlsMediaPlaylist.ServerControl
Server control attributes.
- + HlsMediaSource
An HLS MediaSource.
- + HlsMediaSource.Factory
Factory for HlsMediaSources.
- + HlsMediaSource.MetadataType
The types of metadata that can be extracted from HLS streams.
- + HlsPlaylist
Represents an HLS playlist.
- + HlsPlaylistParser
HLS playlists parsing logic.
- + HlsPlaylistParser.DeltaUpdateException
Exception thrown when merging a delta update fails.
- + HlsPlaylistParserFactory
Factory for HlsPlaylist parsers.
- + HlsPlaylistTracker
Tracks playlists associated to an HLS stream and provides snapshots.
- + HlsPlaylistTracker.Factory
Factory for HlsPlaylistTracker instances.
- + HlsPlaylistTracker.PlaylistEventListener
Called on playlist loading events.
- + HlsPlaylistTracker.PlaylistResetException
Thrown when the media sequence of a new snapshot indicates the server has reset.
- + HlsPlaylistTracker.PlaylistStuckException
Thrown when a playlist is considered to be stuck due to a server side error.
- + HlsPlaylistTracker.PrimaryPlaylistListener
Listener for primary playlist changes.
- + HlsTrackMetadataEntry
Holds metadata associated to an HLS media track.
- + HlsTrackMetadataEntry.VariantInfo
Holds attributes defined in an EXT-X-STREAM-INF tag.
- + HorizontalTextInVerticalContextSpan
A styling span for horizontal text in a vertical context.
- + HostActivity
A host activity for performing playback tests.
- + HostActivity.HostedTest
Interface for tests that run inside of a HostActivity.
- + HttpDataSource
An HTTP DataSource.
- + HttpDataSource.BaseFactory
Base implementation of HttpDataSource.Factory that sets default request properties.
- + HttpDataSource.CleartextNotPermittedException
Thrown when cleartext HTTP traffic is not permitted.
- + HttpDataSource.Factory
A factory for HttpDataSource instances.
- + HttpDataSource.HttpDataSourceException
Thrown when an error is encountered when trying to read from a HttpDataSource.
- + HttpDataSource.HttpDataSourceException.Type   - + HttpDataSource.InvalidContentTypeException
Thrown when the content type is invalid.
- + HttpDataSource.InvalidResponseCodeException
Thrown when an attempt to open a connection results in a response code not in the 2xx range.
- + HttpDataSource.RequestProperties
Stores HTTP request properties (aka HTTP headers) and provides methods to modify the headers @@ -3783,312 +3795,312 @@

All Classes

unintended state.
- + HttpDataSourceTestEnv
A JUnit Rule that creates test resources for HttpDataSource contract tests.
- + HttpMediaDrmCallback
A MediaDrmCallback that makes requests using HttpDataSource instances.
- + HttpUtil
Utility methods for HTTP.
- + IcyDecoder
Decodes ICY stream information.
- + IcyHeaders
ICY headers.
- + IcyInfo
ICY in-stream information.
- + Id3Decoder
Decodes ID3 tags.
- + Id3Decoder.FramePredicate
A predicate for determining whether individual frames should be decoded.
- + Id3Frame
Base class for ID3 frames.
- + Id3Peeker
Peeks data from the beginning of an ExtractorInput to determine if there is any ID3 tag.
- + Id3Reader
Parses ID3 data and extracts individual text information frames.
- + IllegalSeekPositionException
Thrown when an attempt is made to seek to a position that does not exist in the player's Timeline.
- + ImaAdsLoader
AdsLoader using the IMA SDK.
- + ImaAdsLoader.Builder
Builder for ImaAdsLoader.
- + IndexSeekMap
A SeekMap implementation based on a mapping between times and positions in the input stream.
- + InitializationChunk
A Chunk that uses an Extractor to decode initialization data for single track.
- + InputReaderAdapterV30
MediaParser.SeekableInputReader implementation wrapping a DataReader.
- + IntArrayQueue
Array-based unbounded queue for int primitives with amortized O(1) add and remove.
- + InternalFrame
Internal ID3 frame that is intended for use by the player.
- + JpegExtractor
Extracts JPEG image using the Exif format.
- + KeysExpiredException
Thrown when the drm keys loaded into an open session expire.
- + LanguageFeatureSpan
Marker interface for span classes that carry language features rather than style information.
- + LatmReader
Parses and extracts samples from an AAC/LATM elementary stream.
- + LeanbackPlayerAdapter
Leanback PlayerAdapter implementation for Player.
- + LeastRecentlyUsedCacheEvictor
Evicts least recently used cache files first.
- + LibflacAudioRenderer
Decodes and renders audio using the native Flac decoder.
- + Libgav1VideoRenderer
Decodes and renders video using libgav1 decoder.
- + LibopusAudioRenderer
Decodes and renders audio using the native Opus decoder.
- + LibraryLoader
Configurable loader for native libraries.
- + LibvpxVideoRenderer
Decodes and renders video using the native VP9 decoder.
- + ListenerSet<T>
A set of listeners.
- + ListenerSet.Event<T>
An event sent to a listener.
- + ListenerSet.IterationFinishedEvent<T>
An event sent to a listener when all other events sent during one Looper message queue iteration were handled by the listener.
- + LivePlaybackSpeedControl
Controls the playback speed while playing live content in order to maintain a steady target live offset.
- + LoadControl
Controls buffering of media.
- + Loader
Manages the background loading of Loader.Loadables.
- + Loader.Callback<T extends Loader.Loadable>
A callback to be notified of Loader events.
- + Loader.Loadable
An object that can be loaded using a Loader.
- + Loader.LoadErrorAction - + Loader.ReleaseCallback
A callback to be notified when a Loader has finished being released.
- + Loader.UnexpectedLoaderException
Thrown when an unexpected exception or error is encountered during loading.
- + LoaderErrorThrower
Conditionally throws errors affecting a Loader.
- + LoaderErrorThrower.Dummy
A LoaderErrorThrower that never throws.
- + LoadErrorHandlingPolicy
Defines how errors encountered by loaders are handled.
- + LoadErrorHandlingPolicy.LoadErrorInfo
Holds information about a load task error.
- + LoadEventInfo
MediaSource load event information.
- + LocalMediaDrmCallback
A MediaDrmCallback that provides a fixed response to key requests.
- + Log
Wrapper around Log which allows to set the log level.
- + LongArray
An append-only, auto-growing long[].
- + LoopingMediaSource Deprecated.
To loop a MediaSource indefinitely, use Player.setRepeatMode(int) instead of this class.
- + MappingTrackSelector
Base class for TrackSelectors that first establish a mapping between TrackGroups @@ -4096,1625 +4108,1625 @@

All Classes

renderer.
- + MappingTrackSelector.MappedTrackInfo
Provides mapped track information for each renderer.
- + MaskingMediaPeriod
Media period that defers calling MediaSource.createPeriod(MediaPeriodId, Allocator, long) on a given source until MaskingMediaPeriod.createPeriod(MediaPeriodId) has been called.
- + MaskingMediaPeriod.PrepareListener
Listener for preparation events.
- + MaskingMediaSource
A MediaSource that masks the Timeline with a placeholder until the actual media structure is known.
- + MaskingMediaSource.PlaceholderTimeline
A timeline with one dynamic window with a period of indeterminate duration.
- + MatroskaExtractor
Extracts data from the Matroska and WebM container formats.
- + MatroskaExtractor.Flags
Flags controlling the behavior of the extractor.
- + MdtaMetadataEntry
Stores extensible metadata with handler type 'mdta'.
- + MediaChunk
An abstract base class for Chunks that contain media samples.
- + MediaChunkIterator
Iterator for media chunk sequences.
- + MediaClock
Tracks the progression of media time.
- + MediaCodecAdapter
Abstracts MediaCodec operations.
- + MediaCodecAdapter.Configuration
Configuration parameters for a MediaCodecAdapter.
- + MediaCodecAdapter.Factory
A factory for MediaCodecAdapter instances.
- + MediaCodecAdapter.OnFrameRenderedListener
Listener to be called when an output frame has rendered on the output surface.
- + MediaCodecAudioRenderer
Decodes and renders audio using MediaCodec and an AudioSink.
- + MediaCodecDecoderException
Thrown when a failure occurs in a MediaCodec decoder.
- + MediaCodecInfo
Information about a MediaCodec for a given mime type.
- + MediaCodecRenderer
An abstract renderer that uses MediaCodec to decode samples for rendering.
- + MediaCodecRenderer.DecoderInitializationException
Thrown when a failure occurs instantiating a decoder.
- + MediaCodecSelector
Selector of MediaCodec instances.
- + MediaCodecUtil
A utility class for querying the available codecs.
- + MediaCodecUtil.DecoderQueryException
Thrown when an error occurs querying the device for its underlying media capabilities.
- + MediaCodecVideoDecoderException
Thrown when a failure occurs in a MediaCodec video decoder.
- + MediaCodecVideoRenderer
Decodes and renders video using MediaCodec.
- + MediaCodecVideoRenderer.CodecMaxValues   - + MediaDrmCallback
Performs ExoMediaDrm key and provisioning requests.
- + MediaDrmCallbackException
Thrown when an error occurs while executing a DRM key or provisioning request.
- + MediaFormatUtil
Helper class containing utility methods for managing MediaFormat instances.
- + MediaItem
Representation of a media item.
- + MediaItem.AdsConfiguration
Configuration for playing back linear ads with a media item.
- + MediaItem.Builder
A builder for MediaItem instances.
- + MediaItem.ClippingProperties
Optionally clips the media item to a custom start and end position.
- + MediaItem.DrmConfiguration
DRM configuration for a media item.
- + MediaItem.LiveConfiguration
Live playback configuration.
- + MediaItem.PlaybackProperties
Properties for local playback.
- + MediaItem.Subtitle
Properties for a text track.
- + MediaItemConverter
Converts between MediaItem and the Cast SDK's MediaQueueItem.
- + MediaItemConverter
Converts between Media2 MediaItem and ExoPlayer MediaItem.
- + MediaLoadData
Descriptor for data being loaded or selected by a MediaSource.
- + MediaMetadata
Metadata of a MediaItem, playlist, or a combination of multiple sources of Metadata.
- + MediaMetadata.Builder
A builder for MediaMetadata instances.
- + MediaMetadata.FolderType
The folder type of the media item.
- + MediaParserChunkExtractor
ChunkExtractor implemented on top of the platform's MediaParser.
- + MediaParserExtractorAdapter
ProgressiveMediaExtractor implemented on top of the platform's MediaParser.
- + MediaParserHlsMediaChunkExtractor
HlsMediaChunkExtractor implemented on top of the platform's MediaParser.
- + MediaParserUtil
Miscellaneous constants and utility methods related to the MediaParser integration.
- + MediaPeriod
Loads media corresponding to a Timeline.Period, and allows that media to be read.
- + MediaPeriod.Callback
A callback to be notified of MediaPeriod events.
- + MediaPeriodAsserts
Assertion methods for MediaPeriod.
- + MediaPeriodAsserts.FilterableManifestMediaPeriodFactory<T extends FilterableManifest<T>>
Interface to create media periods for testing based on a FilterableManifest.
- + MediaPeriodId
Identifies a specific playback of a Timeline.Period.
- + MediaSessionConnector
Connects a MediaSessionCompat to a Player.
- + MediaSessionConnector.CaptionCallback
Handles requests for enabling or disabling captions.
- + MediaSessionConnector.CommandReceiver
Receiver of media commands sent by a media controller.
- + MediaSessionConnector.CustomActionProvider
Provides a PlaybackStateCompat.CustomAction to be published and handles the action when sent by a media controller.
- + MediaSessionConnector.DefaultMediaMetadataProvider
Provides a default MediaMetadataCompat with properties and extras taken from the MediaDescriptionCompat of the MediaSessionCompat.QueueItem of the active queue item.
- + MediaSessionConnector.MediaButtonEventHandler
Handles a media button event.
- + MediaSessionConnector.MediaMetadataProvider
Provides a MediaMetadataCompat for a given player state.
- + MediaSessionConnector.PlaybackActions
Playback actions supported by the connector.
- + MediaSessionConnector.PlaybackPreparer
Interface to which playback preparation and play actions are delegated.
- + MediaSessionConnector.QueueEditor
Handles media session queue edits.
- + MediaSessionConnector.QueueNavigator
Handles queue navigation actions, and updates the media session queue by calling MediaSessionCompat.setQueue().
- + MediaSessionConnector.RatingCallback
Callback receiving a user rating for the active media item.
- + MediaSource
Defines and provides media to be played by an ExoPlayer.
- + MediaSource.MediaPeriodId
Identifier for a MediaPeriod.
- + MediaSource.MediaSourceCaller
A caller of media sources, which will be notified of source events.
- + MediaSourceEventListener
Interface for callbacks to be notified of MediaSource events.
- + MediaSourceEventListener.EventDispatcher
Dispatches events to MediaSourceEventListeners.
- + MediaSourceFactory
Factory for creating MediaSources from MediaItems.
- + MediaSourceTestRunner
A runner for MediaSource tests.
- + MergingMediaSource
Merges multiple MediaSources.
- + MergingMediaSource.IllegalMergeException
Thrown when a MergingMediaSource cannot merge its sources.
- + MergingMediaSource.IllegalMergeException.Reason
The reason the merge failed.
- + Metadata
A collection of metadata entries.
- + Metadata.Entry
A metadata entry.
- + MetadataDecoder
Decodes metadata from binary data.
- + MetadataDecoderFactory
A factory for MetadataDecoder instances.
- + MetadataInputBuffer - + MetadataOutput
Receives metadata output.
- + MetadataRenderer
A renderer for metadata.
- + MetadataRetriever
Retrieves the static metadata of MediaItems.
- + MimeTypes
Defines common MIME types and helper methods.
- + MlltFrame
MPEG location lookup table frame.
- + MotionPhotoMetadata
Metadata of a motion photo file.
- + Mp3Extractor
Extracts data from the MP3 container format.
- + Mp3Extractor.Flags
Flags controlling the behavior of the extractor.
- + Mp4Extractor
Extracts data from the MP4 container format.
- + Mp4Extractor.Flags
Flags controlling the behavior of the extractor.
- + Mp4WebvttDecoder
A SimpleSubtitleDecoder for Webvtt embedded in a Mp4 container file.
- + MpegAudioReader
Parses a continuous MPEG Audio byte stream and extracts individual frames.
- + MpegAudioUtil
Utility methods for handling MPEG audio streams.
- + MpegAudioUtil.Header
Stores the metadata for an MPEG audio frame.
- + NalUnitUtil
Utility methods for handling H.264/AVC and H.265/HEVC NAL units.
- + NalUnitUtil.PpsData
Holds data parsed from a picture parameter set NAL unit.
- + NalUnitUtil.SpsData
Holds data parsed from a sequence parameter set NAL unit.
- + NetworkTypeObserver
Observer for network type changes.
- + NetworkTypeObserver.Listener
A listener for network type changes.
- + NonNullApi
Annotation to declare all type usages in the annotated instance as Nonnull, unless explicitly marked with a nullable annotation.
- + NoOpCacheEvictor
Evictor that doesn't ever evict cache files.
- + NoSampleRenderer
A Renderer implementation whose track type is C.TRACK_TYPE_NONE and does not consume data from its SampleStream.
- + NotificationUtil
Utility methods for displaying Notifications.
- + NotificationUtil.Importance
Notification channel importance levels.
- + NoUidTimeline
A timeline which wraps another timeline and overrides all window and period uids to 0.
- + OfflineLicenseHelper
Helper class to download, renew and release offline licenses.
- + OggExtractor
Extracts data from the Ogg container format.
- + OkHttpDataSource
An HttpDataSource that delegates to Square's Call.Factory.
- + OkHttpDataSource.Factory - + OkHttpDataSourceFactory Deprecated. - + OpusDecoder
Opus decoder.
- + OpusDecoderException
Thrown when an Opus decoder error occurs.
- + OpusLibrary
Configures and queries the underlying native library.
- + OpusUtil
Utility methods for handling Opus audio streams.
- + OutputBuffer
Output buffer decoded by a Decoder.
- + OutputBuffer.Owner<S extends OutputBuffer>
Buffer owner.
- + OutputConsumerAdapterV30
MediaParser.OutputConsumer implementation that redirects output to an ExtractorOutput.
- + ParsableBitArray
Wraps a byte array, providing methods that allow it to be read as a bitstream.
- + ParsableByteArray
Wraps a byte array, providing a set of methods for parsing data from it.
- + ParsableNalUnitBitArray
Wraps a byte array, providing methods that allow it to be read as a NAL unit bitstream.
- + ParserException
Thrown when an error occurs parsing media data and metadata.
- + ParsingLoadable<T>
A Loader.Loadable for objects that can be parsed from binary data using a ParsingLoadable.Parser.
- + ParsingLoadable.Parser<T>
Parses an object from loaded data.
- + PassthroughSectionPayloadReader
A SectionPayloadReader that directly outputs the section bytes as sample data.
- + PercentageRating
A rating expressed as a percentage.
- + Period
Encapsulates media content components over a contiguous period of time.
- + PesReader
Parses PES packet data and extracts samples.
- + PgsDecoder
A SimpleSubtitleDecoder for PGS subtitles.
- + PictureFrame
A picture parsed from a FLAC file.
- + PlatformScheduler
A Scheduler that uses JobScheduler.
- + PlatformScheduler.PlatformSchedulerService
A JobService that starts the target service if the requirements are met.
- + PlaybackOutput
Class to capture output from a playback test.
- + PlaybackParameters
Parameters that apply to playback, including speed setting.
- + PlaybackPreparer Deprecated.
Use ControlDispatcher instead.
- + PlaybackSessionManager
Manager for active playback sessions.
- + PlaybackSessionManager.Listener
A listener for session updates.
- + PlaybackStats
Statistics about playbacks.
- + PlaybackStats.EventTimeAndException
Stores an exception with the event time at which it occurred.
- + PlaybackStats.EventTimeAndFormat
Stores a format with the event time at which it started being used, or null to indicate that no format was used.
- + PlaybackStats.EventTimeAndPlaybackState
Stores a playback state with the event time at which it became active.
- + PlaybackStatsListener
AnalyticsListener to gather PlaybackStats from the player.
- + PlaybackStatsListener.Callback
A listener for PlaybackStats updates.
- + Player
A media player interface defining traditional high-level functionality, such as the ability to play, pause, seek and query properties of the currently playing media.
- + Player.Command
Commands that can be executed on a Player.
- + Player.Commands
A set of commands.
- + Player.Commands.Builder
A builder for Player.Commands instances.
- + Player.DiscontinuityReason
Reasons for position discontinuities.
- + Player.EventFlags -
Events that can be reported via Player.EventListener.onEvents(Player, Events).
+
Events that can be reported via Player.Listener.onEvents(Player, Events).
- + Player.EventListener Deprecated. - + Player.Events - + Player.Listener
Listener of all changes in the Player.
- + Player.MediaItemTransitionReason
Reasons for media item transitions.
- + Player.PlaybackSuppressionReason
Reason why playback is suppressed even though Player.getPlayWhenReady() is true.
- + Player.PlayWhenReadyChangeReason
Reasons for playWhenReady changes.
- + Player.PositionInfo
Position info describing a playback position involved in a discontinuity.
- + Player.RepeatMode
Repeat modes for playback.
- + Player.State
Playback state.
- + Player.TimelineChangeReason
Reasons for timeline changes.
- + PlayerControlView
A view for controlling Player instances.
- + PlayerControlView.ProgressUpdateListener
Listener to be notified when progress has been updated.
- + PlayerControlView.VisibilityListener
Listener to be notified about changes of the visibility of the UI control.
- + PlayerEmsgHandler
Handles all emsg messages from all media tracks for the player.
- + PlayerEmsgHandler.PlayerEmsgCallback
Callbacks for player emsg events encountered during DASH live stream.
- + PlayerMessage
Defines a player message which can be sent with a PlayerMessage.Sender and received by a PlayerMessage.Target.
- + PlayerMessage.Sender
A sender for messages.
- + PlayerMessage.Target
A target for messages.
- + PlayerNotificationManager
Starts, updates and cancels a media style notification reflecting the player state.
- + PlayerNotificationManager.Builder
A builder for PlayerNotificationManager instances.
- + PlayerNotificationManager.CustomActionReceiver
Defines and handles custom actions.
- + PlayerNotificationManager.MediaDescriptionAdapter
An adapter to provide content assets of the media currently playing.
- + PlayerNotificationManager.NotificationListener
A listener for changes to the notification.
- + PlayerNotificationManager.Priority
Priority of the notification (required for API 25 and lower).
- + PlayerNotificationManager.Visibility
Visibility of notification on the lock screen.
- + PlayerView
A high level view for Player media playbacks.
- + PlayerView.ShowBuffering
Determines when the buffering view is shown.
- + PositionHolder
Holds a position in the stream.
- + PriorityDataSource
A DataSource that can be used as part of a task registered with a PriorityTaskManager.
- + PriorityDataSourceFactory
A DataSource.Factory that produces PriorityDataSource instances.
- + PriorityTaskManager
Allows tasks with associated priorities to control how they proceed relative to one another.
- + PriorityTaskManager.PriorityTooLowException
Thrown when task attempts to proceed when another registered task has a higher priority.
- + PrivateCommand
Represents a private command as defined in SCTE35, Section 9.3.6.
- + PrivFrame
PRIV (Private) ID3 frame.
- + ProgramInformation
A parsed program information element.
- + ProgressHolder
Holds a progress percentage.
- + ProgressiveDownloader
A downloader for progressive media streams.
- + ProgressiveMediaExtractor
Extracts the contents of a container file from a progressive media stream.
- + ProgressiveMediaExtractor.Factory
Creates ProgressiveMediaExtractor instances.
- + ProgressiveMediaSource
Provides one period that loads data from a Uri and extracted using an Extractor.
- + ProgressiveMediaSource.Factory - + PsExtractor
Extracts data from the MPEG-2 PS container format.
- + PsshAtomUtil
Utility methods for handling PSSH atoms.
- + RandomizedMp3Decoder
Generates randomized, but correct amount of data on MP3 audio input.
- + RandomTrackSelection
An ExoTrackSelection whose selected track is updated randomly.
- + RandomTrackSelection.Factory
Factory for RandomTrackSelection instances.
- + RangedUri
Defines a range of data located at a reference uri.
- + Rating
A rating for media content.
- + RawCcExtractor
Extracts data from the RawCC container format.
- + RawResourceDataSource
A DataSource for reading a raw resource inside the APK.
- + RawResourceDataSource.RawResourceDataSourceException
Thrown when an IOException is encountered reading from a raw resource.
- + Renderer
Renders media read from a SampleStream.
- + Renderer.State
The renderer states.
- + Renderer.VideoScalingMode Deprecated. - + Renderer.WakeupListener
Some renderers can signal when Renderer.render(long, long) should be called.
- + RendererCapabilities
Defines the capabilities of a Renderer.
- + RendererCapabilities.AdaptiveSupport
Level of renderer support for adaptive format switches.
- + RendererCapabilities.Capabilities
Combined renderer capabilities.
- + RendererCapabilities.FormatSupport Deprecated.
Use C.FormatSupport instead.
- + RendererCapabilities.TunnelingSupport
Level of renderer support for tunneling.
- + RendererConfiguration
The configuration of a Renderer.
- + RenderersFactory
Builds Renderer instances for use by a SimpleExoPlayer.
- + RepeatModeActionProvider
Provides a custom action for toggling repeat modes.
- + RepeatModeUtil
Util class for repeat mode handling.
- + RepeatModeUtil.RepeatToggleModes
Set of repeat toggle modes.
- + Representation
A DASH representation.
- + Representation.MultiSegmentRepresentation
A DASH representation consisting of multiple segments.
- + Representation.SingleSegmentRepresentation
A DASH representation consisting of a single segment.
- + Requirements
Defines a set of device state requirements.
- + Requirements.RequirementFlags
Requirement flags.
- + RequirementsWatcher
Watches whether the Requirements are met and notifies the RequirementsWatcher.Listener on changes.
- + RequirementsWatcher.Listener
Notified when RequirementsWatcher instance first created and on changes whether the Requirements are met.
- + ResolvingDataSource
DataSource wrapper allowing just-in-time resolution of DataSpecs.
- + ResolvingDataSource.Factory - + ResolvingDataSource.Resolver
Resolves DataSpecs.
- + ReusableBufferedOutputStream
This is a subclass of BufferedOutputStream with a ReusableBufferedOutputStream.reset(OutputStream) method that allows an instance to be re-used with another underlying output stream.
- + RobolectricUtil
Utility methods for Robolectric-based tests.
- + RtmpDataSource
A Real-Time Messaging Protocol (RTMP) DataSource.
- + RtmpDataSourceFactory - + RtpAc3Reader
Parses an AC3 byte stream carried on RTP packets, and extracts AC3 frames.
- + RtpPacket
Represents the header and the payload of an RTP packet.
- + RtpPacket.Builder
Builder class for an RtpPacket
- + RtpPayloadFormat
Represents the payload format used in RTP.
- + RtpPayloadReader
Extracts media samples from the payload of received RTP packets.
- + RtpPayloadReader.Factory
Factory of RtpPayloadReader instances.
- + RtpUtils
Utility methods for RTP.
- + RtspMediaSource
An Rtsp MediaSource
- + RtspMediaSource.Factory
Factory for RtspMediaSource
- + RtspMediaSource.RtspPlaybackException
Thrown when an exception or error is encountered during loading an RTSP stream.
- + RubySpan
A styling span for ruby text.
- + RunnableFutureTask<R,​E extends Exception>
A RunnableFuture that supports additional uninterruptible operations to query whether execution has started and finished.
- + SampleQueue
A queue of media samples.
- + SampleQueue.UpstreamFormatChangedListener
A listener for changes to the upstream format.
- + SampleQueueMappingException
Thrown when it is not possible to map a TrackGroup to a SampleQueue.
- + SampleStream
A stream of media samples (and associated format information).
- + SampleStream.ReadDataResult - + SampleStream.ReadFlags - + Scheduler
Schedules a service to be started in the foreground when some Requirements are met.
- + SectionPayloadReader
Reads section data.
- + SectionReader
Reads section data packets and feeds the whole sections to a given SectionPayloadReader.
- + SeekMap
Maps seek positions (in microseconds) to corresponding positions (byte offsets) in the stream.
- + SeekMap.SeekPoints
Contains one or two SeekPoints.
- + SeekMap.Unseekable
A SeekMap that does not support seeking.
- + SeekParameters
Parameters that apply to seeking.
- + SeekPoint
Defines a seek point in a media stream.
- + SegmentBase
An approximate representation of a SegmentBase manifest element.
- + SegmentBase.MultiSegmentBase
A SegmentBase that consists of multiple segments.
- + SegmentBase.SegmentList
A SegmentBase.MultiSegmentBase that uses a SegmentList to define its segments.
- + SegmentBase.SegmentTemplate
A SegmentBase.MultiSegmentBase that uses a SegmentTemplate to define its segments.
- + SegmentBase.SegmentTimelineElement
Represents a timeline segment from the MPD's SegmentTimeline list.
- + SegmentBase.SingleSegmentBase
A SegmentBase that defines a single segment.
- + SegmentDownloader<M extends FilterableManifest<M>>
Base class for multi segment stream downloaders.
- + SegmentDownloader.Segment
Smallest unit of content to be downloaded.
- + SeiReader
Consumes SEI buffers, outputting contained CEA-608/708 messages to a TrackOutput.
- + SequenceableLoader
A loader that can proceed in approximate synchronization with other loaders.
- + SequenceableLoader.Callback<T extends SequenceableLoader>
A callback to be notified of SequenceableLoader events.
- + ServiceDescriptionElement
Represents a service description element.
- + SessionAvailabilityListener
Listener of changes in the cast session availability.
- + SessionCallbackBuilder
Builds a MediaSession.SessionCallback with various collaborators.
- + SessionCallbackBuilder.AllowedCommandProvider
Provides allowed commands for MediaController.
- + SessionCallbackBuilder.CustomCommandProvider
Callbacks for querying what custom commands are supported, and for handling a custom command when a controller sends it.
- + SessionCallbackBuilder.DefaultAllowedCommandProvider
Default implementation of SessionCallbackBuilder.AllowedCommandProvider that behaves as follows: @@ -5725,713 +5737,713 @@

All Classes

Controller is in the same package as the session.
- + SessionCallbackBuilder.DisconnectedCallback
Callback for handling controller disconnection.
- + SessionCallbackBuilder.MediaIdMediaItemProvider
A SessionCallbackBuilder.MediaItemProvider that creates media items containing only a media ID.
- + SessionCallbackBuilder.MediaItemProvider
Provides the MediaItem.
- + SessionCallbackBuilder.PostConnectCallback
Callback for handling extra initialization after the connection.
- + SessionCallbackBuilder.RatingCallback
Callback receiving a user rating for a specified media id.
- + SessionCallbackBuilder.SkipCallback
Callback receiving skip backward and skip forward.
- + SessionPlayerConnector
An implementation of SessionPlayer that wraps a given ExoPlayer Player instance.
- + ShadowMediaCodecConfig
A JUnit @Rule to configure Roboelectric's ShadowMediaCodec.
- + ShuffleOrder
Shuffled order of indices.
- + ShuffleOrder.DefaultShuffleOrder
The default ShuffleOrder implementation for random shuffle order.
- + ShuffleOrder.UnshuffledShuffleOrder
A ShuffleOrder implementation which does not shuffle.
- + SilenceMediaSource
Media source with a single period consisting of silent raw audio of a given duration.
- + SilenceMediaSource.Factory
Factory for SilenceMediaSources.
- + SilenceSkippingAudioProcessor
An AudioProcessor that skips silence in the input stream.
- + SimpleCache
A Cache implementation that maintains an in-memory representation.
- + SimpleDecoder<I extends DecoderInputBuffer,​O extends OutputBuffer,​E extends DecoderException>
Base class for Decoders that use their own decode thread and decode each input buffer immediately into a corresponding output buffer.
- + SimpleExoPlayer
An ExoPlayer implementation that uses default Renderer components.
- + SimpleExoPlayer.Builder
A builder for SimpleExoPlayer instances.
- + SimpleMetadataDecoder
A MetadataDecoder base class that validates input buffers and discards any for which Buffer.isDecodeOnly() is true.
- + SimpleOutputBuffer
Buffer for SimpleDecoder output.
- + SimpleSubtitleDecoder
Base class for subtitle parsers that use their own decode thread.
- + SinglePeriodAdTimeline
A Timeline for sources that have ads.
- + SinglePeriodTimeline
A Timeline consisting of a single period and static window.
- + SingleSampleMediaChunk
A BaseMediaChunk for chunks consisting of a single raw sample.
- + SingleSampleMediaSource
Loads data at a given Uri as a single sample belonging to a single MediaPeriod.
- + SingleSampleMediaSource.Factory - + SlidingPercentile
Calculate any percentile over a sliding window of weighted values.
- + SlowMotionData
Holds information about the segments of slow motion playback within a track.
- + SlowMotionData.Segment
Holds information about a single segment of slow motion playback within a track.
- + SmtaMetadataEntry
Stores metadata from the Samsung smta box.
- + SntpClient
Static utility to retrieve the device time offset using SNTP.
- + SntpClient.InitializationCallback - + SonicAudioProcessor
An AudioProcessor that uses the Sonic library to modify audio speed/pitch/sample rate.
- + SpannedSubject
A Truth Subject for assertions on Spanned instances containing text styling.
- + SpannedSubject.AbsoluteSized
Allows assertions about the absolute size of a span.
- + SpannedSubject.Aligned
Allows assertions about the alignment of a span.
- + SpannedSubject.AndSpanFlags
Allows additional assertions to be made on the flags of matching spans.
- + SpannedSubject.Colored
Allows assertions about the color of a span.
- + SpannedSubject.EmphasizedText
Allows assertions about a span's text emphasis mark and its position.
- + SpannedSubject.RelativeSized
Allows assertions about the relative size of a span.
- + SpannedSubject.RubyText
Allows assertions about a span's ruby text and its position.
- + SpannedSubject.Typefaced
Allows assertions about the typeface of a span.
- + SpannedSubject.WithSpanFlags
Allows additional assertions to be made on the flags of matching spans.
- + SpanUtil
Utility methods for Android span styling.
- + SphericalGLSurfaceView
Renders a GL scene in a non-VR Activity that is affected by phone orientation and touch input.
- + SphericalGLSurfaceView.VideoSurfaceListener
Listener for the Surface to which video frames should be rendered.
- + SpliceCommand
Superclass for SCTE35 splice commands.
- + SpliceInfoDecoder
Decodes splice info sections and produces splice commands.
- + SpliceInsertCommand
Represents a splice insert command defined in SCTE35, Section 9.3.3.
- + SpliceInsertCommand.ComponentSplice
Holds splicing information for specific splice insert command components.
- + SpliceNullCommand
Represents a splice null command as defined in SCTE35, Section 9.3.1.
- + SpliceScheduleCommand
Represents a splice schedule command as defined in SCTE35, Section 9.3.2.
- + SpliceScheduleCommand.ComponentSplice
Holds splicing information for specific splice schedule command components.
- + SpliceScheduleCommand.Event
Represents a splice event as contained in a SpliceScheduleCommand.
- + SsaDecoder
A SimpleSubtitleDecoder for SSA/ASS.
- + SsChunkSource
A ChunkSource for SmoothStreaming.
- + SsChunkSource.Factory
Factory for SsChunkSources.
- + SsDownloader
A downloader for SmoothStreaming streams.
- + SsManifest
Represents a SmoothStreaming manifest.
- + SsManifest.ProtectionElement
Represents a protection element containing a single header.
- + SsManifest.StreamElement
Represents a StreamIndex element.
- + SsManifestParser
Parses SmoothStreaming client manifests.
- + SsManifestParser.MissingFieldException
Thrown if a required field is missing.
- + SsMediaSource
A SmoothStreaming MediaSource.
- + SsMediaSource.Factory
Factory for SsMediaSource.
- + StandaloneMediaClock
A MediaClock whose position advances with real time based on the playback parameters when started.
- + StarRating
A rating expressed as a fractional number of stars.
- + StartOffsetExtractorOutput
An extractor output that wraps another extractor output and applies a give start byte offset to seek positions.
- + StatsDataSource
DataSource wrapper which keeps track of bytes transferred, redirected uris, and response headers.
- + StreamKey
A key for a subset of media which can be separately loaded (a "stream").
- + StubExoPlayer
An abstract ExoPlayer implementation that throws UnsupportedOperationException from every method.
- + StyledPlayerControlView
A view for controlling Player instances.
- + StyledPlayerControlView.OnFullScreenModeChangedListener
Listener to be invoked to inform the fullscreen mode is changed.
- + StyledPlayerControlView.ProgressUpdateListener
Listener to be notified when progress has been updated.
- + StyledPlayerControlView.VisibilityListener
Listener to be notified about changes of the visibility of the UI control.
- + StyledPlayerView
A high level view for Player media playbacks.
- + StyledPlayerView.ShowBuffering
Determines when the buffering view is shown.
- + SubripDecoder
A SimpleSubtitleDecoder for SubRip.
- + Subtitle
A subtitle consisting of timed Cues.
- + SubtitleDecoder - + SubtitleDecoderException
Thrown when an error occurs decoding subtitle data.
- + SubtitleDecoderFactory
A factory for SubtitleDecoder instances.
- + SubtitleInputBuffer - + SubtitleOutputBuffer
Base class for SubtitleDecoder output buffers.
- + SubtitleView
A view for displaying subtitle Cues.
- + SubtitleView.ViewType
The type of View to use to display subtitles.
- + SynchronousMediaCodecAdapter
A MediaCodecAdapter that operates the underlying MediaCodec in synchronous mode.
- + SynchronousMediaCodecAdapter.Factory
A factory for SynchronousMediaCodecAdapter instances.
- + SystemClock
The standard implementation of Clock, an instance of which is available via Clock.DEFAULT.
- + TeeAudioProcessor
Audio processor that outputs its input unmodified and also outputs its input to a given sink.
- + TeeAudioProcessor.AudioBufferSink
A sink for audio buffers handled by the audio processor.
- + TeeAudioProcessor.WavFileAudioBufferSink
A sink for audio buffers that writes output audio as .wav files with a given path prefix.
- + TeeDataSource
Tees data into a DataSink as the data is read.
- + TestDownloadManagerListener
Allows tests to block for, and assert properties of, calls from a DownloadManager to its DownloadManager.Listener.
- + TestExoPlayerBuilder
A builder of SimpleExoPlayer instances for testing.
- + TestPlayerRunHelper
Helper methods to block the calling thread until the provided SimpleExoPlayer instance reaches a particular state.
- + TestUtil
Utility methods for tests.
- + TextAnnotation
Properties of a text annotation (i.e.
- + TextAnnotation.Position
The possible positions of the annotation text relative to the base text.
- + TextEmphasisSpan
A styling span for text emphasis marks.
- + TextEmphasisSpan.MarkFill
The possible mark fills that can be used.
- + TextEmphasisSpan.MarkShape
The possible mark shapes that can be used.
- + TextInformationFrame
Text information ID3 frame.
- + TextOutput
Receives text output.
- + TextRenderer
A renderer for text.
- + ThumbRating
A rating expressed as "thumbs up" or "thumbs down".
- + TimeBar
Interface for time bar views that can display a playback position, buffered position, duration and ad markers, and that have a listener for scrubbing (seeking) events.
- + TimeBar.OnScrubListener
Listener for scrubbing events.
- + TimedValueQueue<V>
A utility class to keep a queue of values with timestamps.
- + Timeline
A flexible representation of the structure of media.
- + Timeline.Period
Holds information about a period in a Timeline.
- + Timeline.Window
Holds information about a window in a Timeline.
- + TimelineAsserts
Assertion methods for Timeline.
- + TimelineQueueEditor - + TimelineQueueEditor.MediaDescriptionConverter
Converts a MediaDescriptionCompat to a MediaItem.
- + TimelineQueueEditor.MediaIdEqualityChecker
Media description comparator comparing the media IDs.
- + TimelineQueueEditor.QueueDataAdapter
Adapter to get MediaDescriptionCompat of items in the queue and to notify the @@ -6439,575 +6451,575 @@

All Classes

MediaSessionConnector.
- + TimelineQueueNavigator
An abstract implementation of the MediaSessionConnector.QueueNavigator that maps the windows of a Player's Timeline to the media session queue.
- + TimeSignalCommand
Represents a time signal command as defined in SCTE35, Section 9.3.4.
- + TimestampAdjuster
Offsets timestamps according to an initial sample timestamp offset.
- + TimestampAdjusterProvider
Provides TimestampAdjuster instances for use during HLS playbacks.
- + TimeToFirstByteEstimator
Provides an estimate of the time to first byte of a transfer.
- + TraceUtil
Calls through to Trace methods on supported API levels.
- + Track
Encapsulates information describing an MP4 track.
- + Track.Transformation
The transformation to apply to samples in the track, if any.
- + TrackEncryptionBox
Encapsulates information parsed from a track encryption (tenc) box or sample group description (sgpd) box in an MP4 stream.
- + TrackGroup
Defines an immutable group of tracks identified by their format identity.
- + TrackGroupArray
An immutable array of TrackGroups.
- + TrackNameProvider
Converts Formats to user readable track names.
- + TrackOutput
Receives track level data extracted by an Extractor.
- + TrackOutput.CryptoData
Holds data required to decrypt a sample.
- + TrackOutput.SampleDataPart
Defines the part of the sample data to which a call to TrackOutput.sampleData(com.google.android.exoplayer2.upstream.DataReader, int, boolean) corresponds.
- + TrackSelection
A track selection consisting of a static subset of selected tracks belonging to a TrackGroup.
- + TrackSelectionArray
An array of TrackSelections.
- + TrackSelectionDialogBuilder
Builder for a dialog with a TrackSelectionView.
- + TrackSelectionDialogBuilder.DialogCallback
Callback which is invoked when a track selection has been made.
- + TrackSelectionParameters
Constraint parameters for track selection.
- + TrackSelectionParameters.Builder - + TrackSelectionUtil
Track selection related utility methods.
- + TrackSelectionUtil.AdaptiveTrackSelectionFactory
Functional interface to create a single adaptive track selection.
- + TrackSelectionView
A view for making track selections.
- + TrackSelectionView.TrackSelectionListener
Listener for changes to the selected tracks.
- + TrackSelector
The component of an ExoPlayer responsible for selecting tracks to be consumed by each of the player's Renderers.
- + TrackSelector.InvalidationListener
Notified when selections previously made by a TrackSelector are no longer valid.
- + TrackSelectorResult
The result of a TrackSelector operation.
- + TransferListener
A listener of data transfer events.
- + Transformer
A transformer to transform media inputs.
- + Transformer.Builder
A builder for Transformer instances.
- + Transformer.Listener
A listener for the transformation events.
- + Transformer.ProgressState
Progress state.
- + TsExtractor
Extracts data from the MPEG-2 TS container format.
- + TsExtractor.Mode
Modes for the extractor.
- + TsPayloadReader
Parses TS packet payload data.
- + TsPayloadReader.DvbSubtitleInfo
Holds information about a DVB subtitle, as defined in ETSI EN 300 468 V1.11.1 section 6.2.41.
- + TsPayloadReader.EsInfo
Holds information associated with a PMT entry.
- + TsPayloadReader.Factory
Factory of TsPayloadReader instances.
- + TsPayloadReader.Flags
Contextual flags indicating the presence of indicators in the TS packet or PES packet headers.
- + TsPayloadReader.TrackIdGenerator
Generates track ids for initializing TsPayloadReaders' TrackOutputs.
- + TsUtil
Utilities method for extracting MPEG-TS streams.
- + TtmlDecoder
A SimpleSubtitleDecoder for TTML supporting the DFXP presentation profile.
- + Tx3gDecoder - + UdpDataSource
A UDP DataSource.
- + UdpDataSource.UdpDataSourceException
Thrown when an error is encountered when trying to read from a UdpDataSource.
- + UnknownNull
Annotation for specifying unknown nullness.
- + UnrecognizedInputFormatException
Thrown if the input format was not recognized.
- + UnsupportedDrmException
Thrown when the requested DRM scheme is not supported.
- + UnsupportedDrmException.Reason
The reason for the exception.
- + UnsupportedMediaCrypto
ExoMediaCrypto type that cannot be used to handle any type of protected content.
- + UriUtil
Utility methods for manipulating URIs.
- + UrlLinkFrame
Url link ID3 frame.
- + UrlTemplate
A template from which URLs can be built.
- + UtcTimingElement
Represents a UTCTiming element.
- + Util
Miscellaneous utility methods.
- + VersionTable
Utility methods for accessing versions of ExoPlayer database components.
- + VideoDecoderGLSurfaceView
GLSurfaceView implementing VideoDecoderOutputBufferRenderer for rendering VideoDecoderOutputBuffers.
- + VideoDecoderInputBuffer
Input buffer to a video decoder.
- + VideoDecoderOutputBuffer
Video decoder output buffer containing video frame data.
- + VideoDecoderOutputBufferRenderer - + VideoFrameMetadataListener
A listener for metadata corresponding to video frames being rendered.
- + VideoFrameReleaseHelper
Helps a video Renderer release frames to a Surface.
- + VideoListener Deprecated. - + VideoRendererEventListener
Listener of video Renderer events.
- + VideoRendererEventListener.EventDispatcher
Dispatches events to a VideoRendererEventListener.
- + VideoSize
Represents the video size.
- + VorbisBitArray
Wraps a byte array, providing methods that allow it to be read as a Vorbis bitstream.
- + VorbisComment
A vorbis comment.
- + VorbisUtil
Utility methods for parsing Vorbis streams.
- + VorbisUtil.CommentHeader
Vorbis comment header.
- + VorbisUtil.Mode
Vorbis setup header modes.
- + VorbisUtil.VorbisIdHeader
Vorbis identification header.
- + VpxDecoder
Vpx decoder.
- + VpxDecoderException
Thrown when a libvpx decoder error occurs.
- + VpxLibrary
Configures and queries the underlying native library.
- + VpxOutputBuffer Deprecated. - + WavExtractor
Extracts data from WAV byte streams.
- + WavUtil
Utilities for handling WAVE files.
- + WebServerDispatcher
A Dispatcher for MockWebServer that allows per-path customisation of the static data served.
- + WebServerDispatcher.Resource
A resource served by WebServerDispatcher.
- + WebServerDispatcher.Resource.Builder - + WebvttCssStyle
Style object of a Css style block in a Webvtt file.
- + WebvttCssStyle.FontSizeUnit
Font size unit enum.
- + WebvttCssStyle.StyleFlags
Style flag enum.
- + WebvttCueInfo
A representation of a WebVTT cue.
- + WebvttCueParser
Parser for WebVTT cues.
- + WebvttDecoder
A SimpleSubtitleDecoder for WebVTT.
- + WebvttExtractor
A special purpose extractor for WebVTT content in HLS.
- + WebvttParserUtil
Utility methods for parsing WebVTT data.
- + WidevineUtil
Utility methods for Widevine.
- + WorkManagerScheduler
A Scheduler that uses WorkManager.
- + WorkManagerScheduler.SchedulerWorker
A Worker that starts the target service if the requirements are met.
- + WritableDownloadIndex
A writable index of Downloads.
- + XmlPullParserUtil
XmlPullParser utility methods.
diff --git a/docs/doc/reference/allclasses-noframe.html b/docs/doc/reference/allclasses-noframe.html deleted file mode 100644 index 7e732cb7c62..00000000000 --- a/docs/doc/reference/allclasses-noframe.html +++ /dev/null @@ -1,1126 +0,0 @@ - - - - -All Classes (ExoPlayer library) - - - - - - - - - - - -

All Classes

-
- -
- - diff --git a/docs/doc/reference/allclasses.html b/docs/doc/reference/allclasses.html index 841882f3635..b5bc931fd66 100644 --- a/docs/doc/reference/allclasses.html +++ b/docs/doc/reference/allclasses.html @@ -482,6 +482,7 @@

All Classes

  • ExtractorInput
  • ExtractorOutput
  • ExtractorsFactory
  • +
  • ExtractorUtil
  • FailOnCloseDataSink
  • FailOnCloseDataSink.Factory
  • FakeAdaptiveDataSet
  • @@ -499,6 +500,7 @@

    All Classes

  • FakeDataSource
  • FakeDataSource.Factory
  • FakeExoMediaDrm
  • +
  • FakeExoMediaDrm.Builder
  • FakeExoMediaDrm.LicenseServer
  • FakeExtractorInput
  • FakeExtractorInput.Builder
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/BasePlayer.html b/docs/doc/reference/com/google/android/exoplayer2/BasePlayer.html index 6e99e050b17..5160d682368 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/BasePlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/BasePlayer.html @@ -793,7 +793,7 @@

    isCommandAvailable

    Returns:
    Whether the Player.Command is available.
    See Also:
    -
    Player.EventListener.onAvailableCommandsChanged(Commands)
    +
    Player.Listener.onAvailableCommandsChanged(Commands)
    @@ -869,7 +869,7 @@

    isPlaying

    Returns:
    Whether the player is playing.
    See Also:
    -
    Player.EventListener.onIsPlayingChanged(boolean)
    +
    Player.Listener.onIsPlayingChanged(boolean)
    @@ -1127,7 +1127,7 @@

    getCurrentMediaItem

    Specified by:
    getCurrentMediaItem in interface Player
    See Also:
    -
    Player.EventListener.onMediaItemTransition(MediaItem, int)
    +
    Player.Listener.onMediaItemTransition(MediaItem, int)
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/C.html b/docs/doc/reference/com/google/android/exoplayer2/C.html index 8f469025090..040d5846173 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/C.html +++ b/docs/doc/reference/com/google/android/exoplayer2/C.html @@ -4718,7 +4718,8 @@

    msToUs

    Parameters:
    releaseTimeoutMs - The release timeout, in milliseconds.
    @@ -614,7 +614,7 @@

    setPauseAtEndOfMediaItems

    Deprecated.
    Sets whether to pause playback at the end of each media item. -

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.EventListener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    +

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    Parameters:
    pauseAtEndOfMediaItems - Whether to pause playback at the end of each media item.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html index 1117bc1ad29..a0e7a8c2bf0 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.VideoComponent.html @@ -484,7 +484,10 @@

    setVideoSurfaceHolder

    void setVideoSurfaceHolder​(@Nullable
                                SurfaceHolder surfaceHolder)
    Sets the SurfaceHolder that holds the Surface onto which video will be - rendered. The player will track the lifecycle of the surface automatically.
    + rendered. The player will track the lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

    Parameters:
    surfaceHolder - The surface holder.
    @@ -516,7 +519,10 @@

    setVideoSurfaceView

    void setVideoSurfaceView​(@Nullable
                              SurfaceView surfaceView)
    Sets the SurfaceView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

    Parameters:
    surfaceView - The surface view.
    @@ -548,7 +554,10 @@

    setVideoTextureView

    void setVideoTextureView​(@Nullable
                              TextureView textureView)
    Sets the TextureView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the TextureView.SurfaceTextureListener methods must be the + thread associated with Player.getApplicationLooper().

    Parameters:
    textureView - The texture view.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html index 868137b62a9..27f9e8c34fa 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayer.html @@ -1085,7 +1085,7 @@

    setPauseAtEndOfMediaItems

    void setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    Sets whether to pause playback at the end of each media item. -

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.EventListener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    +

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    Parameters:
    pauseAtEndOfMediaItems - Whether to pause playback at the end of each media item.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayerFactory.html b/docs/doc/reference/com/google/android/exoplayer2/ExoPlayerFactory.html deleted file mode 100644 index 5f229b69e91..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ExoPlayerFactory.html +++ /dev/null @@ -1,710 +0,0 @@ - - - - -ExoPlayerFactory (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - - -
    - -

    Class ExoPlayerFactory

    -
    -
    - -
    - -
    -
    - -
    -
    - -
    -
    - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/PercentageRating.html b/docs/doc/reference/com/google/android/exoplayer2/PercentageRating.html index 8c81770b557..20dc7225965 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/PercentageRating.html +++ b/docs/doc/reference/com/google/android/exoplayer2/PercentageRating.html @@ -330,7 +330,8 @@

    PercentageRating

    + + + + + + + +
      +
    • +

      onStaticMetadataChanged

      +
      default void onStaticMetadataChanged​(List<Metadata> metadataList)
      +
      Description copied from interface: Player.EventListener
      +
      Called when the static metadata changes. + +

      The provided metadataList is an immutable list of Metadata instances, + where the elements correspond to the current track + selections, or an empty list if there are no track selections or the selected tracks contain + no static metadata. + +

      The metadata is considered static in the sense that it comes from the tracks' declared + Formats, rather than being timed (or dynamic) metadata, which is represented within a + metadata track. + +

      Player.EventListener.onEvents(Player, Events) will also be called to report this event along with + other events that happen in the same Looper message queue iteration.

      +
      +
      Specified by:
      +
      onStaticMetadataChanged in interface Player.EventListener
      +
      Parameters:
      +
      metadataList - The static metadata.
      +
      +
    • +
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.MetadataComponent.html b/docs/doc/reference/com/google/android/exoplayer2/Player.MetadataComponent.html deleted file mode 100644 index 0bad3885118..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.MetadataComponent.html +++ /dev/null @@ -1,283 +0,0 @@ - - - - -Player.MetadataComponent (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - - -
    - -

    Interface Player.MetadataComponent

    -
    -
    -
    -
      -
    • -
      -
      All Known Implementing Classes:
      -
      SimpleExoPlayer
      -
      -
      -
      Enclosing interface:
      -
      Player
      -
      -
      -
      public static interface Player.MetadataComponent
      -
      The metadata component of a Player.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          addMetadataOutput

          -
          void addMetadataOutput​(MetadataOutput output)
          -
          Adds a MetadataOutput to receive metadata.
          -
          -
          Parameters:
          -
          output - The output to register.
          -
          -
        • -
        - - - -
          -
        • -

          removeMetadataOutput

          -
          void removeMetadataOutput​(MetadataOutput output)
          -
          Removes a MetadataOutput.
          -
          -
          Parameters:
          -
          output - The output to remove.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.TextComponent.html b/docs/doc/reference/com/google/android/exoplayer2/Player.TextComponent.html deleted file mode 100644 index 7c20c2233a7..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.TextComponent.html +++ /dev/null @@ -1,300 +0,0 @@ - - - - -Player.TextComponent (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - - -
    - -

    Interface Player.TextComponent

    -
    -
    -
    -
      -
    • -
      -
      All Known Implementing Classes:
      -
      SimpleExoPlayer
      -
      -
      -
      Enclosing interface:
      -
      Player
      -
      -
      -
      public static interface Player.TextComponent
      -
      The text component of a Player.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          addTextOutput

          -
          void addTextOutput​(TextOutput listener)
          -
          Registers an output to receive text events.
          -
          -
          Parameters:
          -
          listener - The output to register.
          -
          -
        • -
        - - - -
          -
        • -

          removeTextOutput

          -
          void removeTextOutput​(TextOutput listener)
          -
          Removes a text output.
          -
          -
          Parameters:
          -
          listener - The output to remove.
          -
          -
        • -
        - - - -
          -
        • -

          getCurrentCues

          -
          List<Cue> getCurrentCues()
          -
          Returns the current Cues. This list may be empty.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.VideoComponent.html b/docs/doc/reference/com/google/android/exoplayer2/Player.VideoComponent.html deleted file mode 100644 index 566f2255e42..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.VideoComponent.html +++ /dev/null @@ -1,625 +0,0 @@ - - - - -Player.VideoComponent (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - - -
    - -

    Interface Player.VideoComponent

    -
    -
    -
    -
      -
    • -
      -
      All Known Implementing Classes:
      -
      SimpleExoPlayer
      -
      -
      -
      Enclosing interface:
      -
      Player
      -
      -
      -
      public static interface Player.VideoComponent
      -
      The video component of a Player.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Method Detail

        - - - - - - - - - - - -
          -
        • -

          addVideoListener

          -
          void addVideoListener​(VideoListener listener)
          -
          Adds a listener to receive video events.
          -
          -
          Parameters:
          -
          listener - The listener to register.
          -
          -
        • -
        - - - -
          -
        • -

          removeVideoListener

          -
          void removeVideoListener​(VideoListener listener)
          -
          Removes a listener of video events.
          -
          -
          Parameters:
          -
          listener - The listener to unregister.
          -
          -
        • -
        - - - -
          -
        • -

          setVideoFrameMetadataListener

          -
          void setVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
          -
          Sets a listener to receive video frame metadata events. - -

          This method is intended to be called by the same component that sets the Surface - onto which video will be rendered. If using ExoPlayer's standard UI components, this method - should not be called directly from application code.

          -
          -
          Parameters:
          -
          listener - The listener.
          -
          -
        • -
        - - - -
          -
        • -

          clearVideoFrameMetadataListener

          -
          void clearVideoFrameMetadataListener​(VideoFrameMetadataListener listener)
          -
          Clears the listener which receives video frame metadata events if it matches the one passed. - Else does nothing.
          -
          -
          Parameters:
          -
          listener - The listener to clear.
          -
          -
        • -
        - - - -
          -
        • -

          setCameraMotionListener

          -
          void setCameraMotionListener​(CameraMotionListener listener)
          -
          Sets a listener of camera motion events.
          -
          -
          Parameters:
          -
          listener - The listener.
          -
          -
        • -
        - - - -
          -
        • -

          clearCameraMotionListener

          -
          void clearCameraMotionListener​(CameraMotionListener listener)
          -
          Clears the listener which receives camera motion events if it matches the one passed. Else - does nothing.
          -
          -
          Parameters:
          -
          listener - The listener to clear.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          clearVideoSurface

          -
          void clearVideoSurface​(@Nullable
          -                       Surface surface)
          -
          Clears the Surface onto which video is being rendered if it matches the one passed. - Else does nothing.
          -
          -
          Parameters:
          -
          surface - The surface to clear.
          -
          -
        • -
        - - - - - - - -
          -
        • -

          setVideoSurfaceHolder

          -
          void setVideoSurfaceHolder​(@Nullable
          -                           SurfaceHolder surfaceHolder)
          -
          Sets the SurfaceHolder that holds the Surface onto which video will be - rendered. The player will track the lifecycle of the surface automatically.
          -
          -
          Parameters:
          -
          surfaceHolder - The surface holder.
          -
          -
        • -
        - - - -
          -
        • -

          clearVideoSurfaceHolder

          -
          void clearVideoSurfaceHolder​(@Nullable
          -                             SurfaceHolder surfaceHolder)
          -
          Clears the SurfaceHolder that holds the Surface onto which video is being - rendered if it matches the one passed. Else does nothing.
          -
          -
          Parameters:
          -
          surfaceHolder - The surface holder to clear.
          -
          -
        • -
        - - - -
          -
        • -

          setVideoSurfaceView

          -
          void setVideoSurfaceView​(@Nullable
          -                         SurfaceView surfaceView)
          -
          Sets the SurfaceView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
          -
          -
          Parameters:
          -
          surfaceView - The surface view.
          -
          -
        • -
        - - - -
          -
        • -

          clearVideoSurfaceView

          -
          void clearVideoSurfaceView​(@Nullable
          -                           SurfaceView surfaceView)
          -
          Clears the SurfaceView onto which video is being rendered if it matches the one - passed. Else does nothing.
          -
          -
          Parameters:
          -
          surfaceView - The texture view to clear.
          -
          -
        • -
        - - - -
          -
        • -

          setVideoTextureView

          -
          void setVideoTextureView​(@Nullable
          -                         TextureView textureView)
          -
          Sets the TextureView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
          -
          -
          Parameters:
          -
          textureView - The texture view.
          -
          -
        • -
        - - - -
          -
        • -

          clearVideoTextureView

          -
          void clearVideoTextureView​(@Nullable
          -                           TextureView textureView)
          -
          Clears the TextureView onto which video is being rendered if it matches the one - passed. Else does nothing.
          -
          -
          Parameters:
          -
          textureView - The texture view to clear.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/Player.html b/docs/doc/reference/com/google/android/exoplayer2/Player.html index a455156e995..7f87e5be309 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/Player.html +++ b/docs/doc/reference/com/google/android/exoplayer2/Player.html @@ -193,7 +193,7 @@

    Nested Class Summary

    static interface  Player.EventFlags -
    Events that can be reported via Player.EventListener.onEvents(Player, Events).
    +
    Events that can be reported via Player.Listener.onEvents(Player, Events).
    @@ -2083,7 +2083,7 @@

    EVENT_PLAYER_ERROR

  • EVENT_POSITION_DISCONTINUITY

    static final int EVENT_POSITION_DISCONTINUITY
    -
  • @@ -2812,7 +2812,7 @@

    getAvailableCommands

    Player.Commands getAvailableCommands()
    Returns the player's currently available Player.Commands. -

    The returned Player.Commands are not updated when available commands change. Use Player.EventListener.onAvailableCommandsChanged(Commands) to get an update when the available commands +

    The returned Player.Commands are not updated when available commands change. Use Player.Listener.onAvailableCommandsChanged(Commands) to get an update when the available commands change.

    Executing a command that is not available (for example, calling next() if COMMAND_SEEK_TO_NEXT_MEDIA_ITEM is unavailable) will neither throw an exception nor generate @@ -2824,7 +2824,7 @@

    getAvailableCommands

    Returns:
    The currently available Player.Commands.
    See Also:
    -
    Player.EventListener.onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)
    +
    Player.Listener.onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)
    @@ -2851,7 +2851,7 @@

    getPlaybackState

    Returns:
    The current playback state.
    See Also:
    -
    Player.EventListener.onPlaybackStateChanged(int)
    +
    Player.Listener.onPlaybackStateChanged(int)
    @@ -2869,7 +2869,7 @@

    getPlaybackSuppressionReason

    Returns:
    The current playback suppression reason.
    See Also:
    -
    Player.EventListener.onPlaybackSuppressionReasonChanged(int)
    +
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
    @@ -2893,7 +2893,7 @@

    isPlaying

    Returns:
    Whether the player is playing.
    See Also:
    -
    Player.EventListener.onIsPlayingChanged(boolean)
    +
    Player.Listener.onIsPlayingChanged(boolean)
    @@ -2906,7 +2906,7 @@

    getPlayerError

    @Nullable
     ExoPlaybackException getPlayerError()
    Returns the error that caused playback to fail. This is the same error that will have been - reported via Player.EventListener.onPlayerError(ExoPlaybackException) at the time of failure. It + reported via Player.Listener.onPlayerError(ExoPlaybackException) at the time of failure. It can be queried using this method until the player is re-prepared.

    Note that this method will always return null if getPlaybackState() is not @@ -2915,7 +2915,7 @@

    getPlayerError

    Returns:
    The error, or null.
    See Also:
    -
    Player.EventListener.onPlayerError(ExoPlaybackException)
    +
    Player.Listener.onPlayerError(ExoPlaybackException)
    @@ -2982,7 +2982,7 @@

    getPlayWhenReady

    Returns:
    Whether playback will proceed when ready.
    See Also:
    -
    Player.EventListener.onPlayWhenReadyChanged(boolean, int)
    +
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    @@ -3014,7 +3014,7 @@

    getRepeatMode

    Returns:
    The current repeat mode.
    See Also:
    -
    Player.EventListener.onRepeatModeChanged(int)
    +
    Player.Listener.onRepeatModeChanged(int)
    @@ -3042,7 +3042,7 @@

    getShuffleModeEnabled

    Returns whether shuffling of windows is enabled.
    See Also:
    -
    Player.EventListener.onShuffleModeEnabledChanged(boolean)
    +
    Player.Listener.onShuffleModeEnabledChanged(boolean)
    @@ -3058,7 +3058,7 @@

    isLoading

    Returns:
    Whether the player is currently loading the source.
    See Also:
    -
    Player.EventListener.onIsLoadingChanged(boolean)
    +
    Player.Listener.onIsLoadingChanged(boolean)
    @@ -3200,7 +3200,7 @@

    setPlaybackParameters

    Attempts to set the playback parameters. Passing PlaybackParameters.DEFAULT resets the player to the default, which means there is no speed or pitch adjustment. -

    Playback parameters changes may cause the player to buffer. Player.EventListener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently +

    Playback parameters changes may cause the player to buffer. Player.Listener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently active playback parameters change.

    Parameters:
    @@ -3236,7 +3236,7 @@

    getPlaybackParameters

    Returns the currently active playback parameters.
    See Also:
    -
    Player.EventListener.onPlaybackParametersChanged(PlaybackParameters)
    +
    Player.Listener.onPlaybackParametersChanged(PlaybackParameters)
    @@ -3294,7 +3294,7 @@

    getCurrentTrackGroups

    Returns the available track groups.
    See Also:
    -
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -3312,7 +3312,7 @@

    getCurrentTrackSelections

    components that is not assigned any selected tracks.
    See Also:
    -
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -3334,7 +3334,7 @@

    getCurrentStaticMetadata

    rather than being timed (or dynamic) metadata, which is represented within a metadata track.
    See Also:
    -
    Player.EventListener.onStaticMetadataChanged(List)
    +
    Player.Listener.onStaticMetadataChanged(List)
    @@ -3349,7 +3349,7 @@

    getMediaMetadata

    supported.

    This MediaMetadata is a combination of the MediaItem.mediaMetadata and the - static and dynamic metadata sourced from Player.EventListener.onStaticMetadataChanged(List) and + static and dynamic metadata sourced from Player.Listener.onStaticMetadataChanged(List) and MetadataOutput.onMetadata(Metadata). @@ -3374,7 +3374,7 @@

    getCurrentTimeline

    Returns the current Timeline. Never null, but may be empty.
    See Also:
    -
    Player.EventListener.onTimelineChanged(Timeline, int)
    +
    Player.Listener.onTimelineChanged(Timeline, int)
    @@ -3455,7 +3455,7 @@

    getCurrentMediaItem

    empty.
    See Also:
    -
    Player.EventListener.onMediaItemTransition(MediaItem, int)
    +
    Player.Listener.onMediaItemTransition(MediaItem, int)
    @@ -3759,7 +3759,10 @@

    setVideoSurfaceHolder

    void setVideoSurfaceHolder​(@Nullable
                                SurfaceHolder surfaceHolder)
    Sets the SurfaceHolder that holds the Surface onto which video will be - rendered. The player will track the lifecycle of the surface automatically.
    + rendered. The player will track the lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with getApplicationLooper().

    Parameters:
    surfaceHolder - The surface holder.
    @@ -3791,7 +3794,10 @@

    setVideoSurfaceView

    void setVideoSurfaceView​(@Nullable
                              SurfaceView surfaceView)
    Sets the SurfaceView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with getApplicationLooper().

    Parameters:
    surfaceView - The surface view.
    @@ -3823,7 +3829,10 @@

    setVideoTextureView

    void setVideoTextureView​(@Nullable
                              TextureView textureView)
    Sets the TextureView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the TextureView.SurfaceTextureListener methods must be the + thread associated with getApplicationLooper().

    Parameters:
    textureView - The texture view.
    @@ -3859,7 +3868,7 @@

    getVideoSize

    determined yet.
    See Also:
    -
    VideoListener.onVideoSizeChanged(VideoSize)
    +
    Player.Listener.onVideoSizeChanged(VideoSize)
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/PlayerMessage.html b/docs/doc/reference/com/google/android/exoplayer2/PlayerMessage.html index 95bf9ea93fa..95fc1e25422 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/PlayerMessage.html +++ b/docs/doc/reference/com/google/android/exoplayer2/PlayerMessage.html @@ -648,7 +648,7 @@

    getDeleteAfterDelivery

    send

    public PlayerMessage send()
    Sends the message. If the target throws an ExoPlaybackException then it is propagated - out of the player as an error using Player.EventListener.onPlayerError(ExoPlaybackException).
    + out of the player as an error using Player.Listener.onPlayerError(ExoPlaybackException).
    Returns:
    This message.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html index 8c068713e52..5b04a29d11b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html +++ b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.Builder.html @@ -542,7 +542,7 @@

    Method Detail

    experimentalSetForegroundModeTimeoutMs

    public SimpleExoPlayer.Builder experimentalSetForegroundModeTimeoutMs​(long timeoutMs)
    Set a limit on the time a call to SimpleExoPlayer.setForegroundMode(boolean) can spend. If a call to SimpleExoPlayer.setForegroundMode(boolean) takes more than timeoutMs milliseconds to complete, the player - will raise an error via Player.EventListener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException). + will raise an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException).

    This method is experimental, and will be renamed or removed in a future release.

    @@ -841,7 +841,7 @@

    setReleaseTimeoutMs

    + timeoutMs
    to complete, the player will report an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException).
    Parameters:
    releaseTimeoutMs - The release timeout, in milliseconds.
    @@ -862,7 +862,7 @@

    setDetachSurfaceTimeoutMs

    Sets a timeout for detaching a surface from the player.

    If detaching a surface or replacing a surface takes more than - detachSurfaceTimeoutMs to complete, the player will report an error via Player.EventListener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException).

    + detachSurfaceTimeoutMs to complete, the player will report an error via Player.Listener.onPlayerError(com.google.android.exoplayer2.ExoPlaybackException).
    Parameters:
    detachSurfaceTimeoutMs - The timeout for detaching a surface, in milliseconds.
    @@ -882,7 +882,7 @@

    setPauseAtEndOfMediaItems

    public SimpleExoPlayer.Builder setPauseAtEndOfMediaItems​(boolean pauseAtEndOfMediaItems)
    Sets whether to pause playback at the end of each media item. -

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.EventListener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    +

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    Parameters:
    pauseAtEndOfMediaItems - Whether to pause playback at the end of each media item.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html index e6ebba781a4..27da82f2bf5 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/SimpleExoPlayer.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":42,"i83":42,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":42,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":42,"i106":10,"i107":10,"i108":10,"i109":10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10,"i118":10,"i119":10,"i120":10,"i121":10,"i122":10,"i123":42,"i124":10,"i125":10,"i126":10,"i127":10,"i128":10,"i129":10,"i130":10,"i131":10,"i132":10}; +var data = {"i0":10,"i1":42,"i2":10,"i3":42,"i4":42,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":42,"i12":42,"i13":42,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":42,"i83":42,"i84":10,"i85":10,"i86":42,"i87":10,"i88":42,"i89":42,"i90":10,"i91":10,"i92":42,"i93":42,"i94":42,"i95":42,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":42,"i106":10,"i107":10,"i108":10,"i109":10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10,"i118":10,"i119":10,"i120":10,"i121":10,"i122":10,"i123":42,"i124":10,"i125":10,"i126":10,"i127":10,"i128":10,"i129":10,"i130":10,"i131":10,"i132":42}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -305,7 +305,7 @@

    Method Summary

    void addAudioListener​(AudioListener listener) -
    Adds a listener to receive audio events.
    +
    Deprecated.
    @@ -319,14 +319,14 @@

    Method Summary

    void addDeviceListener​(DeviceListener listener) -
    Adds a listener to receive device events.
    +
    Deprecated.
    void addListener​(Player.EventListener listener) -
    Registers a listener to receive events from the player.
    +
    Deprecated.
    @@ -378,21 +378,21 @@

    Method Summary

    void addMetadataOutput​(MetadataOutput listener) -
    Adds a MetadataOutput to receive metadata.
    +
    Deprecated.
    void addTextOutput​(TextOutput listener) -
    Registers an output to receive text events.
    +
    Deprecated.
    void addVideoListener​(VideoListener listener) -
    Adds a listener to receive video events.
    +
    Deprecated.
    @@ -923,7 +923,7 @@

    Method Summary

    void removeAudioListener​(AudioListener listener) -
    Removes a listener of audio events.
    +
    Deprecated.
    @@ -937,14 +937,14 @@

    Method Summary

    void removeDeviceListener​(DeviceListener listener) -
    Removes a listener of device events.
    +
    Deprecated.
    void removeListener​(Player.EventListener listener) -
    Unregister a listener registered through Player.addListener(EventListener).
    +
    Deprecated.
    @@ -966,21 +966,21 @@

    Method Summary

    void removeMetadataOutput​(MetadataOutput listener) -
    Removes a MetadataOutput.
    +
    Deprecated.
    void removeTextOutput​(TextOutput listener) -
    Removes a text output.
    +
    Deprecated.
    void removeVideoListener​(VideoListener listener) -
    Removes a listener of video events.
    +
    Deprecated.
    @@ -1266,7 +1266,9 @@

    Method Summary

    void stop​(boolean reset) -  + +
    Deprecated.
    +
    @@ -1661,7 +1663,10 @@

    setVideoSurfaceHolder

    SurfaceHolder surfaceHolder)
    Description copied from interface: Player
    Sets the SurfaceHolder that holds the Surface onto which video will be - rendered. The player will track the lifecycle of the surface automatically.
    + rendered. The player will track the lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

    Specified by:
    setVideoSurfaceHolder in interface ExoPlayer.VideoComponent
    @@ -1703,7 +1708,10 @@

    setVideoSurfaceView

    SurfaceView surfaceView)
    Description copied from interface: Player
    Sets the SurfaceView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

    Specified by:
    setVideoSurfaceView in interface ExoPlayer.VideoComponent
    @@ -1745,7 +1753,10 @@

    setVideoTextureView

    TextureView textureView)
    Description copied from interface: Player
    Sets the TextureView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the TextureView.SurfaceTextureListener methods must be the + thread associated with Player.getApplicationLooper().

    Specified by:
    setVideoTextureView in interface ExoPlayer.VideoComponent
    @@ -1817,7 +1828,9 @@

    removeAudioOffloadListener

    @@ -3135,7 +3166,7 @@

    setPlaybackParameters

    Attempts to set the playback parameters. Passing PlaybackParameters.DEFAULT resets the player to the default, which means there is no speed or pitch adjustment. -

    Playback parameters changes may cause the player to buffer. Player.EventListener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently +

    Playback parameters changes may cause the player to buffer. Player.Listener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently active playback parameters change.

    Specified by:
    @@ -3158,7 +3189,7 @@

    getPlaybackParameters

    Specified by:
    getPlaybackParameters in interface Player
    See Also:
    -
    Player.EventListener.onPlaybackParametersChanged(PlaybackParameters)
    +
    Player.Listener.onPlaybackParametersChanged(PlaybackParameters)
    @@ -3241,7 +3272,9 @@

    setForegroundMode

    @@ -3370,7 +3403,7 @@

    getCurrentTrackSelections

    Specified by:
    getCurrentTrackSelections in interface Player
    See Also:
    -
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -3395,7 +3428,7 @@

    getCurrentStaticMetadata

    Specified by:
    getCurrentStaticMetadata in interface Player
    See Also:
    -
    Player.EventListener.onStaticMetadataChanged(List)
    +
    Player.Listener.onStaticMetadataChanged(List)
    @@ -3411,7 +3444,7 @@

    getMediaMetadata

    supported.

    This MediaMetadata is a combination of the MediaItem.mediaMetadata and the - static and dynamic metadata sourced from Player.EventListener.onStaticMetadataChanged(List) and + static and dynamic metadata sourced from Player.Listener.onStaticMetadataChanged(List) and MetadataOutput.onMetadata(Metadata).

    Specified by:
    @@ -3432,7 +3465,7 @@

    getCurrentTimeline

    Specified by:
    getCurrentTimeline in interface Player
    See Also:
    -
    Player.EventListener.onTimelineChanged(Timeline, int)
    +
    Player.Listener.onTimelineChanged(Timeline, int)
    @@ -3665,7 +3698,9 @@

    setWakeMode

    @@ -1297,7 +1297,7 @@

    getPlayWhenReady

    Returns:
    Whether playback will proceed when ready.
    See Also:
    -
    Player.EventListener.onPlayWhenReadyChanged(boolean, int)
    +
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    @@ -1330,7 +1330,7 @@

    setPlaybackParameters

    Attempts to set the playback parameters. Passing PlaybackParameters.DEFAULT resets the player to the default, which means there is no speed or pitch adjustment. -

    Playback parameters changes may cause the player to buffer. Player.EventListener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently +

    Playback parameters changes may cause the player to buffer. Player.Listener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently active playback parameters change.

    Parameters:
    @@ -1349,7 +1349,7 @@

    getPlaybackParameters

    Returns the currently active playback parameters.
    See Also:
    -
    Player.EventListener.onPlaybackParametersChanged(PlaybackParameters)
    +
    Player.Listener.onPlaybackParametersChanged(PlaybackParameters)
    @@ -1404,7 +1404,7 @@

    getRepeatMode

    Returns:
    The current repeat mode.
    See Also:
    -
    Player.EventListener.onRepeatModeChanged(int)
    +
    Player.Listener.onRepeatModeChanged(int)
    @@ -1434,7 +1434,7 @@

    getShuffleModeEnabled

    Returns whether shuffling of windows is enabled.
    See Also:
    -
    Player.EventListener.onShuffleModeEnabledChanged(boolean)
    +
    Player.Listener.onShuffleModeEnabledChanged(boolean)
    @@ -1453,7 +1453,7 @@

    getCurrentTrackSelections

    components that is not assigned any selected tracks.
    See Also:
    -
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -1468,7 +1468,7 @@

    getCurrentTrackGroups

    Returns the available track groups.
    See Also:
    -
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -1491,7 +1491,7 @@

    getCurrentStaticMetadata

    rather than being timed (or dynamic) metadata, which is represented within a metadata track.
    See Also:
    -
    Player.EventListener.onStaticMetadataChanged(List)
    +
    Player.Listener.onStaticMetadataChanged(List)
    @@ -1507,7 +1507,7 @@

    getMediaMetadata

    supported.

    This MediaMetadata is a combination of the MediaItem.mediaMetadata and the - static and dynamic metadata sourced from Player.EventListener.onStaticMetadataChanged(List) and + static and dynamic metadata sourced from Player.Listener.onStaticMetadataChanged(List) and MetadataOutput.onMetadata(Metadata). @@ -1522,7 +1522,7 @@

    getCurrentTimeline

    Returns the current Timeline. Never null, but may be empty.
    See Also:
    -
    Player.EventListener.onTimelineChanged(Timeline, int)
    +
    Player.Listener.onTimelineChanged(Timeline, int)
    @@ -1644,7 +1644,7 @@

    isLoading

    Returns:
    Whether the player is currently loading the source.
    See Also:
    -
    Player.EventListener.onIsLoadingChanged(boolean)
    +
    Player.Listener.onIsLoadingChanged(boolean)
    @@ -1852,7 +1852,7 @@

    getVideoSize

    This method is not supported and returns VideoSize.UNKNOWN.
    See Also:
    -
    VideoListener.onVideoSizeChanged(VideoSize)
    +
    Player.Listener.onVideoSizeChanged(VideoSize)
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cast/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cast/package-frame.html deleted file mode 100644 index 974b81ae75e..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cast/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.cast (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.cast

    - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-frame.html deleted file mode 100644 index 7a427fc16cd..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/cronet/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.cronet (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.cronet

    - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/ffmpeg/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/ffmpeg/package-frame.html deleted file mode 100644 index 310bb3b8834..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/ffmpeg/package-frame.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.ffmpeg (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.ffmpeg

    -
    -

    Classes

    - -

    Exceptions

    - -
    - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/flac/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/flac/package-frame.html deleted file mode 100644 index d39e1b82d77..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/flac/package-frame.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.flac (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.flac

    -
    -

    Classes

    - -

    Exceptions

    - -

    Annotation Types

    - -
    - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/gvr/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/gvr/package-frame.html deleted file mode 100644 index 83763e3e0b5..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/gvr/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.gvr (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.gvr

    -
    -

    Classes

    - -
    - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html index 7a7b2d04ff5..6f62a324888 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.html @@ -342,39 +342,25 @@

    Methods inherited from class java.lang.clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait - - @@ -645,6 +631,8 @@

    onTimelineChanged

    Specified by:
    onTimelineChanged in interface Player.EventListener
    +
    Specified by:
    +
    onTimelineChanged in interface Player.Listener
    Parameters:
    timeline - The latest timeline. Never null, but may be empty.
    reason - The Player.TimelineChangeReason responsible for this timeline change.
    @@ -673,6 +661,8 @@

    onPositionDiscontinuity

    Specified by:
    onPositionDiscontinuity in interface Player.EventListener
    +
    Specified by:
    +
    onPositionDiscontinuity in interface Player.Listener
    Parameters:
    oldPosition - The position before the discontinuity.
    newPosition - The position after the discontinuity.
    @@ -695,6 +685,8 @@

    onShuffleModeEnabledChanged

    Specified by:
    onShuffleModeEnabledChanged in interface Player.EventListener
    +
    Specified by:
    +
    onShuffleModeEnabledChanged in interface Player.Listener
    Parameters:
    shuffleModeEnabled - Whether shuffling of windows is enabled.
    @@ -716,6 +708,8 @@

    onRepeatModeChanged

    Specified by:
    onRepeatModeChanged in interface Player.EventListener
    +
    Specified by:
    +
    onRepeatModeChanged in interface Player.Listener
    Parameters:
    repeatMode - The Player.RepeatMode used for playback.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/ima/package-frame.html deleted file mode 100644 index 19db2d9ee90..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/ima/package-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.ima (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.ima

    - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.JobDispatcherSchedulerService.html b/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.JobDispatcherSchedulerService.html deleted file mode 100644 index a6b1755226d..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.JobDispatcherSchedulerService.html +++ /dev/null @@ -1,428 +0,0 @@ - - - - -JobDispatcherScheduler.JobDispatcherSchedulerService (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - - -
    - -

    Class JobDispatcherScheduler.JobDispatcherSchedulerService

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      ComponentCallbacks, ComponentCallbacks2
      -
      -
      -
      Enclosing class:
      -
      JobDispatcherScheduler
      -
      -
      -
      public static final class JobDispatcherScheduler.JobDispatcherSchedulerService
      -extends com.firebase.jobdispatcher.JobService
      -
      A JobService that starts the target service if the requirements are met.
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          JobDispatcherSchedulerService

          -
          public JobDispatcherSchedulerService()
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          onStartJob

          -
          public boolean onStartJob​(com.firebase.jobdispatcher.JobParameters params)
          -
          -
          Specified by:
          -
          onStartJob in class com.firebase.jobdispatcher.JobService
          -
          -
        • -
        - - - -
          -
        • -

          onStopJob

          -
          public boolean onStopJob​(com.firebase.jobdispatcher.JobParameters params)
          -
          -
          Specified by:
          -
          onStopJob in class com.firebase.jobdispatcher.JobService
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.html b/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.html deleted file mode 100644 index 4484175ff51..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/JobDispatcherScheduler.html +++ /dev/null @@ -1,448 +0,0 @@ - - - - -JobDispatcherScheduler (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - - -
    - -

    Class JobDispatcherScheduler

    -
    -
    -
      -
    • java.lang.Object
    • -
    • -
        -
      • com.google.android.exoplayer2.ext.jobdispatcher.JobDispatcherScheduler
      • -
      -
    • -
    -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Scheduler
      -
      -
      -
      @Deprecated
      -public final class JobDispatcherScheduler
      -extends Object
      -implements Scheduler
      -
      Deprecated. -
      Use com.google.android.exoplayer2.ext.workmanager.WorkManagerScheduler or PlatformScheduler.
      -
      -
      A Scheduler that uses FirebaseJobDispatcher. To use this scheduler, you must add - JobDispatcherScheduler.JobDispatcherSchedulerService to your manifest: - -
      - <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
      - <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
      -
      - <service
      -     android:name="com.google.android.exoplayer2.ext.jobdispatcher.JobDispatcherScheduler$JobDispatcherSchedulerService"
      -     android:exported="false">
      -   <intent-filter>
      -     <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
      -   </intent-filter>
      - </service>
      - 
      - -

      This Scheduler uses Google Play services but does not do any availability checks. Any uses - should be guarded with a call to - GoogleApiAvailability#isGooglePlayServicesAvailable(android.content.Context)

      -
      -
      See Also:
      -
      GoogleApiAvailability
      -
      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          JobDispatcherScheduler

          -
          public JobDispatcherScheduler​(Context context,
          -                              String jobTag)
          -
          Deprecated.
          -
          -
          Parameters:
          -
          context - A context.
          -
          jobTag - A tag for jobs scheduled by this instance. If the same tag was used by a previous - instance, anything scheduled by the previous instance will be canceled by this instance if - schedule(Requirements, String, String) or cancel() are called.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          schedule

          -
          public boolean schedule​(Requirements requirements,
          -                        String servicePackage,
          -                        String serviceAction)
          -
          Deprecated.
          -
          Description copied from interface: Scheduler
          -
          Schedules a service to be started in the foreground when some Requirements are met. - Anything that was previously scheduled will be canceled. - -

          The service to be started must be declared in the manifest of servicePackage with an - intent filter containing serviceAction. Note that when started with - serviceAction, the service must call Service.startForeground(int, Notification) to - make itself a foreground service, as documented by ContextWrapper.startForegroundService(Intent).

          -
          -
          Specified by:
          -
          schedule in interface Scheduler
          -
          Parameters:
          -
          requirements - The requirements.
          -
          servicePackage - The package name.
          -
          serviceAction - The action with which the service will be started.
          -
          Returns:
          -
          Whether scheduling was successful.
          -
          -
        • -
        - - - -
          -
        • -

          cancel

          -
          public boolean cancel()
          -
          Deprecated.
          -
          Description copied from interface: Scheduler
          -
          Cancels anything that was previously scheduled, or else does nothing.
          -
          -
          Specified by:
          -
          cancel in interface Scheduler
          -
          Returns:
          -
          Whether cancellation was successful.
          -
          -
        • -
        - - - -
          -
        • -

          getSupportedRequirements

          -
          public Requirements getSupportedRequirements​(Requirements requirements)
          -
          Deprecated.
          -
          Description copied from interface: Scheduler
          -
          Checks whether this Scheduler supports the provided Requirements. If all of the - requirements are supported then the same Requirements instance is returned. If not then - a new instance is returned containing the subset of the requirements that are supported.
          -
          -
          Specified by:
          -
          getSupportedRequirements in interface Scheduler
          -
          Parameters:
          -
          requirements - The requirements to check.
          -
          Returns:
          -
          The supported requirements.
          -
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-frame.html deleted file mode 100644 index 1841ddf6184..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-frame.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.jobdispatcher (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.jobdispatcher

    - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-summary.html deleted file mode 100644 index db446baf107..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-summary.html +++ /dev/null @@ -1,174 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.jobdispatcher (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - -
    -

    Package com.google.android.exoplayer2.ext.jobdispatcher

    -
    -
    - -
    - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-tree.html deleted file mode 100644 index a02d966bb2d..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/jobdispatcher/package-tree.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.jobdispatcher Class Hierarchy (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - -
    -

    Hierarchy For Package com.google.android.exoplayer2.ext.jobdispatcher

    -Package Hierarchies: - -
    -
    -

    Class Hierarchy

    - -
    - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/leanback/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/ext/leanback/package-frame.html deleted file mode 100644 index 4839b441bda..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/leanback/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -com.google.android.exoplayer2.ext.leanback (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.ext.leanback

    -
    -

    Classes

    - -
    - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html b/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html index cd2828a8789..96a9249368b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html +++ b/docs/doc/reference/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.html @@ -553,7 +553,8 @@

    seekTo

    + +
    + +
      @@ -276,6 +301,30 @@

      Methods inherited from interface com.google.android.exoplayer2.source.<
      • + +
        + +
          @@ -441,13 +490,13 @@

          releasePeriod

          diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/manifest/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/manifest/package-frame.html deleted file mode 100644 index 93968ab2817..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/manifest/package-frame.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - -com.google.android.exoplayer2.source.smoothstreaming.manifest (ExoPlayer library) - - - - - - - - - - - -

          com.google.android.exoplayer2.source.smoothstreaming.manifest

          - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/offline/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/offline/package-frame.html deleted file mode 100644 index 23a987f375a..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/offline/package-frame.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -com.google.android.exoplayer2.source.smoothstreaming.offline (ExoPlayer library) - - - - - - - - - - - -

          com.google.android.exoplayer2.source.smoothstreaming.offline

          -
          -

          Classes

          - -
          - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/package-frame.html deleted file mode 100644 index 22c66e2ecab..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/source/smoothstreaming/package-frame.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - -com.google.android.exoplayer2.source.smoothstreaming (ExoPlayer library) - - - - - - - - - - - -

          com.google.android.exoplayer2.source.smoothstreaming

          - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForIsLoading.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForIsLoading.html index fcf0193672f..e51bcbf0aee 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForIsLoading.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForIsLoading.html @@ -140,7 +140,7 @@

          Class Action.WaitForIsLo
          public static final class Action.WaitForIsLoading
           extends Action
          -
          Waits for a specified loading state, returning either immediately or after a call to Player.EventListener.onIsLoadingChanged(boolean).
          +
          Waits for a specified loading state, returning either immediately or after a call to Player.Listener.onIsLoadingChanged(boolean).

      diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlayWhenReady.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlayWhenReady.html index 981e2b7b76e..0dd5470175c 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlayWhenReady.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlayWhenReady.html @@ -141,7 +141,7 @@

      Class Action.WaitFor
      public static final class Action.WaitForPlayWhenReady
       extends Action
      Waits for a specified playWhenReady value, returning either immediately or after a call to - Player.EventListener.onPlayWhenReadyChanged(boolean, int).
      + Player.Listener.onPlayWhenReadyChanged(boolean, int).

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlaybackState.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlaybackState.html index 1ffb824b981..1cbf6929ced 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlaybackState.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPlaybackState.html @@ -140,7 +140,7 @@

    Class Action.WaitFor
    public static final class Action.WaitForPlaybackState
     extends Action
    -
    Waits for a specified playback state, returning either immediately or after a call to Player.EventListener.onPlaybackStateChanged(int).
    +
    Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPositionDiscontinuity.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPositionDiscontinuity.html index 7fb48cb41ef..82c307e1b76 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPositionDiscontinuity.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForPositionDiscontinuity.html @@ -140,7 +140,7 @@

    Class Action
    public static final class Action.WaitForPositionDiscontinuity
     extends Action
    -
    Waits for Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, + diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForTimelineChanged.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForTimelineChanged.html index f87b8486ce8..fe4f13dc896 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForTimelineChanged.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.WaitForTimelineChanged.html @@ -140,7 +140,7 @@

    Class Action.WaitF
    public static final class Action.WaitForTimelineChanged
     extends Action
    - +

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.html index 9b42fdd0251..9214b85333e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/Action.html @@ -323,7 +323,7 @@

    Nested Class Summary

    static class  Action.WaitForIsLoading -
    Waits for a specified loading state, returning either immediately or after a call to Player.EventListener.onIsLoadingChanged(boolean).
    +
    Waits for a specified loading state, returning either immediately or after a call to Player.Listener.onIsLoadingChanged(boolean).
    @@ -344,7 +344,7 @@

    Nested Class Summary

    static class  Action.WaitForPlaybackState -
    Waits for a specified playback state, returning either immediately or after a call to Player.EventListener.onPlaybackStateChanged(int).
    +
    Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
    @@ -352,14 +352,14 @@

    Nested Class Summary

    Action.WaitForPlayWhenReady
    Waits for a specified playWhenReady value, returning either immediately or after a call to - Player.EventListener.onPlayWhenReadyChanged(boolean, int).
    + Player.Listener.onPlayWhenReadyChanged(boolean, int). static class  Action.WaitForPositionDiscontinuity -
    Waits for Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, + @@ -367,7 +367,7 @@

    Nested Class Summary

    static class  Action.WaitForTimelineChanged - + diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.html index 10d5f203a3a..5dcdeef1a5a 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/AdditionalFailureInfo.html @@ -133,7 +133,8 @@

    Class AdditionalFailureInf
    org.junit.rules.TestRule


    -
    public final class AdditionalFailureInfo
    +
    @RequiresApi(19)
    +public final class AdditionalFailureInfo
     extends Object
     implements org.junit.rules.TestRule
    A JUnit Rule that attaches additional info to any errors/exceptions thrown by the test. diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/AutoAdvancingFakeClock.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/AutoAdvancingFakeClock.html deleted file mode 100644 index e3386fcb5ab..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/AutoAdvancingFakeClock.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - -AutoAdvancingFakeClock (ExoPlayer library) - - - - - - - - - - - - - -
    - - - - -
    - - - -
    - -

    Class AutoAdvancingFakeClock

    -
    -
    - -
    -
      -
    • -
      -
      All Implemented Interfaces:
      -
      Clock
      -
      -
      -
      public final class AutoAdvancingFakeClock
      -extends FakeClock
      -
      FakeClock extension which automatically advances time whenever an empty message is - enqueued at a future time. - -

      The clock time is advanced to the time of enqueued empty messages. The first Handler sending - messages at a future time will be allowed to advance time to ensure there is only one primary - time source at a time. This should usually be the Handler of the internal playback loop. You can - reset the handler so that the next Handler that sends messages at a - future time becomes the primary time source.

      -
    • -
    -
    -
    - -
    -
    -
      -
    • - -
        -
      • - - -

        Constructor Detail

        - - - -
          -
        • -

          AutoAdvancingFakeClock

          -
          public AutoAdvancingFakeClock()
          -
          Creates the auto-advancing clock with an initial time of 0.
          -
        • -
        - - - -
          -
        • -

          AutoAdvancingFakeClock

          -
          public AutoAdvancingFakeClock​(long initialTimeMs)
          -
          Creates the auto-advancing clock.
          -
          -
          Parameters:
          -
          initialTimeMs - The initial time of the clock in milliseconds.
          -
          -
        • -
        -
      • -
      - -
        -
      • - - -

        Method Detail

        - - - -
          -
        • -

          addHandlerMessageAtTime

          -
          protected boolean addHandlerMessageAtTime​(HandlerWrapper handler,
          -                                          int message,
          -                                          long timeMs)
          -
          Description copied from class: FakeClock
          -
          Adds an empty handler message to list of pending messages.
          -
          -
          Overrides:
          -
          addHandlerMessageAtTime in class FakeClock
          -
          -
        • -
        - - - -
          -
        • -

          resetHandler

          -
          public void resetHandler()
          -
          Resets the internal handler, so that this clock can later be used with another handler.
          -
        • -
        -
      • -
      -
    • -
    -
    -
    - - - - - - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/DataSourceContractTest.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/DataSourceContractTest.html index 7af58966f86..bbcc7308cef 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/DataSourceContractTest.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/DataSourceContractTest.html @@ -129,19 +129,19 @@

    Class DataSourceContractT

    • -
      public abstract class DataSourceContractTest
      +
      @RequiresApi(19)
      +public abstract class DataSourceContractTest
       extends Object
      A collection of contract tests for DataSource implementations. -

      All these tests should pass for all implementations - behaviour specific to only a subset of - implementations should be tested elsewhere. -

      Subclasses should only include the logic necessary to construct the DataSource and allow it to successfully read data. They shouldn't include any new @Test methods - implementation-specific tests should be in a separate class. -

      If one of these tests fails for a particular DataSource implementation, that's a bug - in the implementation. The test should be overridden in the subclass and annotated Ignore, with a link to an issue to track fixing the implementation and un-ignoring the test.

      +

      Most implementations should pass all these tests. If necessary, subclasses can disable tests + by overriding the @Test method with a no-op implementation. It's recommended (but + not required) to also annotate this @Ignore so that JUnit correclty reports the + test as skipped/ignored instead of passing.

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html index 001386b2388..593d9bcbe5e 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/ExoPlayerTestRunner.html @@ -218,7 +218,7 @@

    Method Summary

    void assertMediaItemsTransitionedSame​(MediaItem... mediaItems) -
    Asserts that the media items reported by Player.EventListener.onMediaItemTransition(MediaItem, int) are the same as the provided media +
    Asserts that the media items reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided media items.
    @@ -226,14 +226,14 @@

    Method Summary

    void assertMediaItemsTransitionReasonsEqual​(Integer... reasons) -
    Asserts that the media item transition reasons reported by Player.EventListener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
    +
    Asserts that the media item transition reasons reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
    void assertNoPositionDiscontinuities() -
    Asserts that Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, + @@ -241,7 +241,7 @@

    Method Summary

    void assertPlaybackStatesEqual​(Integer... states) -
    Asserts that the playback states reported by Player.EventListener.onPlaybackStateChanged(int) are equal to the provided playback states.
    +
    Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
    @@ -255,7 +255,7 @@

    Method Summary

    void assertPositionDiscontinuityReasonsEqual​(Integer... discontinuityReasons) -
    Asserts that the discontinuity reasons reported by Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are +
    Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are equal to the provided values.
    @@ -263,7 +263,7 @@

    Method Summary

    void assertTimelineChangeReasonsEqual​(Integer... reasons) -
    Asserts that the timeline change reasons reported by Player.EventListener.onTimelineChanged(Timeline, int) are equal to the provided timeline change +
    Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change reasons.
    @@ -271,7 +271,7 @@

    Method Summary

    void assertTimelinesSame​(Timeline... timelines) -
    Asserts that the timelines reported by Player.EventListener.onTimelineChanged(Timeline, int) +
    Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) are the same to the provided timelines.
    @@ -279,7 +279,7 @@

    Method Summary

    void assertTrackGroupsEqual​(TrackGroupArray trackGroupArray) -
    Asserts that the last track group array reported by Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided +
    Asserts that the last track group array reported by Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided track group array.
    @@ -375,39 +375,25 @@

    Methods inherited from class java.lang.clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait - - @@ -540,7 +526,7 @@

    blockUntilActionScheduleFinished

  • assertTimelinesSame

    public void assertTimelinesSame​(Timeline... timelines)
    -
    Asserts that the timelines reported by Player.EventListener.onTimelineChanged(Timeline, int) +
    Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) are the same to the provided timelines. This assert differs from testing equality by not comparing period ids which may be different due to id mapping of child source period ids.
    @@ -556,7 +542,7 @@

    assertTimelinesSame

  • assertTimelineChangeReasonsEqual

    public void assertTimelineChangeReasonsEqual​(Integer... reasons)
    -
    Asserts that the timeline change reasons reported by Player.EventListener.onTimelineChanged(Timeline, int) are equal to the provided timeline change +
    Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change reasons.
  • @@ -567,7 +553,7 @@

    assertTimelineChangeReasonsEqual

  • assertMediaItemsTransitionedSame

    public void assertMediaItemsTransitionedSame​(MediaItem... mediaItems)
    -
    Asserts that the media items reported by Player.EventListener.onMediaItemTransition(MediaItem, int) are the same as the provided media +
    Asserts that the media items reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided media items.
    Parameters:
    @@ -582,7 +568,7 @@

    assertMediaItemsTransitionedSame

  • assertMediaItemsTransitionReasonsEqual

    public void assertMediaItemsTransitionReasonsEqual​(Integer... reasons)
    -
    Asserts that the media item transition reasons reported by Player.EventListener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
    +
    Asserts that the media item transition reasons reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
    Parameters:
    reasons - A list of expected transition reasons.
    @@ -596,7 +582,7 @@

    assertMediaItemsTransitionReasonsEqual

  • assertPlaybackStatesEqual

    public void assertPlaybackStatesEqual​(Integer... states)
    -
    Asserts that the playback states reported by Player.EventListener.onPlaybackStateChanged(int) are equal to the provided playback states.
    +
    Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
  • @@ -606,7 +592,7 @@

    assertPlaybackStatesEqual

  • assertTrackGroupsEqual

    public void assertTrackGroupsEqual​(TrackGroupArray trackGroupArray)
    -
    Asserts that the last track group array reported by Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided +
    Asserts that the last track group array reported by Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided track group array.
    Parameters:
    @@ -621,7 +607,7 @@

    assertTrackGroupsEqual

  • assertNoPositionDiscontinuities

    public void assertNoPositionDiscontinuities()
    -
  • @@ -632,7 +618,7 @@

    assertNoPositionDiscontinuities

  • assertPositionDiscontinuityReasonsEqual

    public void assertPositionDiscontinuityReasonsEqual​(Integer... discontinuityReasons)
    -
    Asserts that the discontinuity reasons reported by Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are +
    Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are equal to the provided values.
    Parameters:
    @@ -677,6 +663,8 @@

    onTimelineChanged

    Specified by:
    onTimelineChanged in interface Player.EventListener
    +
    Specified by:
    +
    onTimelineChanged in interface Player.Listener
    Parameters:
    timeline - The latest timeline. Never null, but may be empty.
    reason - The Player.TimelineChangeReason responsible for this timeline change.
    @@ -705,6 +693,8 @@

    onMediaItemTransition

    Specified by:
    onMediaItemTransition in interface Player.EventListener
    +
    Specified by:
    +
    onMediaItemTransition in interface Player.Listener
    Parameters:
    mediaItem - The MediaItem. May be null if the playlist becomes empty.
    reason - The reason for the transition.
    @@ -727,6 +717,8 @@

    onTracksChanged

    Specified by:
    onTracksChanged in interface Player.EventListener
    +
    Specified by:
    +
    onTracksChanged in interface Player.Listener
    Parameters:
    trackGroups - The available tracks. Never null, but may be of length zero.
    trackSelections - The selected tracks. Never null, but may contain null elements. A @@ -752,6 +744,8 @@

    onPlaybackStateChanged

    Specified by:
    onPlaybackStateChanged in interface Player.EventListener
    +
    Specified by:
    +
    onPlaybackStateChanged in interface Player.Listener
    Parameters:
    playbackState - The new playback state.
    @@ -773,6 +767,8 @@

    onPlayerError

    Specified by:
    onPlayerError in interface Player.EventListener
    +
    Specified by:
    +
    onPlayerError in interface Player.Listener
    Parameters:
    error - The error.
    @@ -800,6 +796,8 @@

    onPositionDiscontinuity

    Specified by:
    onPositionDiscontinuity in interface Player.EventListener
    +
    Specified by:
    +
    onPositionDiscontinuity in interface Player.Listener
    Parameters:
    oldPosition - The position before the discontinuity.
    newPosition - The position after the discontinuity.
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.Builder.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.Builder.html new file mode 100644 index 00000000000..3a3ba9ce065 --- /dev/null +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.Builder.html @@ -0,0 +1,361 @@ + + + + +FakeExoMediaDrm.Builder (ExoPlayer library) + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class FakeExoMediaDrm.Builder

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
      • +
      +
    • +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + + + + diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html index 42e69af5ea9..795140981ef 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/FakeExoMediaDrm.html @@ -25,7 +25,7 @@ catch(err) { } //--> -var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10}; +var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10}; var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]}; var altColor = "altColor"; var rowColor = "rowColor"; @@ -133,7 +133,8 @@

    Class FakeExoMediaDrm

    ExoMediaDrm

    -
    public final class FakeExoMediaDrm
    +
    @RequiresApi(29)
    +public final class FakeExoMediaDrm
     extends Object
     implements ExoMediaDrm
    A fake implementation of ExoMediaDrm for use in tests. @@ -163,6 +164,13 @@

    Nested Class Summary

    static class  +FakeExoMediaDrm.Builder + +
    Builder for FakeExoMediaDrm instances.
    + + + +static class  FakeExoMediaDrm.LicenseServer
    An license server implementation to interact with FakeExoMediaDrm.
    @@ -219,6 +227,11 @@

    Field Summary

    Value for use with the Map returned from queryKeyStatus(byte[]).
    + +static ImmutableList<Byte> +VALID_PROVISION_RESPONSE +  + + + + +
      +
    • +

      VALID_PROVISION_RESPONSE

      +
      public static final ImmutableList<Byte> VALID_PROVISION_RESPONSE
      +
    • +
    @@ -530,9 +562,11 @@

    Constructor Detail

    • FakeExoMediaDrm

      -
      public FakeExoMediaDrm()
      -
      Constructs an instance that returns random and unique sessionIds for subsequent calls - to openSession() with no limit on the number of concurrent open sessions.
      +
      @Deprecated
      +public FakeExoMediaDrm()
      +
      Deprecated. + +
    @@ -541,13 +575,11 @@

    FakeExoMediaDrm

  • @@ -988,7 +1020,7 @@

    getReferenceCount

    -
      +
      • triggerEvent

        public void triggerEvent​(Predicate<byte[]> sessionIdPredicate,
        @@ -1001,6 +1033,17 @@ 

        triggerEvent

        passing the provided values for event, extra and data.
  • + + + +
      +
    • +

      resetProvisioning

      +
      public void resetProvisioning()
      +
      Resets the provisioning state of this instance, so it requires provisionsRequired (possibly zero) provision operations + before it's operational again.
      +
    • +
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/StubExoPlayer.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/StubExoPlayer.html index 197db674a35..5a0d17a2e96 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/StubExoPlayer.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/StubExoPlayer.html @@ -1264,7 +1264,7 @@

    getPlaybackState

    Returns:
    The current playback state.
    See Also:
    -
    Player.EventListener.onPlaybackStateChanged(int)
    +
    Player.Listener.onPlaybackStateChanged(int)
  • @@ -1285,7 +1285,7 @@

    getPlaybackSuppressionReason

    Returns:
    The current playback suppression reason.
    See Also:
    -
    Player.EventListener.onPlaybackSuppressionReasonChanged(int)
    +
    Player.Listener.onPlaybackSuppressionReasonChanged(int)
  • @@ -1298,7 +1298,7 @@

    getPlayerError

    public ExoPlaybackException getPlayerError()
    Description copied from interface: Player
    Returns the error that caused playback to fail. This is the same error that will have been - reported via Player.EventListener.onPlayerError(ExoPlaybackException) at the time of failure. It + reported via Player.Listener.onPlayerError(ExoPlaybackException) at the time of failure. It can be queried using this method until the player is re-prepared.

    Note that this method will always return null if Player.getPlaybackState() is not @@ -1309,7 +1309,7 @@

    getPlayerError

    Returns:
    The error, or null.
    See Also:
    -
    Player.EventListener.onPlayerError(ExoPlaybackException)
    +
    Player.Listener.onPlayerError(ExoPlaybackException)
    @@ -1697,7 +1697,7 @@

    getAvailableCommands

    Description copied from interface: Player
    Returns the player's currently available Player.Commands. -

    The returned Player.Commands are not updated when available commands change. Use Player.EventListener.onAvailableCommandsChanged(Commands) to get an update when the available commands +

    The returned Player.Commands are not updated when available commands change. Use Player.Listener.onAvailableCommandsChanged(Commands) to get an update when the available commands change.

    Executing a command that is not available (for example, calling Player.next() if Player.COMMAND_SEEK_TO_NEXT_MEDIA_ITEM is unavailable) will neither throw an exception nor generate @@ -1711,7 +1711,7 @@

    getAvailableCommands

    Returns:
    The currently available Player.Commands.
    See Also:
    -
    Player.EventListener.onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)
    +
    Player.Listener.onAvailableCommandsChanged(com.google.android.exoplayer2.Player.Commands)
    @@ -1749,7 +1749,7 @@

    getPlayWhenReady

    Returns:
    Whether playback will proceed when ready.
    See Also:
    -
    Player.EventListener.onPlayWhenReadyChanged(boolean, int)
    +
    Player.Listener.onPlayWhenReadyChanged(boolean, int)
    @@ -1786,7 +1786,7 @@

    getRepeatMode

    Returns:
    The current repeat mode.
    See Also:
    -
    Player.EventListener.onRepeatModeChanged(int)
    +
    Player.Listener.onRepeatModeChanged(int)
    @@ -1837,7 +1837,7 @@

    getShuffleModeEnabled

    Specified by:
    getShuffleModeEnabled in interface Player
    See Also:
    -
    Player.EventListener.onShuffleModeEnabledChanged(boolean)
    +
    Player.Listener.onShuffleModeEnabledChanged(boolean)
    @@ -1856,7 +1856,7 @@

    isLoading

    Returns:
    Whether the player is currently loading the source.
    See Also:
    -
    Player.EventListener.onIsLoadingChanged(boolean)
    +
    Player.Listener.onIsLoadingChanged(boolean)
    @@ -1891,7 +1891,7 @@

    setPlaybackParameters

    Attempts to set the playback parameters. Passing PlaybackParameters.DEFAULT resets the player to the default, which means there is no speed or pitch adjustment. -

    Playback parameters changes may cause the player to buffer. Player.EventListener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently +

    Playback parameters changes may cause the player to buffer. Player.Listener.onPlaybackParametersChanged(PlaybackParameters) will be called whenever the currently active playback parameters change.

    Specified by:
    @@ -1914,7 +1914,7 @@

    getPlaybackParameters

    Specified by:
    getPlaybackParameters in interface Player
    See Also:
    -
    Player.EventListener.onPlaybackParametersChanged(PlaybackParameters)
    +
    Player.Listener.onPlaybackParametersChanged(PlaybackParameters)
    @@ -2065,7 +2065,7 @@

    getCurrentTrackGroups

    Specified by:
    getCurrentTrackGroups in interface Player
    See Also:
    -
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -2086,7 +2086,7 @@

    getCurrentTrackSelections

    Specified by:
    getCurrentTrackSelections in interface Player
    See Also:
    -
    Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    +
    Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray)
    @@ -2111,7 +2111,7 @@

    getCurrentStaticMetadata

    Specified by:
    getCurrentStaticMetadata in interface Player
    See Also:
    -
    Player.EventListener.onStaticMetadataChanged(List)
    +
    Player.Listener.onStaticMetadataChanged(List)
    @@ -2127,7 +2127,7 @@

    getMediaMetadata

    supported.

    This MediaMetadata is a combination of the MediaItem.mediaMetadata and the - static and dynamic metadata sourced from Player.EventListener.onStaticMetadataChanged(List) and + static and dynamic metadata sourced from Player.Listener.onStaticMetadataChanged(List) and MetadataOutput.onMetadata(Metadata).

    Specified by:
    @@ -2148,7 +2148,7 @@

    getCurrentTimeline

    Specified by:
    getCurrentTimeline in interface Player
    See Also:
    -
    Player.EventListener.onTimelineChanged(Timeline, int)
    +
    Player.Listener.onTimelineChanged(Timeline, int)
    @@ -2445,7 +2445,10 @@

    setVideoSurfaceHolder

    SurfaceHolder surfaceHolder)
    Description copied from interface: Player
    Sets the SurfaceHolder that holds the Surface onto which video will be - rendered. The player will track the lifecycle of the surface automatically.
    + rendered. The player will track the lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

    Specified by:
    setVideoSurfaceHolder in interface Player
    @@ -2483,7 +2486,10 @@

    setVideoSurfaceView

    SurfaceView surfaceView)
    Description copied from interface: Player
    Sets the SurfaceView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the SurfaceHolder.Callback methods must be the thread + associated with Player.getApplicationLooper().

    Specified by:
    setVideoSurfaceView in interface Player
    @@ -2521,7 +2527,10 @@

    setVideoTextureView

    TextureView textureView)
    Description copied from interface: Player
    Sets the TextureView onto which video will be rendered. The player will track the - lifecycle of the surface automatically.
    + lifecycle of the surface automatically. + +

    The thread that calls the TextureView.SurfaceTextureListener methods must be the + thread associated with Player.getApplicationLooper().

    Specified by:
    setVideoTextureView in interface Player
    @@ -2565,7 +2574,7 @@

    getVideoSize

    Specified by:
    getVideoSize in interface Player
    See Also:
    -
    VideoListener.onVideoSizeChanged(VideoSize)
    +
    Player.Listener.onVideoSizeChanged(VideoSize)
    @@ -2749,7 +2758,7 @@

    setPauseAtEndOfMediaItems

    Description copied from interface: ExoPlayer
    Sets whether to pause playback at the end of each media item. -

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.EventListener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    +

    This means the player will pause at the end of each window in the current timeline. Listeners will be informed by a call to Player.Listener.onPlayWhenReadyChanged(boolean, int) with the reason Player.PLAY_WHEN_READY_CHANGE_REASON_END_OF_MEDIA_ITEM when this happens.

    Specified by:
    setPauseAtEndOfMediaItems in interface ExoPlayer
    diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-frame.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-frame.html deleted file mode 100644 index 0cb2aa148b0..00000000000 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-frame.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - -com.google.android.exoplayer2.testutil (ExoPlayer library) - - - - - - - - - - - -

    com.google.android.exoplayer2.testutil

    -
    -

    Interfaces

    - -

    Classes

    - -

    Exceptions

    - -
    - - diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html index 4f09751b784..9f805fe5249 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-summary.html @@ -317,7 +317,7 @@

    Package com.google.android.exoplayer2.tes Action.WaitForIsLoading -
    Waits for a specified loading state, returning either immediately or after a call to Player.EventListener.onIsLoadingChanged(boolean).
    +
    Waits for a specified loading state, returning either immediately or after a call to Player.Listener.onIsLoadingChanged(boolean).
    @@ -335,27 +335,27 @@

    Package com.google.android.exoplayer2.tes Action.WaitForPlaybackState -
    Waits for a specified playback state, returning either immediately or after a call to Player.EventListener.onPlaybackStateChanged(int).
    +
    Waits for a specified playback state, returning either immediately or after a call to Player.Listener.onPlaybackStateChanged(int).
    Action.WaitForPlayWhenReady
    Waits for a specified playWhenReady value, returning either immediately or after a call to - Player.EventListener.onPlayWhenReadyChanged(boolean, int).
    + Player.Listener.onPlayWhenReadyChanged(boolean, int). Action.WaitForPositionDiscontinuity -
    Waits for Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, + Action.WaitForTimelineChanged - + @@ -625,195 +625,201 @@

    Package com.google.android.exoplayer2.tes +FakeExoMediaDrm.Builder + +
    Builder for FakeExoMediaDrm instances.
    + + + FakeExoMediaDrm.LicenseServer
    An license server implementation to interact with FakeExoMediaDrm.
    - + FakeExtractorInput
    A fake ExtractorInput capable of simulating various scenarios.
    - + FakeExtractorInput.Builder
    Builder of FakeExtractorInput instances.
    - + FakeExtractorOutput - + FakeMediaChunk - + FakeMediaChunkIterator - + FakeMediaClockRenderer
    Fake abstract Renderer which is also a MediaClock.
    - + FakeMediaPeriod
    Fake MediaPeriod that provides tracks from the given TrackGroupArray.
    - + FakeMediaSource
    Fake MediaSource that provides a given timeline.
    - + FakeMediaSource.InitialTimeline
    A forwarding timeline to provide an initial timeline for fake multi window sources.
    - + FakeRenderer
    Fake Renderer that supports any format with the matching track type.
    - + FakeSampleStream
    Fake SampleStream that outputs a given Format and any amount of items.
    - + FakeSampleStream.FakeSampleStreamItem - + FakeShuffleOrder
    Fake ShuffleOrder which returns a reverse order.
    - + FakeTimeline
    Fake Timeline which can be setup to return custom FakeTimeline.TimelineWindowDefinitions.
    - + FakeTimeline.TimelineWindowDefinition
    Definition used to define a FakeTimeline.
    - + FakeTrackOutput
    A fake TrackOutput.
    - + FakeTrackSelection
    A fake ExoTrackSelection that only returns 1 fixed track, and allows querying the number of calls to its methods.
    - + FakeTrackSelector - + FakeVideoRenderer - + HostActivity
    A host activity for performing playback tests.
    - + HttpDataSourceTestEnv
    A JUnit Rule that creates test resources for HttpDataSource contract tests.
    - + MediaPeriodAsserts
    Assertion methods for MediaPeriod.
    - + MediaSourceTestRunner
    A runner for MediaSource tests.
    - + NoUidTimeline
    A timeline which wraps another timeline and overrides all window and period uids to 0.
    - + StubExoPlayer
    An abstract ExoPlayer implementation that throws UnsupportedOperationException from every method.
    - + TestExoPlayerBuilder
    A builder of SimpleExoPlayer instances for testing.
    - + TestUtil
    Utility methods for tests.
    - + TimelineAsserts
    Assertion methods for Timeline.
    - + WebServerDispatcher
    A Dispatcher for MockWebServer that allows per-path customisation of the static data served.
    - + WebServerDispatcher.Resource
    A resource served by WebServerDispatcher.
    - + WebServerDispatcher.Resource.Builder diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html index b52a6ad3cac..1962b15df7b 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/package-tree.html @@ -252,6 +252,7 @@

    Class Hierarchy

  • com.google.android.exoplayer2.testutil.FakeDataSet.FakeData.Segment
  • com.google.android.exoplayer2.testutil.FakeDataSource.Factory (implements com.google.android.exoplayer2.upstream.DataSource.Factory)
  • com.google.android.exoplayer2.testutil.FakeExoMediaDrm (implements com.google.android.exoplayer2.drm.ExoMediaDrm)
  • +
  • com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
  • com.google.android.exoplayer2.testutil.FakeExoMediaDrm.LicenseServer (implements com.google.android.exoplayer2.drm.MediaDrmCallback)
  • com.google.android.exoplayer2.testutil.FakeExtractorInput (implements com.google.android.exoplayer2.extractor.ExtractorInput)
  • com.google.android.exoplayer2.testutil.FakeExtractorInput.Builder
  • diff --git a/docs/doc/reference/com/google/android/exoplayer2/testutil/truth/SpannedSubject.Colored.html b/docs/doc/reference/com/google/android/exoplayer2/testutil/truth/SpannedSubject.Colored.html index ee90c8f0c0e..e069ed316f6 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/testutil/truth/SpannedSubject.Colored.html +++ b/docs/doc/reference/com/google/android/exoplayer2/testutil/truth/SpannedSubject.Colored.html @@ -177,7 +177,8 @@

    Method Detail

    diff --git a/docs/doc/reference/com/google/android/exoplayer2/video/VideoSize.html b/docs/doc/reference/com/google/android/exoplayer2/video/VideoSize.html index b82c0cb1aba..b4930aa25c8 100644 --- a/docs/doc/reference/com/google/android/exoplayer2/video/VideoSize.html +++ b/docs/doc/reference/com/google/android/exoplayer2/video/VideoSize.html @@ -320,7 +320,8 @@

    UNKNOWN

    • width

      -
      public final int width
      +
      @IntRange(from=0L)
      +public final int width
      The video width in pixels, 0 when unknown.
    @@ -330,7 +331,8 @@

    width

    • height

      -
      public final int height
      +
      @IntRange(from=0L)
      +public final int height
      The video height in pixels, 0 when unknown.
    @@ -340,7 +342,9 @@

    height

    • unappliedRotationDegrees

      -
      public final int unappliedRotationDegrees
      +
      @IntRange(from=0L,
      +          to=359L)
      +public final int unappliedRotationDegrees
      Clockwise rotation in degrees that the application should apply for the video for it to be rendered in the correct orientation. @@ -360,7 +364,9 @@

      unappliedRotationDegrees

      addAudioListener(AudioListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      addAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Adds a listener to receive audio offload events.
      @@ -681,7 +683,9 @@

      A

      addDeviceListener(DeviceListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      addDownload(DownloadRequest) - Method in class com.google.android.exoplayer2.offline.DownloadManager
      Adds a download defined by the given request.
      @@ -771,7 +775,9 @@

      A

      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      addListener(Player.EventListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      addListener(Player.Listener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -908,7 +914,9 @@

      A

      addMetadataOutput(MetadataOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      addOrReplaceSpan(Spannable, Object, int, int, int) - Static method in class com.google.android.exoplayer2.text.span.SpanUtil
      Adds span to spannable between start and end, removing any @@ -934,7 +942,9 @@

      A

      addTextOutput(TextOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      addTime(String, long) - Method in class com.google.android.exoplayer2.testutil.Dumper
       
      addTrackSelection(int, DefaultTrackSelector.Parameters) - Method in class com.google.android.exoplayer2.offline.DownloadHelper
      @@ -979,7 +989,9 @@

      A

      addVideoListener(VideoListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      addVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener) - Method in class com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView
      @@ -1634,12 +1646,12 @@

      A

      assertMediaItemsTransitionedSame(MediaItem...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the media items reported by Player.EventListener.onMediaItemTransition(MediaItem, int) are the same as the provided media +
      Asserts that the media items reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided media items.
      assertMediaItemsTransitionReasonsEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the media item transition reasons reported by Player.EventListener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
      +
      Asserts that the media item transition reasons reported by Player.Listener.onMediaItemTransition(MediaItem, int) are the same as the provided reasons.
      assertMediaPeriodCreated(MediaSource.MediaPeriodId) - Method in class com.google.android.exoplayer2.testutil.FakeMediaSource
      @@ -1652,7 +1664,7 @@

      A

      assertNoPositionDiscontinuities() - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      assertNoTimelineChange() - Method in class com.google.android.exoplayer2.testutil.MediaSourceTestRunner
      @@ -1697,7 +1709,7 @@

      A

      assertPlaybackStatesEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the playback states reported by Player.EventListener.onPlaybackStateChanged(int) are equal to the provided playback states.
      +
      Asserts that the playback states reported by Player.Listener.onPlaybackStateChanged(int) are equal to the provided playback states.
      assertPlayedPeriodIndices(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      @@ -1705,7 +1717,7 @@

      A

      assertPositionDiscontinuityReasonsEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the discontinuity reasons reported by Player.EventListener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are +
      Asserts that the discontinuity reasons reported by Player.Listener.onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) are equal to the provided values.
      assertPrepareAndReleaseAllPeriods() - Method in class com.google.android.exoplayer2.testutil.MediaSourceTestRunner
      @@ -1760,12 +1772,12 @@

      A

      assertTimelineChangeReasonsEqual(Integer...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the timeline change reasons reported by Player.EventListener.onTimelineChanged(Timeline, int) are equal to the provided timeline change +
      Asserts that the timeline change reasons reported by Player.Listener.onTimelineChanged(Timeline, int) are equal to the provided timeline change reasons.
      assertTimelinesSame(Timeline...) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the timelines reported by Player.EventListener.onTimelineChanged(Timeline, int) +
      Asserts that the timelines reported by Player.Listener.onTimelineChanged(Timeline, int) are the same to the provided timelines.
      assertTotalBufferCount(String, DecoderCounters, int, int) - Static method in class com.google.android.exoplayer2.testutil.DecoderCountersUtil
      @@ -1776,7 +1788,7 @@

      A

      assertTrackGroupsEqual(TrackGroupArray) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
      -
      Asserts that the last track group array reported by Player.EventListener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided +
      Asserts that the last track group array reported by Player.Listener.onTracksChanged(TrackGroupArray, TrackSelectionArray) is equal to the provided track group array.
      assertVideoFrameProcessingOffsetSampleCount(String, DecoderCounters, int, int) - Static method in class com.google.android.exoplayer2.testutil.DecoderCountersUtil
      @@ -2580,6 +2592,10 @@

      B

      build() - Method in class com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig.Builder
       
      +
      build() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
      +
      +
      Returns a FakeExoMediaDrm instance with an initial reference count of 1.
      +
      build() - Method in class com.google.android.exoplayer2.testutil.FakeExtractorInput.Builder
       
      build() - Method in class com.google.android.exoplayer2.testutil.TestExoPlayerBuilder
      @@ -2726,6 +2742,10 @@

      B

       
      Builder() - Constructor for class com.google.android.exoplayer2.testutil.ExtractorAsserts.AssertionConfig.Builder
       
      +
      Builder() - Constructor for class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
      +
      +
      Constructs an instance.
      +
      Builder() - Constructor for class com.google.android.exoplayer2.testutil.FakeExtractorInput.Builder
       
      Builder() - Constructor for class com.google.android.exoplayer2.testutil.WebServerDispatcher.Resource.Builder
      @@ -7570,6 +7590,10 @@

      D

      The default timeout applied when calling RobolectricUtil.runMainLooperUntil(Supplier).
      +
      DEFAULT_TIMEOUT_MS - Static variable in class com.google.android.exoplayer2.source.rtsp.RtspMediaSource
      +
      + +
      DEFAULT_TIMESTAMP_SEARCH_BYTES - Static variable in class com.google.android.exoplayer2.extractor.ts.TsExtractor
       
      DEFAULT_TOUCH_TARGET_HEIGHT_DP - Static variable in class com.google.android.exoplayer2.ui.DefaultTimeBar
      @@ -9330,6 +9354,10 @@

      E

       
      e(String, String, Throwable) - Static method in class com.google.android.exoplayer2.util.Log
       
      +
      E_AC_3_CODEC_STRING - Static variable in class com.google.android.exoplayer2.audio.Ac3Util
      +
      +
      A non-standard codec string for E-AC-3.
      +
      E_AC3_MAX_RATE_BYTES_PER_SECOND - Static variable in class com.google.android.exoplayer2.audio.Ac3Util
      Maximum rate for an E-AC-3 audio stream, in bytes per second.
      @@ -10727,6 +10755,10 @@

      E

      Factory for arrays of Extractor instances.
      +
      ExtractorUtil - Class in com.google.android.exoplayer2.extractor
      +
      +
      Extractor related utility methods.
      +
      extractSeekMap(Extractor, FakeExtractorOutput, DataSource, Uri) - Static method in class com.google.android.exoplayer2.testutil.TestUtil
      Reads from the given input using the given Extractor, until it can produce the SeekMap and all of the track formats have been identified, or until the extractor encounters @@ -11091,13 +11123,19 @@

      F

      FakeExoMediaDrm() - Constructor for class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      -
      Constructs an instance that returns random and unique sessionIds for subsequent calls - to FakeExoMediaDrm.openSession() with no limit on the number of concurrent open sessions.
      +
      Deprecated. + +
      FakeExoMediaDrm(int) - Constructor for class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      -
      Constructs an instance that returns random and unique sessionIds for subsequent calls - to FakeExoMediaDrm.openSession() with a limit on the number of concurrent open sessions.
      +
      Deprecated. + +
      +
      +
      FakeExoMediaDrm.Builder - Class in com.google.android.exoplayer2.testutil
      +
      +
      Builder for FakeExoMediaDrm instances.
      FakeExoMediaDrm.LicenseServer - Class in com.google.android.exoplayer2.testutil
      @@ -17335,6 +17373,11 @@

      H

      Returns whether the ad group at index adGroupIndex has been played.
      +
      hasPositiveStartOffset - Variable in class com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist
      +
      +
      Whether the HlsMediaPlaylist.startOffsetUs was explicitly defined by #EXT-X-START as a positive value + or zero.
      +
      hasPrevious() - Method in class com.google.android.exoplayer2.BasePlayer
       
      hasPrevious() - Method in interface com.google.android.exoplayer2.Player
      @@ -19072,6 +19115,11 @@

      I

      Returns whether the upstream source is ready.
      +
      isStartOfTsPacket(byte[], int, int, int) - Static method in class com.google.android.exoplayer2.extractor.ts.TsUtil
      +
      +
      Returns whether a TS packet starts at searchPosition according to the MPEG-TS + synchronization recommendations.
      +
      isStartTag(XmlPullParser) - Static method in class com.google.android.exoplayer2.util.XmlPullParserUtil
      Returns whether the current event is a start tag.
      @@ -21894,6 +21942,8 @@

      O

      Deprecated.
      Called when the audio attributes change.
      +
      onAudioAttributesChanged(AudioAttributes) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onAudioCapabilitiesChanged(AudioCapabilities) - Method in interface com.google.android.exoplayer2.audio.AudioCapabilitiesReceiver.Listener
      Called when the audio capabilities change.
      @@ -22009,6 +22059,8 @@

      O

      Deprecated.
      Called when the audio session ID changes.
      +
      onAudioSessionIdChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onAudioSessionIdChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the audio session ID changes.
      @@ -22047,6 +22099,8 @@

      O

      Called when the value returned from Player.isCommandAvailable(int) changes for at least one Player.Command.
      +
      onAvailableCommandsChanged(Player.Commands) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onBandwidthEstimate(AnalyticsListener.EventTime, int, long, long) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the bandwidth estimate for the current data source has been updated.
      @@ -22326,11 +22380,15 @@

      O

      Deprecated.
      Called when the device information changes.
      +
      onDeviceInfoChanged(DeviceInfo) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onDeviceVolumeChanged(int, boolean) - Method in interface com.google.android.exoplayer2.device.DeviceListener
      Deprecated.
      Called when the device volume or mute state changes.
      +
      onDeviceVolumeChanged(int, boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onDisabled() - Method in class com.google.android.exoplayer2.audio.DecoderAudioRenderer
       
      onDisabled() - Method in class com.google.android.exoplayer2.audio.MediaCodecAudioRenderer
      @@ -22573,6 +22631,8 @@

      O

      Deprecated.
      Called when one or more player states changed.
      +
      onEvents(Player, Player.Events) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onExperimentalOffloadSchedulingEnabledChanged(boolean) - Method in interface com.google.android.exoplayer2.ExoPlayer.AudioOffloadListener
      Called when the player has started or stopped offload scheduling using ExoPlayer.experimentalSetOffloadSchedulingEnabled(boolean).
      @@ -22669,6 +22729,8 @@

      O

      Deprecated.
      Called when the player starts or stops loading the source.
      +
      onIsLoadingChanged(boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onIsLoadingChanged(AnalyticsListener.EventTime, boolean) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the player starts or stops loading data from a source.
      @@ -22682,6 +22744,8 @@

      O

      Deprecated.
      Called when the value of Player.isPlaying() changes.
      +
      onIsPlayingChanged(boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onIsPlayingChanged(AnalyticsListener.EventTime, boolean) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the player starts or stops playing.
      @@ -22823,6 +22887,8 @@

      O

      Called when playback transitions to a media item or starts repeating a media item according to the current repeat mode.
      +
      onMediaItemTransition(MediaItem, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onMediaItemTransition(MediaItem, int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onMediaMetadataChanged(AnalyticsListener.EventTime, MediaMetadata) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      @@ -22836,6 +22902,8 @@

      O

      Deprecated.
      Called when the combined MediaMetadata changes.
      +
      onMediaMetadataChanged(MediaMetadata) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onMessageArrived() - Method in interface com.google.android.exoplayer2.testutil.ActionSchedule.PlayerTarget.Callback
      Notifies about the arrival of the message.
      @@ -22915,6 +22983,8 @@

      O

      Deprecated.
      Called when the current playback parameters change.
      +
      onPlaybackParametersChanged(PlaybackParameters) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.testutil.FakeTrackSelection
       
      onPlaybackSpeed(float) - Method in class com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection
      @@ -22936,6 +23006,8 @@

      O

      Deprecated.
      Called when the value returned from Player.getPlaybackState() changes.
      +
      onPlaybackStateChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onPlaybackStateChanged(int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onPlaybackStateChanged(int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      @@ -22957,6 +23029,8 @@

      O

      Deprecated.
      Called when the value returned from Player.getPlaybackSuppressionReason() changes.
      +
      onPlaybackSuppressionReasonChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onPlaybackSuppressionReasonChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when playback suppression reason changed.
      @@ -22976,6 +23050,8 @@

      O

      Deprecated.
      Called when an error occurs.
      +
      onPlayerError(ExoPlaybackException) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onPlayerError(ExoPlaybackException) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onPlayerErrorInternal(ExoPlaybackException) - Method in class com.google.android.exoplayer2.testutil.ExoHostedTest
      @@ -23023,6 +23099,8 @@

      O

      Deprecated.
      Called when the value returned from Player.getPlayWhenReady() changes.
      +
      onPlayWhenReadyChanged(boolean, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onPlayWhenReadyChanged(boolean, int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
       
      onPlayWhenReadyChanged(AnalyticsListener.EventTime, boolean, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      @@ -23079,6 +23157,8 @@

      O

      Deprecated.
      Called when a position discontinuity occurs.
      +
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onPositionDiscontinuity(Player.PositionInfo, Player.PositionInfo, int) - Method in class com.google.android.exoplayer2.util.DebugTextViewHelper
      @@ -23258,6 +23338,8 @@

      O

      onRemoveQueueItem(Player, MediaDescriptionCompat) - Method in class com.google.android.exoplayer2.ext.mediasession.TimelineQueueEditor
       
      +
      onRenderedFirstFrame() - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onRenderedFirstFrame() - Method in interface com.google.android.exoplayer2.video.VideoListener
      Deprecated.
      @@ -23291,6 +23373,8 @@

      O

      Deprecated.
      Called when the value of Player.getRepeatMode() changes.
      +
      onRepeatModeChanged(int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onRepeatModeChanged(AnalyticsListener.EventTime, int) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the repeat mode changed.
      @@ -23446,6 +23530,8 @@

      O

      Deprecated.
      Called when the value of Player.getShuffleModeEnabled() changes.
      +
      onShuffleModeEnabledChanged(boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onSkipBackward(MediaSession, MediaSession.ControllerInfo) - Method in interface com.google.android.exoplayer2.ext.media2.SessionCallbackBuilder.SkipCallback
      Called when the specified controller has sent skip backward.
      @@ -23469,6 +23555,8 @@

      O

      Called when skipping silences is enabled or disabled.
      +
      onSkipSilenceEnabledChanged(boolean) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onSkipSilenceEnabledChanged(AnalyticsListener.EventTime, boolean) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when skipping silences is enabled or disabled in the audio stream.
      @@ -23588,6 +23676,8 @@

      O

      Deprecated.
      Called when the static metadata changes.
      +
      onStaticMetadataChanged(List<Metadata>) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onStop() - Method in class com.google.android.exoplayer2.testutil.HostActivity
       
      onStopJob(JobParameters) - Method in class com.google.android.exoplayer2.scheduler.PlatformScheduler.PlatformSchedulerService
      @@ -23647,6 +23737,8 @@

      O

      Called each time there's a change in the size of the surface onto which the video is being rendered.
      +
      onSurfaceSizeChanged(int, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onSurfaceSizeChanged(int, int) - Method in interface com.google.android.exoplayer2.video.VideoListener
      Deprecated.
      @@ -23691,6 +23783,8 @@

      O

      Deprecated.
      Called when the timeline has been refreshed.
      +
      onTimelineChanged(Timeline, int) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onTimelineChanged(Timeline, int) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onTimelineChanged(Timeline, Object, int) - Method in interface com.google.android.exoplayer2.Player.EventListener
      @@ -23728,6 +23822,8 @@

      O

      Deprecated.
      Called when the available or selected tracks change.
      +
      onTracksChanged(TrackGroupArray, TrackSelectionArray) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onTracksChanged(TrackGroupArray, TrackSelectionArray) - Method in class com.google.android.exoplayer2.testutil.ExoPlayerTestRunner
       
      onTrackSelectionChanged(boolean, List<DefaultTrackSelector.SelectionOverride>) - Method in interface com.google.android.exoplayer2.ui.TrackSelectionView.TrackSelectionListener
      @@ -23951,6 +24047,8 @@

      O

       
      onVideoSizeChanged(VideoSize) - Method in class com.google.android.exoplayer2.analytics.AnalyticsCollector
       
      +
      onVideoSizeChanged(VideoSize) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onVideoSizeChanged(VideoSize) - Method in interface com.google.android.exoplayer2.video.VideoListener
      Deprecated.
      @@ -23986,6 +24084,8 @@

      O

      Deprecated.
      Called when the volume changes.
      +
      onVolumeChanged(float) - Method in interface com.google.android.exoplayer2.Player.Listener
      +
       
      onVolumeChanged(AnalyticsListener.EventTime, float) - Method in interface com.google.android.exoplayer2.analytics.AnalyticsListener
      Called when the volume changes.
      @@ -24721,6 +24821,10 @@

      P

       
      peekFully(byte[], int, int, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeExtractorInput
       
      +
      peekFullyQuietly(ExtractorInput, byte[], int, int, boolean) - Static method in class com.google.android.exoplayer2.extractor.ExtractorUtil
      +
      +
      Peeks data from input, respecting allowEndOfInput.
      +
      peekId3Data(ExtractorInput, Id3Decoder.FramePredicate) - Method in class com.google.android.exoplayer2.extractor.Id3Peeker
      Peeks ID3 data from the input and parses the first ID3 tag.
      @@ -24734,6 +24838,11 @@

      P

      Peeks the source id of the next sample to be read, or the current upstream source id if the queue is empty or if the read position is at the end of the queue.
      +
      peekToLength(ExtractorInput, byte[], int, int) - Static method in class com.google.android.exoplayer2.extractor.ExtractorUtil
      +
      +
      Peeks length bytes from the input peek position, or all the bytes to the end of the + input if there was less than length bytes left.
      +
      peekUnsignedByte() - Method in class com.google.android.exoplayer2.util.ParsableByteArray
      Peeks at the next byte as an unsigned value.
      @@ -25120,7 +25229,7 @@

      P

      Player.EventFlags - Annotation Type in com.google.android.exoplayer2
      -
      Events that can be reported via Player.EventListener.onEvents(Player, Events).
      +
      Events that can be reported via Player.Listener.onEvents(Player, Events).
      Player.EventListener - Interface in com.google.android.exoplayer2
      @@ -26413,6 +26522,12 @@

      R

       
      readFully(byte[], int, int, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeExtractorInput
       
      +
      readFullyQuietly(ExtractorInput, byte[], int, int) - Static method in class com.google.android.exoplayer2.extractor.ExtractorUtil
      +
      +
      Equivalent to ExtractorInput.readFully(byte[], int, int) except that it returns + false instead of throwing an EOFException if the end of input is encountered without + having fully satisfied the read.
      +
      readId3Metadata(ExtractorInput, boolean) - Static method in class com.google.android.exoplayer2.extractor.FlacMetadataReader
      Reads ID3 Data.
      @@ -27141,7 +27256,9 @@

      R

      removeAudioListener(AudioListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      removeAudioOffloadListener(ExoPlayer.AudioOffloadListener) - Method in interface com.google.android.exoplayer2.ExoPlayer
      Removes a listener of audio offload events.
      @@ -27161,7 +27278,9 @@

      R

      removeDeviceListener(DeviceListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      removeDownload(String) - Method in class com.google.android.exoplayer2.offline.DefaultDownloadIndex
       
      removeDownload(String) - Method in class com.google.android.exoplayer2.offline.DownloadManager
      @@ -27223,7 +27342,9 @@

      R

      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      removeListener(Player.EventListener) - Method in class com.google.android.exoplayer2.testutil.StubExoPlayer
       
      removeListener(Player.Listener) - Method in class com.google.android.exoplayer2.ext.cast.CastPlayer
      @@ -27315,7 +27436,9 @@

      R

      removeMetadataOutput(MetadataOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      removePlaylistItem(int) - Method in class com.google.android.exoplayer2.ext.media2.SessionPlayerConnector
       
      removeQueryParameter(Uri, String) - Static method in class com.google.android.exoplayer2.util.UriUtil
      @@ -27345,7 +27468,9 @@

      R

      removeTextOutput(TextOutput) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      removeVersion(SQLiteDatabase, int, String) - Static method in class com.google.android.exoplayer2.database.VersionTable
      Removes the version of a specified instance of a feature.
      @@ -27357,7 +27482,9 @@

      R

      removeVideoListener(VideoListener) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      removeVideoSurfaceListener(SphericalGLSurfaceView.VideoSurfaceListener) - Method in class com.google.android.exoplayer2.video.spherical.SphericalGLSurfaceView
      @@ -27866,6 +27993,11 @@

      R

      Resets the clock's position.
      +
      resetProvisioning() - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      +
      +
      Resets the provisioning state of this instance, so it requires provisionsRequired (possibly zero) provision operations + before it's operational again.
      +
      resetSupplementalData(int) - Method in class com.google.android.exoplayer2.decoder.DecoderInputBuffer
      Clears DecoderInputBuffer.supplementalData and ensures that it's large enough to accommodate @@ -28356,7 +28488,7 @@

      R

      runUntilPositionDiscontinuity(Player, int) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      -
      runUntilReceiveOffloadSchedulingEnabledNewState(ExoPlayer) - Static method in class com.google.android.exoplayer2.robolectric.TestPlayerRunHelper
      @@ -31033,6 +31165,10 @@

      S

      Sets the maximum allowed audio channel count.
      +
      setMaxConcurrentSessions(int) - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
      +
      +
      Sets the maximum number of concurrent sessions the FakeExoMediaDrm will support.
      +
      setMaxInputSize(int) - Method in class com.google.android.exoplayer2.Format.Builder
      @@ -31876,6 +32012,11 @@

      S

      Sets the proportional control factor used to adjust the playback speed.
      +
      setProvisionsRequired(int) - Method in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm.Builder
      +
      +
      Sets how many successful provisioning round trips are needed for the FakeExoMediaDrm + to be provisioned.
      +
      setQueueEditor(MediaSessionConnector.QueueEditor) - Method in class com.google.android.exoplayer2.ext.mediasession.MediaSessionConnector
      Sets the MediaSessionConnector.QueueEditor to handle queue edits sent by the media controller.
      @@ -32633,6 +32774,10 @@

      S

      Sets a Timeline to be used by a FakeMediaSource in the test runner.
      +
      setTimeoutMs(long) - Method in class com.google.android.exoplayer2.source.rtsp.RtspMediaSource.Factory
      +
      +
      Sets the timeout in milliseconds, the default value is RtspMediaSource.DEFAULT_TIMEOUT_MS.
      +
      setTimestamp(long) - Method in class com.google.android.exoplayer2.source.rtsp.RtpPacket.Builder
      @@ -33400,17 +33545,24 @@

      S

      Object, MediaItem)
      instead.
      +
      SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration) - Constructor for class com.google.android.exoplayer2.source.SinglePeriodTimeline
      +
      +
      Creates a timeline with one period, and a window of known duration starting at a specified + position in the period.
      +
      SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, boolean, Object, Object) - Constructor for class com.google.android.exoplayer2.source.SinglePeriodTimeline
      SinglePeriodTimeline(long, long, long, long, long, long, long, boolean, boolean, Object, MediaItem, MediaItem.LiveConfiguration) - Constructor for class com.google.android.exoplayer2.source.SinglePeriodTimeline
      -
      Creates a timeline with one period, and a window of known duration starting at a specified - position in the period.
      +
      SingleSampleMediaChunk - Class in com.google.android.exoplayer2.source.chunk
      @@ -33569,6 +33721,12 @@

      S

       
      skipFully(int, boolean) - Method in class com.google.android.exoplayer2.testutil.FakeExtractorInput
       
      +
      skipFullyQuietly(ExtractorInput, int) - Static method in class com.google.android.exoplayer2.extractor.ExtractorUtil
      +
      +
      Equivalent to ExtractorInput.skipFully(int) except that it returns false + instead of throwing an EOFException if the end of input is encountered without having + fully satisfied the skip.
      +
      skipInputUntilPosition(ExtractorInput, long) - Method in class com.google.android.exoplayer2.extractor.BinarySearchSeeker
       
      skipOutputBuffer(MediaCodecAdapter, int, long) - Method in class com.google.android.exoplayer2.video.MediaCodecVideoRenderer
      @@ -34314,7 +34472,9 @@

      S

      stop(boolean) - Method in class com.google.android.exoplayer2.SimpleExoPlayer
      -
       
      +
      +
      Deprecated.
      +
      stop(boolean) - Method in class com.google.android.exoplayer2.testutil.ActionSchedule.Builder
      Schedules a stop action.
      @@ -36582,6 +36742,8 @@

      U

      V

      +
      VALID_PROVISION_RESPONSE - Static variable in class com.google.android.exoplayer2.testutil.FakeExoMediaDrm
      +
       
      validateWebvttHeaderLine(ParsableByteArray) - Static method in class com.google.android.exoplayer2.text.webvtt.WebvttParserUtil
      Reads and validates the first line of a WebVTT file.
      diff --git a/docs/doc/reference/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png b/docs/doc/reference/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index ca17cb753b0..00000000000 Binary files a/docs/doc/reference/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/docs/doc/reference/jquery/images/ui-bg_flat_75_ffffff_40x100.png b/docs/doc/reference/jquery/images/ui-bg_flat_75_ffffff_40x100.png deleted file mode 100644 index e6a4176cf0b..00000000000 Binary files a/docs/doc/reference/jquery/images/ui-bg_flat_75_ffffff_40x100.png and /dev/null differ diff --git a/docs/doc/reference/jquery/images/ui-bg_glass_65_ffffff_1x400.png b/docs/doc/reference/jquery/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index 5b482099769..00000000000 Binary files a/docs/doc/reference/jquery/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ diff --git a/docs/doc/reference/jquery/jquery-1.10.2.js b/docs/doc/reference/jquery/jquery-1.10.2.js deleted file mode 100644 index c5c648255c1..00000000000 --- a/docs/doc/reference/jquery/jquery-1.10.2.js +++ /dev/null @@ -1,9789 +0,0 @@ -/*! - * jQuery JavaScript Library v1.10.2 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03T13:48Z - */ -(function( window, undefined ) { - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -//"use strict"; -var - // The deferred used on DOM ready - readyList, - - // A central reference to the root jQuery(document) - rootjQuery, - - // Support: IE<10 - // For `typeof xmlNode.method` instead of `xmlNode.method !== undefined` - core_strundefined = typeof undefined, - - // Use the correct document accordingly with window argument (sandbox) - location = window.location, - document = window.document, - docElem = document.documentElement, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // [[Class]] -> type pairs - class2type = {}, - - // List of deleted data cache ids, so we can reuse them - core_deletedIds = [], - - core_version = "1.10.2", - - // Save a reference to some core methods - core_concat = core_deletedIds.concat, - core_push = core_deletedIds.push, - core_slice = core_deletedIds.slice, - core_indexOf = core_deletedIds.indexOf, - core_toString = class2type.toString, - core_hasOwn = class2type.hasOwnProperty, - core_trim = core_version.trim, - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Used for matching numbers - core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - - // Used for splitting on whitespace - core_rnotwhite = /\S+/g, - - // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE) - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, - rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }, - - // The ready event handler - completed = function( event ) { - - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { - detach(); - jQuery.ready(); - } - }, - // Clean-up method for dom ready events - detach = function() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: core_version, - - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return core_slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; - }, - - slice: function() { - return this.pushStack( core_slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: core_push, - sort: [].sort, - splice: [].splice -}; - -// Give the init function the jQuery prototype for later instantiation -jQuery.fn.init.prototype = jQuery.fn; - -jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ), - - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; - }, - - isNumeric: function( obj ) { - return !isNaN( parseFloat(obj) ) && isFinite( obj ); - }, - - type: function( obj ) { - if ( obj == null ) { - return String( obj ); - } - return typeof obj === "object" || typeof obj === "function" ? - class2type[ core_toString.call(obj) ] || "object" : - typeof obj; - }, - - isPlainObject: function( obj ) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !core_hasOwn.call(obj, "constructor") && - !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( jQuery.support.ownLast ) { - for ( key in obj ) { - return core_hasOwn.call( obj, key ); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} - - return key === undefined || core_hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw new Error( msg ); - }, - - // data: string of html - // context (optional): If specified, the fragment will be created in this context, defaults to document - // keepScripts (optional): If true, will include scripts passed in the html string - parseHTML: function( data, context, keepScripts ) { - if ( !data || typeof data !== "string" ) { - return null; - } - if ( typeof context === "boolean" ) { - keepScripts = context; - context = false; - } - context = context || document; - - var parsed = rsingleTag.exec( data ), - scripts = !keepScripts && []; - - // Single tag - if ( parsed ) { - return [ context.createElement( parsed[1] ) ]; - } - - parsed = jQuery.buildFragment( [ data ], context, scripts ); - if ( scripts ) { - jQuery( scripts ).remove(); - } - return jQuery.merge( [], parsed.childNodes ); - }, - - parseJSON: function( data ) { - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - if ( data === null ) { - return data; - } - - if ( typeof data === "string" ) { - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - if ( data ) { - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return ( new Function( "return " + data ) )(); - } - } - } - - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - if ( !data || typeof data !== "string" ) { - return null; - } - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - // Use native String.trim function wherever possible - trim: core_trim && !core_trim.call("\uFEFF\xA0") ? - function( text ) { - return text == null ? - "" : - core_trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - core_push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( core_indexOf ) { - return core_indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; - }, - - merge: function( first, second ) { - var l = second.length, - i = first.length, - j = 0; - - if ( typeof l === "number" ) { - for ( ; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var retVal, - ret = [], - i = 0, - length = elems.length; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return core_concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var args, proxy, tmp; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = core_slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - // Multifunctional method to get and set values of a collection - // The value/s can optionally be executed if it's a function - access: function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; - }, - - now: function() { - return ( new Date() ).getTime(); - }, - - // A method for quickly swapping in/out CSS properties to get correct calculations. - // Note: this method belongs to the css module but it's needed here for the support module. - // If support gets modularized, this method should be moved back to the css module. - swap: function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; - } -}); - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { - - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } - - // detach all dom ready events - detach(); - - // and execute any waiting functions - jQuery.ready(); - } - })(); - } - } - } - return readyList.promise( obj ); -}; - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || type !== "function" && - ( length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj ); -} - -// All jQuery objects should point back to these -rootjQuery = jQuery(document); -/*! - * Sizzle CSS Selector Engine v1.10.2 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2013-07-03 - */ -(function( window, undefined ) { - -var i, - support, - cachedruns, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - hasDuplicate = false, - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rsibling = new RegExp( whitespace + "*[+~]" ), - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - // BMP codepoint - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && context.parentNode || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key += " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Detect xml - * @param {Element|Object} elem An element or a document - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent.attachEvent && parent !== parent.top ) { - parent.attachEvent( "onbeforeunload", function() { - setDocument(); - }); - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = assert(function( div ) { - div.innerHTML = "
      "; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - - // Support: Opera 10-12/IE8 - // ^= $= *= and empty values - // Should not select anything - // Support: Windows 8 Native Apps - // The type attribute is restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "t", "" ); - - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = rnative.test( docElem.contains ) || docElem.compareDocumentPosition ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = docElem.compareDocumentPosition ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b ); - - if ( compare ) { - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } - - // Not directly comparable, sort on existence of method - return a.compareDocumentPosition ? -1 : 1; - } : - function( a, b ) { - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Parentless nodes are either documents or disconnected - } else if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val === undefined ? - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null : - val; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - for ( ; (node = elem[i]); i++ ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (see #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)), - // not comment, processing instructions, or others - // Thanks to Diego Perini for the nodeName shortcut - // Greater than "@" means alpha characters (specifically not starting with "#" or "?") - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( tokens = [] ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var data, cache, outerCache, - dirkey = dirruns + " " + doneName; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) { - if ( (data = cache[1]) === true || data === cachedruns ) { - return data === true; - } - } else { - cache = outerCache[ dir ] = [ dirkey ]; - cache[1] = matcher( elem, context, xml ) || cachedruns; - if ( cache[1] === true ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - // A counter to specify which element is currently being matched - var matcherCachedRuns = 0, - bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, expandContext ) { - var elem, j, matcher, - setMatched = [], - matchedCount = 0, - i = "0", - unmatched = seed && [], - outermost = expandContext != null, - contextBackup = outermostContext, - // We must always have either seed elements or context - elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1); - - if ( outermost ) { - outermostContext = context !== document && context; - cachedruns = matcherCachedRuns; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - for ( ; (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - cachedruns = ++matcherCachedRuns; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && context.parentNode || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - elem[ name ] === true ? name.toLowerCase() : null; - } - }); -} - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - -})( window ); -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var action = tuple[ 0 ], - fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = core_slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value; - if( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); -jQuery.support = (function( support ) { - - var all, a, input, select, fragment, opt, eventName, isSupported, i, - div = document.createElement("div"); - - // Setup - div.setAttribute( "className", "t" ); - div.innerHTML = "
      a"; - - // Finish early in limited (non-browser) environments - all = div.getElementsByTagName("*") || []; - a = div.getElementsByTagName("a")[ 0 ]; - if ( !a || !a.style || !all.length ) { - return support; - } - - // First batch of tests - select = document.createElement("select"); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName("input")[ 0 ]; - - a.style.cssText = "top:1px;float:left;opacity:.5"; - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - support.getSetAttribute = div.className !== "t"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName("tbody").length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName("link").length; - - // Get the style information from getAttribute - // (IE uses .cssText instead) - support.style = /top/.test( a.getAttribute("style") ); - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - support.hrefNormalized = a.getAttribute("href") === "/a"; - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - support.opacity = /^0.5/.test( a.style.opacity ); - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - support.cssFloat = !!a.style.cssFloat; - - // Check the default checkbox/radio value ("" on WebKit; "on" elsewhere) - support.checkOn = !!input.value; - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - support.optSelected = opt.selected; - - // Tests for enctype support on a form (#6743) - support.enctype = !!document.createElement("form").enctype; - - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>"; - - // Will be defined later - support.inlineBlockNeedsLayout = false; - support.shrinkWrapBlocks = false; - support.pixelPosition = false; - support.deleteExpando = true; - support.noCloneEvent = true; - support.reliableMarginRight = true; - support.boxSizingReliable = true; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Support: IE<9 - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - // Check if we can trust getAttribute("value") - input = document.createElement("input"); - input.setAttribute( "value", "" ); - support.input = input.getAttribute( "value" ) === ""; - - // Check if an input maintains its value after becoming a radio - input.value = "t"; - input.setAttribute( "type", "radio" ); - support.radioValue = input.value === "t"; - - // #11217 - WebKit loses check when the name is after the checked attribute - input.setAttribute( "checked", "t" ); - input.setAttribute( "name", "t" ); - - fragment = document.createDocumentFragment(); - fragment.appendChild( input ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - if ( div.attachEvent ) { - div.attachEvent( "onclick", function() { - support.noCloneEvent = false; - }); - - div.cloneNode( true ).click(); - } - - // Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event) - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - for ( i in { submit: true, change: true, focusin: true }) { - div.setAttribute( eventName = "on" + i, "t" ); - - support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false; - } - - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - // Support: IE<9 - // Iteration over object's inherited properties before its own. - for ( i in jQuery( support ) ) { - break; - } - support.ownLast = i !== "0"; - - // Run tests that need a body at doc ready - jQuery(function() { - var container, marginDiv, tds, - divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;", - body = document.getElementsByTagName("body")[0]; - - if ( !body ) { - // Return for frameset docs that don't have a body - return; - } - - container = document.createElement("div"); - container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px"; - - body.appendChild( container ).appendChild( div ); - - // Support: IE8 - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - div.innerHTML = "
      t
      "; - tds = div.getElementsByTagName("td"); - tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none"; - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Support: IE8 - // Check if empty table cells still have offsetWidth/Height - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - - // Check box-sizing and margin behavior. - div.innerHTML = ""; - div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;"; - - // Workaround failing boxSizing test due to offsetWidth returning wrong value - // with some non-1 values of body zoom, ticket #13543 - jQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() { - support.boxSizing = div.offsetWidth === 4; - }); - - // Use window.getComputedStyle because jsdom on node.js will break without it. - if ( window.getComputedStyle ) { - support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%"; - support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px"; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. (#3333) - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - marginDiv = div.appendChild( document.createElement("div") ); - marginDiv.style.cssText = div.style.cssText = divReset; - marginDiv.style.marginRight = marginDiv.style.width = "0"; - div.style.width = "1px"; - - support.reliableMarginRight = - !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight ); - } - - if ( typeof div.style.zoom !== core_strundefined ) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.innerHTML = ""; - div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1"; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); - - // Support: IE6 - // Check if elements with layout shrink-wrap their children - div.style.display = "block"; - div.innerHTML = "
      "; - div.firstChild.style.width = "5px"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); - - if ( support.inlineBlockNeedsLayout ) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; - } - } - - body.removeChild( container ); - - // Null elements to avoid leaks in IE - container = div = tds = marginDiv = null; - }); - - // Null elements to avoid leaks in IE - all = select = fragment = opt = a = input = null; - - return support; -})({}); - -var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, - rmultiDash = /([A-Z])/g; - -function internalData( elem, name, data, pvt /* Internal Use Only */ ){ - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = core_deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; -} - -function internalRemoveData( elem, name, pvt ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } - - i = name.length; - while ( i-- ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( jQuery.support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; - - // When all else fails, null - } else { - cache[ id ] = null; - } -} - -jQuery.extend({ - cache: {}, - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "applet": true, - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data ) { - return internalData( elem, name, data ); - }, - - removeData: function( elem, name ) { - return internalRemoveData( elem, name ); - }, - - // For internal use only. - _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); - }, - - _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - // Do not set data on non-element because it will not be cleared (#8335). - if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) { - return false; - } - - var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ]; - - // nodes accept data unless otherwise specified; rejection can be conditional - return !noData || noData !== true && elem.getAttribute("classid") === noData; - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var attrs, name, - data = null, - i = 0, - elem = this[0]; - - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = jQuery.data( elem ); - - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { - attrs = elem.attributes; - for ( ; i < attrs.length; i++ ) { - name = attrs[i].name; - - if ( name.indexOf("data-") === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - - dataAttr( elem, name, data[ name ] ); - } - } - jQuery._data( elem, "parsedAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - return arguments.length > 1 ? - - // Sets one value - this.each(function() { - jQuery.data( this, key, value ); - }) : - - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null; - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } -}); - -function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = setTimeout( next, time ); - hooks.stop = function() { - clearTimeout( timeout ); - }; - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var nodeHook, boolHook, - rclass = /[\t\r\n\f]/g, - rreturn = /\r/g, - rfocusable = /^(?:input|select|textarea|button|object)$/i, - rclickable = /^(?:a|area)$/i, - ruseDefault = /^(?:checked|selected)$/i, - getSetAttribute = jQuery.support.getSetAttribute, - getSetInput = jQuery.support.input; - -jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call( this, j, this.className ) ); - }); - } - - if ( proceed ) { - // The disjunction here is for better compressibility (see removeClass) - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - " " - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - elem.className = jQuery.trim( cur ); - - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, clazz, j, - i = 0, - len = this.length, - proceed = arguments.length === 0 || typeof value === "string" && value; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call( this, j, this.className ) ); - }); - } - if ( proceed ) { - classes = ( value || "" ).match( core_rnotwhite ) || []; - - for ( ; i < len; i++ ) { - elem = this[ i ]; - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( elem.className ? - ( " " + elem.className + " " ).replace( rclass, " " ) : - "" - ); - - if ( cur ) { - j = 0; - while ( (clazz = classes[j++]) ) { - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) >= 0 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - elem.className = value ? jQuery.trim( cur ) : ""; - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - classNames = value.match( core_rnotwhite ) || []; - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( type === core_strundefined || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // If the element has a class name or if we're passed "false", - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " ", - i = 0, - l = this.length; - for ( ; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var ret, hooks, isFunction, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } -}); - -jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // Use proper attribute retrieval(#6932, #12072) - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - elem.text; - } - }, - select: { - get: function( elem ) { - var value, option, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one" || index < 0, - values = one ? null : [], - max = one ? index + 1 : options.length, - i = index < 0 ? - max : - one ? index : 0; - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // oldIE doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - // Don't return options that are disabled or in a disabled optgroup - ( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) && - ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) { - optionSet = true; - } - } - - // force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attr: function( elem, name, value ) { - var hooks, ret, - nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === core_strundefined ) { - return jQuery.prop( elem, name, value ); - } - - // All attributes are lowercase - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - name = name.toLowerCase(); - hooks = jQuery.attrHooks[ name ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook ); - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - - } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, value + "" ); - return value; - } - - } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, value ) { - var name, propName, - i = 0, - attrNames = value && value.match( core_rnotwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( (name = attrNames[i++]) ) { - propName = jQuery.propFix[ name ] || name; - - // Boolean attributes get special treatment (#10870) - if ( jQuery.expr.match.bool.test( name ) ) { - // Set corresponding property to false - if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - elem[ propName ] = false; - // Support: IE<9 - // Also clear defaultChecked/defaultSelected (if appropriate) - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = - elem[ propName ] = false; - } - - // See #9699 for explanation of this approach (setting first, then removal) - } else { - jQuery.attr( elem, name, "" ); - } - - elem.removeAttribute( getSetAttribute ? name : propName ); - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to default in case type is set after value during creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - }, - - prop: function( elem, name, value ) { - var ret, hooks, notxml, - nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ? - ret : - ( elem[ name ] = value ); - - } else { - return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ? - ret : - elem[ name ]; - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - return tabindex ? - parseInt( tabindex, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - -1; - } - } - } -}); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) { - // IE<8 needs the *property* name - elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name ); - - // Use defaultChecked and defaultSelected for oldIE - } else { - elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true; - } - - return name; - } -}; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = jQuery.expr.attrHandle[ name ] || jQuery.find.attr; - - jQuery.expr.attrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ? - function( elem, name, isXML ) { - var fn = jQuery.expr.attrHandle[ name ], - ret = isXML ? - undefined : - /* jshint eqeqeq: false */ - (jQuery.expr.attrHandle[ name ] = undefined) != - getter( elem, name, isXML ) ? - - name.toLowerCase() : - null; - jQuery.expr.attrHandle[ name ] = fn; - return ret; - } : - function( elem, name, isXML ) { - return isXML ? - undefined : - elem[ jQuery.camelCase( "default-" + name ) ] ? - name.toLowerCase() : - null; - }; -}); - -// fix oldIE attroperties -if ( !getSetInput || !getSetAttribute ) { - jQuery.attrHooks.value = { - set: function( elem, value, name ) { - if ( jQuery.nodeName( elem, "input" ) ) { - // Does not return so that setAttribute is also used - elem.defaultValue = value; - } else { - // Use nodeHook if defined (#1954); otherwise setAttribute is fine - return nodeHook && nodeHook.set( elem, value, name ); - } - } - }; -} - -// IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !getSetAttribute ) { - - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = { - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - elem.setAttributeNode( - (ret = elem.ownerDocument.createAttribute( name )) - ); - } - - ret.value = value += ""; - - // Break association with cloned elements by also using setAttribute (#9646) - return name === "value" || value === elem.getAttribute( name ) ? - value : - undefined; - } - }; - jQuery.expr.attrHandle.id = jQuery.expr.attrHandle.name = jQuery.expr.attrHandle.coords = - // Some attributes are constructed with empty-string values when not defined - function( elem, name, isXML ) { - var ret; - return isXML ? - undefined : - (ret = elem.getAttributeNode( name )) && ret.value !== "" ? - ret.value : - null; - }; - jQuery.valHooks.button = { - get: function( elem, name ) { - var ret = elem.getAttributeNode( name ); - return ret && ret.specified ? - ret.value : - undefined; - }, - set: nodeHook.set - }; - - // Set contenteditable to false on removals(#10429) - // Setting to empty string throws an error as an invalid value - jQuery.attrHooks.contenteditable = { - set: function( elem, value, name ) { - nodeHook.set( elem, value === "" ? false : value, name ); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }; - }); -} - - -// Some attributes require a special call on IE -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !jQuery.support.hrefNormalized ) { - // href/src property should get the full normalized URL (#10299/#12915) - jQuery.each([ "href", "src" ], function( i, name ) { - jQuery.propHooks[ name ] = { - get: function( elem ) { - return elem.getAttribute( name, 4 ); - } - }; - }); -} - -if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Note: IE uppercases css property names, but if we were to .toLowerCase() - // .cssText, that would destroy case senstitivity in URL's, like in "background" - return elem.style.cssText || undefined; - }, - set: function( elem, value ) { - return ( elem.style.cssText = value + "" ); - } - }; -} - -// Safari mis-reports the default selected property of an option -// Accessing the parent's selectedIndex property fixes it -if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }; -} - -jQuery.each([ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -}); - -// IE6/7 call enctype encoding -if ( !jQuery.support.enctype ) { - jQuery.propFix.enctype = "encoding"; -} - -// Radios and checkboxes getter/setter -jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); - } - } - }; - if ( !jQuery.support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - // Support: Webkit - // "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - }; - } -}); -var rformElems = /^(?:input|select|textarea)$/i, - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; - }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener/attachEvent if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( core_rnotwhite ) || [""]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, - eventPath = [ elem || document ], - type = core_hasOwn.call( event, "type" ) ? event.type : event, - namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) { - event.preventDefault(); - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, ret, handleObj, matched, j, - handlerQueue = [], - args = core_slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var sel, handleObj, matches, i, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Even when returnValue equals to undefined Firefox will still show alert - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === core_strundefined ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - if ( !e ) { - return; - } - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// IE submit delegation -if ( !jQuery.support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "submitBubbles" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "submitBubbles", true ); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !jQuery.support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "changeBubbles", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - -// Create "bubbling" focus and blur events -if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0, - handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var type, origFn; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); -var isSimple = /^.[^:#\[\.,]*$/, - rparentsprev = /^(?:parents|prev(?:Until|All))/, - rneedsContext = jQuery.expr.match.needsContext, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - ret = [], - self = this, - len = self.length; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - - has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; - - return this.filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - ret = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - cur = ret.push( cur ); - break; - } - } - } - - return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( jQuery.unique(all) ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - ret = jQuery.unique( ret ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); - } - } - - return this.pushStack( ret ); - }; -}); - -jQuery.extend({ - filter: function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } - - return r; - } -}); - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( isSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; - }); -} -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rtbody = /\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - option: [ 1, "" ], - legend: [ 1, "
      ", "
      " ], - area: [ 1, "", "" ], - param: [ 1, "", "" ], - thead: [ 1, "", "
      " ], - tr: [ 2, "", "
      " ], - col: [ 2, "", "
      " ], - td: [ 3, "", "
      " ], - - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
      ", "
      " ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); - -wrapMap.optgroup = wrapMap.option; -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -jQuery.fn.extend({ - text: function( value ) { - return jQuery.access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - // keepData is for internal use only--do not document - remove: function( selector, keepData ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } - - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function () { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return jQuery.access( this, function( value ) { - var elem = this[0] || {}, - i = 0, - l = this.length; - - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( jQuery.support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for (; i < l; i++ ) { - // Remove element nodes and prevent memory leaks - elem = this[i] || {}; - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch(e) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var - // Snapshot the DOM in case .domManip sweeps something relevant into its fragment - args = jQuery.map( this, function( elem ) { - return [ elem.nextSibling, elem.parentNode ]; - }), - i = 0; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - var next = args[ i++ ], - parent = args[ i++ ]; - - if ( parent ) { - // Don't use the snapshot next if it has moved (#13810) - if ( next && next.parentNode !== parent ) { - next = this.nextSibling; - } - jQuery( this ).remove(); - parent.insertBefore( elem, next ); - } - // Allow new content to include elements from the context set - }, true ); - - // Force removal if there was no new content (e.g., from empty arguments) - return i ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback, allowIntersection ) { - - // Flatten any nested arrays - args = core_concat.apply( [], args ); - - var first, node, hasScripts, - scripts, doc, fragment, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[0], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[0] = value.call( this, index, self.html() ); - } - self.domManip( args, callback, allowIntersection ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, !allowIntersection && this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[i], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Hope ajax is available... - jQuery._evalUrl( node.src ); - } else { - jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); - } - } - } - } - - // Fix #11809: Avoid leaking memory - fragment = first = null; - } - } - - return this; - } -}); - -// Support: IE<8 -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType === 1 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - if ( match ) { - elem.type = match[1]; - } else { - elem.removeAttribute("type"); - } - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; (elem = elems[i]) != null; i++ ) { - jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); - } -} - -function cloneCopyEvent( src, dest ) { - - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { - return; - } - - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; - - if ( events ) { - delete curData.handle; - curData.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); - - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); - - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); - } - - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set - - dest.defaultChecked = dest.checked = src.checked; - - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } - - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; - - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - i = 0, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone(true); - jQuery( insert[i] )[ original ]( elems ); - - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() - core_push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) : - undefined; - - if ( !found ) { - for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { - if ( !tag || jQuery.nodeName( elem, tag ) ) { - found.push( elem ); - } else { - jQuery.merge( found, getAll( elem, tag ) ); - } - } - } - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} - -// Used in buildFragment, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( manipulation_rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, - inPage = jQuery.contains( elem.ownerDocument, elem ); - - if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - // Fix all IE cloning issues - for ( i = 0; (node = srcElements[i]) != null; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - fixCloneNodeIssues( node, destElements[i] ); - } - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0; (node = srcElements[i]) != null; i++ ) { - cloneCopyEvent( node, destElements[i] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - destElements = srcElements = node = null; - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - - nodes = [], - i = 0; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || safe.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; - - // Descend through wrappers to the right content - j = wrap[0]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Manually add leading whitespace removed by IE - if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); - } - - // Remove IE's autoinserted from table fragments - if ( !jQuery.support.tbody ) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
      " && !rtbody.test( elem ) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { - elem.removeChild( tbody ); - } - } - } - - jQuery.merge( nodes, tmp.childNodes ); - - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } - - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; - } - } - } - - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !jQuery.support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - tmp = null; - - return safe; - }, - - cleanData: function( elems, /* internal */ acceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = jQuery.support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - - if ( acceptData || jQuery.acceptData( elem ) ) { - - id = elem[ internalKey ]; - data = id && cache[ id ]; - - if ( data ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( typeof elem.removeAttribute !== core_strundefined ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - core_deletedIds.push( id ); - } - } - } - } - }, - - _evalUrl: function( url ) { - return jQuery.ajax({ - url: url, - type: "GET", - dataType: "script", - async: false, - global: false, - "throws": true - }); - } -}); -jQuery.fn.extend({ - wrapAll: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapAll( html.call(this, i) ); - }); - } - - if ( this[0] ) { - // The elements to wrap the target around - var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true); - - if ( this[0].parentNode ) { - wrap.insertBefore( this[0] ); - } - - wrap.map(function() { - var elem = this; - - while ( elem.firstChild && elem.firstChild.nodeType === 1 ) { - elem = elem.firstChild; - } - - return elem; - }).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each(function(i) { - jQuery(this).wrapInner( html.call(this, i) ); - }); - } - - return this.each(function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - }); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each(function(i) { - jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html ); - }); - }, - - unwrap: function() { - return this.parent().each(function() { - if ( !jQuery.nodeName( this, "body" ) ) { - jQuery( this ).replaceWith( this.childNodes ); - } - }).end(); - } -}); -var iframe, getStyles, curCSS, - ralpha = /alpha\([^)]*\)/i, - ropacity = /opacity\s*=\s*([^)]*)/, - rposition = /^(top|right|bottom|left)$/, - // swappable if display is none or starts with table except "table", "table-cell", or "table-caption" - // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rmargin = /^margin/, - rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ), - rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ), - rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ), - elemdisplay = { BODY: "block" }, - - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: 0, - fontWeight: 400 - }, - - cssExpand = [ "Top", "Right", "Bottom", "Left" ], - cssPrefixes = [ "Webkit", "O", "Moz", "ms" ]; - -// return a css property mapped to a potentially vendor prefixed property -function vendorPropName( style, name ) { - - // shortcut for names that are not vendor prefixed - if ( name in style ) { - return name; - } - - // check for vendor prefixed names - var capName = name.charAt(0).toUpperCase() + name.slice(1), - origName = name, - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in style ) { - return name; - } - } - - return origName; -} - -function isHidden( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); -} - -function showHide( elements, show ) { - var display, elem, hidden, - values = [], - index = 0, - length = elements.length; - - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - values[ index ] = jQuery._data( elem, "olddisplay" ); - display = elem.style.display; - if ( show ) { - // Reset the inline display of this element to learn if it is - // being hidden by cascaded rules or not - if ( !values[ index ] && display === "none" ) { - elem.style.display = ""; - } - - // Set elements which have been overridden with display: none - // in a stylesheet to whatever the default browser style is - // for such an element - if ( elem.style.display === "" && isHidden( elem ) ) { - values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) ); - } - } else { - - if ( !values[ index ] ) { - hidden = isHidden( elem ); - - if ( display && display !== "none" || !hidden ) { - jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) ); - } - } - } - } - - // Set the display of most of the elements in a second loop - // to avoid the constant reflow - for ( index = 0; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - if ( !show || elem.style.display === "none" || elem.style.display === "" ) { - elem.style.display = show ? values[ index ] || "" : "none"; - } - } - - return elements; -} - -jQuery.fn.extend({ - css: function( name, value ) { - return jQuery.access( this, function( elem, name, value ) { - var len, styles, - map = {}, - i = 0; - - if ( jQuery.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - }, - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each(function() { - if ( isHidden( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - }); - } -}); - -jQuery.extend({ - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "columnCount": true, - "fillOpacity": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - // normalize float css property - "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - style = elem.style; - - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // convert relative number strings (+= or -=) to relative numbers. #7345 - if ( type === "string" && (ret = rrelNum.exec( value )) ) { - value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) ); - // Fixes bug #9237 - type = "number"; - } - - // Make sure that NaN and null values aren't set. See: #7116 - if ( value == null || type === "number" && isNaN( value ) ) { - return; - } - - // If a number was passed in, add 'px' to the (except for certain CSS properties) - if ( type === "number" && !jQuery.cssNumber[ origName ] ) { - value += "px"; - } - - // Fixes #8908, it can be done more correctly by specifing setters in cssHooks, - // but it would mean to define eight (for every problematic property) identical functions - if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) { - - // Wrapped to prevent IE from throwing errors when 'invalid' values are provided - // Fixes bug #5509 - try { - style[ name ] = value; - } catch(e) {} - } - - } else { - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) { - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var num, val, hooks, - origName = jQuery.camelCase( name ); - - // Make sure that we're working with the right name - name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) ); - - // gets hook for the prefixed version - // followed by the unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - //convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Return, converting to number if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || jQuery.isNumeric( num ) ? num || 0 : val; - } - return val; - } -}); - -// NOTE: we've included the "window" in window.getComputedStyle -// because jsdom on node.js will break without it. -if ( window.getComputedStyle ) { - getStyles = function( elem ) { - return window.getComputedStyle( elem, null ); - }; - - curCSS = function( elem, name, _computed ) { - var width, minWidth, maxWidth, - computed = _computed || getStyles( elem ), - - // getPropertyValue is only needed for .css('filter') in IE9, see #12537 - ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined, - style = elem.style; - - if ( computed ) { - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right - // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels - // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values - if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret; - }; -} else if ( document.documentElement.currentStyle ) { - getStyles = function( elem ) { - return elem.currentStyle; - }; - - curCSS = function( elem, name, _computed ) { - var left, rs, rsLeft, - computed = _computed || getStyles( elem ), - ret = computed ? computed[ name ] : undefined, - style = elem.style; - - // Avoid setting ret to empty string here - // so we don't default to auto - if ( ret == null && style && style[ name ] ) { - ret = style[ name ]; - } - - // From the awesome hack by Dean Edwards - // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 - - // If we're not dealing with a regular pixel number - // but a number that has a weird ending, we need to convert it to pixels - // but not position css attributes, as those are proportional to the parent element instead - // and we can't measure the parent instead because it might trigger a "stacking dolls" problem - if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) { - - // Remember the original values - left = style.left; - rs = elem.runtimeStyle; - rsLeft = rs && rs.left; - - // Put in the new values to get a computed value out - if ( rsLeft ) { - rs.left = elem.currentStyle.left; - } - style.left = name === "fontSize" ? "1em" : ret; - ret = style.pixelLeft + "px"; - - // Revert the changed values - style.left = left; - if ( rsLeft ) { - rs.left = rsLeft; - } - } - - return ret === "" ? "auto" : ret; - }; -} - -function setPositiveNumber( elem, value, subtract ) { - var matches = rnumsplit.exec( value ); - return matches ? - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i = extra === ( isBorderBox ? "border" : "content" ) ? - // If we already have the right measurement, avoid augmentation - 4 : - // Otherwise initialize for horizontal or vertical properties - name === "width" ? 1 : 0, - - val = 0; - - for ( ; i < 4; i += 2 ) { - // both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // at this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - // at this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // at this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with offset property, which is equivalent to the border-box value - var valueIsBorderBox = true, - val = name === "width" ? elem.offsetWidth : elem.offsetHeight, - styles = getStyles( elem ), - isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // some non-html elements return undefined for offsetWidth, so check for null/undefined - // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285 - // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668 - if ( val <= 0 || val == null ) { - // Fall back to computed then uncomputed css if necessary - val = curCSS( elem, name, styles ); - if ( val < 0 || val == null ) { - val = elem.style[ name ]; - } - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test(val) ) { - return val; - } - - // we need the check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] ); - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - } - - // use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -// Try to determine the default display value of an element -function css_defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - // Use the already-created iframe if possible - iframe = ( iframe || - jQuery("