1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861 |
- 'use strict';
- ((function (global) {
- const performance = global['performance'];
- function mark(name) {
- performance && performance['mark'] && performance['mark'](name);
- }
- function performanceMeasure(name, label) {
- performance && performance['measure'] && performance['measure'](name, label);
- }
- mark('Zone');
-
-
-
- const symbolPrefix = global['__Zone_symbol_prefix'] || '__zone_symbol__';
- function __symbol__(name) {
- return symbolPrefix + name;
- }
- const checkDuplicate = global[__symbol__('forceDuplicateZoneCheck')] === true;
- if (global['Zone']) {
-
-
-
-
-
-
-
-
-
- if (checkDuplicate || typeof global['Zone'].__symbol__ !== 'function') {
- throw new Error('Zone already loaded.');
- }
- else {
- return global['Zone'];
- }
- }
- class Zone {
-
- static { this.__symbol__ = __symbol__; }
- static assertZonePatched() {
- if (global['Promise'] !== patches['ZoneAwarePromise']) {
- throw new Error('Zone.js has detected that ZoneAwarePromise `(window|global).Promise` ' +
- 'has been overwritten.\n' +
- 'Most likely cause is that a Promise polyfill has been loaded ' +
- 'after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. ' +
- 'If you must load one, do so before loading zone.js.)');
- }
- }
- static get root() {
- let zone = Zone.current;
- while (zone.parent) {
- zone = zone.parent;
- }
- return zone;
- }
- static get current() {
- return _currentZoneFrame.zone;
- }
- static get currentTask() {
- return _currentTask;
- }
-
- static __load_patch(name, fn, ignoreDuplicate = false) {
- if (patches.hasOwnProperty(name)) {
-
-
-
- if (!ignoreDuplicate && checkDuplicate) {
- throw Error('Already loaded patch: ' + name);
- }
- }
- else if (!global['__Zone_disable_' + name]) {
- const perfName = 'Zone:' + name;
- mark(perfName);
- patches[name] = fn(global, Zone, _api);
- performanceMeasure(perfName, perfName);
- }
- }
- get parent() {
- return this._parent;
- }
- get name() {
- return this._name;
- }
- constructor(parent, zoneSpec) {
- this._parent = parent;
- this._name = zoneSpec ? zoneSpec.name || 'unnamed' : '<root>';
- this._properties = zoneSpec && zoneSpec.properties || {};
- this._zoneDelegate =
- new _ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
- }
- get(key) {
- const zone = this.getZoneWith(key);
- if (zone)
- return zone._properties[key];
- }
- getZoneWith(key) {
- let current = this;
- while (current) {
- if (current._properties.hasOwnProperty(key)) {
- return current;
- }
- current = current._parent;
- }
- return null;
- }
- fork(zoneSpec) {
- if (!zoneSpec)
- throw new Error('ZoneSpec required!');
- return this._zoneDelegate.fork(this, zoneSpec);
- }
- wrap(callback, source) {
- if (typeof callback !== 'function') {
- throw new Error('Expecting function got: ' + callback);
- }
- const _callback = this._zoneDelegate.intercept(this, callback, source);
- const zone = this;
- return function () {
- return zone.runGuarded(_callback, this, arguments, source);
- };
- }
- run(callback, applyThis, applyArgs, source) {
- _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
- try {
- return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
- }
- finally {
- _currentZoneFrame = _currentZoneFrame.parent;
- }
- }
- runGuarded(callback, applyThis = null, applyArgs, source) {
- _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
- try {
- try {
- return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
- }
- catch (error) {
- if (this._zoneDelegate.handleError(this, error)) {
- throw error;
- }
- }
- }
- finally {
- _currentZoneFrame = _currentZoneFrame.parent;
- }
- }
- runTask(task, applyThis, applyArgs) {
- if (task.zone != this) {
- throw new Error('A task can only be run in the zone of creation! (Creation: ' +
- (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
- }
-
-
-
- if (task.state === notScheduled && (task.type === eventTask || task.type === macroTask)) {
- return;
- }
- const reEntryGuard = task.state != running;
- reEntryGuard && task._transitionTo(running, scheduled);
- task.runCount++;
- const previousTask = _currentTask;
- _currentTask = task;
- _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
- try {
- if (task.type == macroTask && task.data && !task.data.isPeriodic) {
- task.cancelFn = undefined;
- }
- try {
- return this._zoneDelegate.invokeTask(this, task, applyThis, applyArgs);
- }
- catch (error) {
- if (this._zoneDelegate.handleError(this, error)) {
- throw error;
- }
- }
- }
- finally {
-
-
- if (task.state !== notScheduled && task.state !== unknown) {
- if (task.type == eventTask || (task.data && task.data.isPeriodic)) {
- reEntryGuard && task._transitionTo(scheduled, running);
- }
- else {
- task.runCount = 0;
- this._updateTaskCount(task, -1);
- reEntryGuard &&
- task._transitionTo(notScheduled, running, notScheduled);
- }
- }
- _currentZoneFrame = _currentZoneFrame.parent;
- _currentTask = previousTask;
- }
- }
- scheduleTask(task) {
- if (task.zone && task.zone !== this) {
-
-
- let newZone = this;
- while (newZone) {
- if (newZone === task.zone) {
- throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);
- }
- newZone = newZone.parent;
- }
- }
- task._transitionTo(scheduling, notScheduled);
- const zoneDelegates = [];
- task._zoneDelegates = zoneDelegates;
- task._zone = this;
- try {
- task = this._zoneDelegate.scheduleTask(this, task);
- }
- catch (err) {
-
-
- task._transitionTo(unknown, scheduling, notScheduled);
-
- this._zoneDelegate.handleError(this, err);
- throw err;
- }
- if (task._zoneDelegates === zoneDelegates) {
-
- this._updateTaskCount(task, 1);
- }
- if (task.state == scheduling) {
- task._transitionTo(scheduled, scheduling);
- }
- return task;
- }
- scheduleMicroTask(source, callback, data, customSchedule) {
- return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, undefined));
- }
- scheduleMacroTask(source, callback, data, customSchedule, customCancel) {
- return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
- }
- scheduleEventTask(source, callback, data, customSchedule, customCancel) {
- return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
- }
- cancelTask(task) {
- if (task.zone != this)
- throw new Error('A task can only be cancelled in the zone of creation! (Creation: ' +
- (task.zone || NO_ZONE).name + '; Execution: ' + this.name + ')');
- if (task.state !== scheduled && task.state !== running) {
- return;
- }
- task._transitionTo(canceling, scheduled, running);
- try {
- this._zoneDelegate.cancelTask(this, task);
- }
- catch (err) {
-
- task._transitionTo(unknown, canceling);
- this._zoneDelegate.handleError(this, err);
- throw err;
- }
- this._updateTaskCount(task, -1);
- task._transitionTo(notScheduled, canceling);
- task.runCount = 0;
- return task;
- }
- _updateTaskCount(task, count) {
- const zoneDelegates = task._zoneDelegates;
- if (count == -1) {
- task._zoneDelegates = null;
- }
- for (let i = 0; i < zoneDelegates.length; i++) {
- zoneDelegates[i]._updateTaskCount(task.type, count);
- }
- }
- }
- const DELEGATE_ZS = {
- name: '',
- onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),
- onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),
- onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),
- onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task)
- };
- class _ZoneDelegate {
- constructor(zone, parentDelegate, zoneSpec) {
- this._taskCounts = { 'microTask': 0, 'macroTask': 0, 'eventTask': 0 };
- this.zone = zone;
- this._parentDelegate = parentDelegate;
- this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
- this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
- this._forkCurrZone =
- zoneSpec && (zoneSpec.onFork ? this.zone : parentDelegate._forkCurrZone);
- this._interceptZS =
- zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
- this._interceptDlgt =
- zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
- this._interceptCurrZone =
- zoneSpec && (zoneSpec.onIntercept ? this.zone : parentDelegate._interceptCurrZone);
- this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
- this._invokeDlgt =
- zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
- this._invokeCurrZone =
- zoneSpec && (zoneSpec.onInvoke ? this.zone : parentDelegate._invokeCurrZone);
- this._handleErrorZS =
- zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
- this._handleErrorDlgt =
- zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
- this._handleErrorCurrZone =
- zoneSpec && (zoneSpec.onHandleError ? this.zone : parentDelegate._handleErrorCurrZone);
- this._scheduleTaskZS =
- zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
- this._scheduleTaskDlgt = zoneSpec &&
- (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
- this._scheduleTaskCurrZone =
- zoneSpec && (zoneSpec.onScheduleTask ? this.zone : parentDelegate._scheduleTaskCurrZone);
- this._invokeTaskZS =
- zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
- this._invokeTaskDlgt =
- zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
- this._invokeTaskCurrZone =
- zoneSpec && (zoneSpec.onInvokeTask ? this.zone : parentDelegate._invokeTaskCurrZone);
- this._cancelTaskZS =
- zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
- this._cancelTaskDlgt =
- zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
- this._cancelTaskCurrZone =
- zoneSpec && (zoneSpec.onCancelTask ? this.zone : parentDelegate._cancelTaskCurrZone);
- this._hasTaskZS = null;
- this._hasTaskDlgt = null;
- this._hasTaskDlgtOwner = null;
- this._hasTaskCurrZone = null;
- const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
- const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
- if (zoneSpecHasTask || parentHasTask) {
-
-
- this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
- this._hasTaskDlgt = parentDelegate;
- this._hasTaskDlgtOwner = this;
- this._hasTaskCurrZone = zone;
- if (!zoneSpec.onScheduleTask) {
- this._scheduleTaskZS = DELEGATE_ZS;
- this._scheduleTaskDlgt = parentDelegate;
- this._scheduleTaskCurrZone = this.zone;
- }
- if (!zoneSpec.onInvokeTask) {
- this._invokeTaskZS = DELEGATE_ZS;
- this._invokeTaskDlgt = parentDelegate;
- this._invokeTaskCurrZone = this.zone;
- }
- if (!zoneSpec.onCancelTask) {
- this._cancelTaskZS = DELEGATE_ZS;
- this._cancelTaskDlgt = parentDelegate;
- this._cancelTaskCurrZone = this.zone;
- }
- }
- }
- fork(targetZone, zoneSpec) {
- return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) :
- new Zone(targetZone, zoneSpec);
- }
- intercept(targetZone, callback, source) {
- return this._interceptZS ?
- this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) :
- callback;
- }
- invoke(targetZone, callback, applyThis, applyArgs, source) {
- return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) :
- callback.apply(applyThis, applyArgs);
- }
- handleError(targetZone, error) {
- return this._handleErrorZS ?
- this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) :
- true;
- }
- scheduleTask(targetZone, task) {
- let returnTask = task;
- if (this._scheduleTaskZS) {
- if (this._hasTaskZS) {
- returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
- }
-
- returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
-
- if (!returnTask)
- returnTask = task;
- }
- else {
- if (task.scheduleFn) {
- task.scheduleFn(task);
- }
- else if (task.type == microTask) {
- scheduleMicroTask(task);
- }
- else {
- throw new Error('Task is missing scheduleFn.');
- }
- }
- return returnTask;
- }
- invokeTask(targetZone, task, applyThis, applyArgs) {
- return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) :
- task.callback.apply(applyThis, applyArgs);
- }
- cancelTask(targetZone, task) {
- let value;
- if (this._cancelTaskZS) {
- value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
- }
- else {
- if (!task.cancelFn) {
- throw Error('Task is not cancelable');
- }
- value = task.cancelFn(task);
- }
- return value;
- }
- hasTask(targetZone, isEmpty) {
-
-
- try {
- this._hasTaskZS &&
- this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
- }
- catch (err) {
- this.handleError(targetZone, err);
- }
- }
-
- _updateTaskCount(type, count) {
- const counts = this._taskCounts;
- const prev = counts[type];
- const next = counts[type] = prev + count;
- if (next < 0) {
- throw new Error('More tasks executed then were scheduled.');
- }
- if (prev == 0 || next == 0) {
- const isEmpty = {
- microTask: counts['microTask'] > 0,
- macroTask: counts['macroTask'] > 0,
- eventTask: counts['eventTask'] > 0,
- change: type
- };
- this.hasTask(this.zone, isEmpty);
- }
- }
- }
- class ZoneTask {
- constructor(type, source, callback, options, scheduleFn, cancelFn) {
-
- this._zone = null;
- this.runCount = 0;
-
- this._zoneDelegates = null;
-
- this._state = 'notScheduled';
- this.type = type;
- this.source = source;
- this.data = options;
- this.scheduleFn = scheduleFn;
- this.cancelFn = cancelFn;
- if (!callback) {
- throw new Error('callback is not defined');
- }
- this.callback = callback;
- const self = this;
-
- if (type === eventTask && options && options.useG) {
- this.invoke = ZoneTask.invokeTask;
- }
- else {
- this.invoke = function () {
- return ZoneTask.invokeTask.call(global, self, this, arguments);
- };
- }
- }
- static invokeTask(task, target, args) {
- if (!task) {
- task = this;
- }
- _numberOfNestedTaskFrames++;
- try {
- task.runCount++;
- return task.zone.runTask(task, target, args);
- }
- finally {
- if (_numberOfNestedTaskFrames == 1) {
- drainMicroTaskQueue();
- }
- _numberOfNestedTaskFrames--;
- }
- }
- get zone() {
- return this._zone;
- }
- get state() {
- return this._state;
- }
- cancelScheduleRequest() {
- this._transitionTo(notScheduled, scheduling);
- }
-
- _transitionTo(toState, fromState1, fromState2) {
- if (this._state === fromState1 || this._state === fromState2) {
- this._state = toState;
- if (toState == notScheduled) {
- this._zoneDelegates = null;
- }
- }
- else {
- throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? ' or \'' + fromState2 + '\'' : ''}, was '${this._state}'.`);
- }
- }
- toString() {
- if (this.data && typeof this.data.handleId !== 'undefined') {
- return this.data.handleId.toString();
- }
- else {
- return Object.prototype.toString.call(this);
- }
- }
-
-
- toJSON() {
- return {
- type: this.type,
- state: this.state,
- source: this.source,
- zone: this.zone.name,
- runCount: this.runCount
- };
- }
- }
-
-
-
-
-
- const symbolSetTimeout = __symbol__('setTimeout');
- const symbolPromise = __symbol__('Promise');
- const symbolThen = __symbol__('then');
- let _microTaskQueue = [];
- let _isDrainingMicrotaskQueue = false;
- let nativeMicroTaskQueuePromise;
- function nativeScheduleMicroTask(func) {
- if (!nativeMicroTaskQueuePromise) {
- if (global[symbolPromise]) {
- nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
- }
- }
- if (nativeMicroTaskQueuePromise) {
- let nativeThen = nativeMicroTaskQueuePromise[symbolThen];
- if (!nativeThen) {
-
-
- nativeThen = nativeMicroTaskQueuePromise['then'];
- }
- nativeThen.call(nativeMicroTaskQueuePromise, func);
- }
- else {
- global[symbolSetTimeout](func, 0);
- }
- }
- function scheduleMicroTask(task) {
-
-
- if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
-
- nativeScheduleMicroTask(drainMicroTaskQueue);
- }
- task && _microTaskQueue.push(task);
- }
- function drainMicroTaskQueue() {
- if (!_isDrainingMicrotaskQueue) {
- _isDrainingMicrotaskQueue = true;
- while (_microTaskQueue.length) {
- const queue = _microTaskQueue;
- _microTaskQueue = [];
- for (let i = 0; i < queue.length; i++) {
- const task = queue[i];
- try {
- task.zone.runTask(task, null, null);
- }
- catch (error) {
- _api.onUnhandledError(error);
- }
- }
- }
- _api.microtaskDrainDone();
- _isDrainingMicrotaskQueue = false;
- }
- }
-
-
-
-
-
- const NO_ZONE = { name: 'NO ZONE' };
- const notScheduled = 'notScheduled', scheduling = 'scheduling', scheduled = 'scheduled', running = 'running', canceling = 'canceling', unknown = 'unknown';
- const microTask = 'microTask', macroTask = 'macroTask', eventTask = 'eventTask';
- const patches = {};
- const _api = {
- symbol: __symbol__,
- currentZoneFrame: () => _currentZoneFrame,
- onUnhandledError: noop,
- microtaskDrainDone: noop,
- scheduleMicroTask: scheduleMicroTask,
- showUncaughtError: () => !Zone[__symbol__('ignoreConsoleErrorUncaughtError')],
- patchEventTarget: () => [],
- patchOnProperties: noop,
- patchMethod: () => noop,
- bindArguments: () => [],
- patchThen: () => noop,
- patchMacroTask: () => noop,
- patchEventPrototype: () => noop,
- isIEOrEdge: () => false,
- getGlobalObjects: () => undefined,
- ObjectDefineProperty: () => noop,
- ObjectGetOwnPropertyDescriptor: () => undefined,
- ObjectCreate: () => undefined,
- ArraySlice: () => [],
- patchClass: () => noop,
- wrapWithCurrentZone: () => noop,
- filterProperties: () => [],
- attachOriginToPatched: () => noop,
- _redefineProperty: () => noop,
- patchCallbacks: () => noop,
- nativeScheduleMicroTask: nativeScheduleMicroTask
- };
- let _currentZoneFrame = { parent: null, zone: new Zone(null, null) };
- let _currentTask = null;
- let _numberOfNestedTaskFrames = 0;
- function noop() { }
- performanceMeasure('Zone', 'Zone');
- return global['Zone'] = Zone;
- }))(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
- const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
- const ObjectDefineProperty = Object.defineProperty;
- const ObjectGetPrototypeOf = Object.getPrototypeOf;
- const ObjectCreate = Object.create;
- const ArraySlice = Array.prototype.slice;
- const ADD_EVENT_LISTENER_STR = 'addEventListener';
- const REMOVE_EVENT_LISTENER_STR = 'removeEventListener';
- const ZONE_SYMBOL_ADD_EVENT_LISTENER = Zone.__symbol__(ADD_EVENT_LISTENER_STR);
- const ZONE_SYMBOL_REMOVE_EVENT_LISTENER = Zone.__symbol__(REMOVE_EVENT_LISTENER_STR);
- const TRUE_STR = 'true';
- const FALSE_STR = 'false';
- const ZONE_SYMBOL_PREFIX = Zone.__symbol__('');
- function wrapWithCurrentZone(callback, source) {
- return Zone.current.wrap(callback, source);
- }
- function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
- return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
- }
- const zoneSymbol = Zone.__symbol__;
- const isWindowExists = typeof window !== 'undefined';
- const internalWindow = isWindowExists ? window : undefined;
- const _global = isWindowExists && internalWindow || typeof self === 'object' && self || global;
- const REMOVE_ATTRIBUTE = 'removeAttribute';
- function bindArguments(args, source) {
- for (let i = args.length - 1; i >= 0; i--) {
- if (typeof args[i] === 'function') {
- args[i] = wrapWithCurrentZone(args[i], source + '_' + i);
- }
- }
- return args;
- }
- function patchPrototype(prototype, fnNames) {
- const source = prototype.constructor['name'];
- for (let i = 0; i < fnNames.length; i++) {
- const name = fnNames[i];
- const delegate = prototype[name];
- if (delegate) {
- const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name);
- if (!isPropertyWritable(prototypeDesc)) {
- continue;
- }
- prototype[name] = ((delegate) => {
- const patched = function () {
- return delegate.apply(this, bindArguments(arguments, source + '.' + name));
- };
- attachOriginToPatched(patched, delegate);
- return patched;
- })(delegate);
- }
- }
- }
- function isPropertyWritable(propertyDesc) {
- if (!propertyDesc) {
- return true;
- }
- if (propertyDesc.writable === false) {
- return false;
- }
- return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');
- }
- const isWebWorker = (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope);
- const isNode = (!('nw' in _global) && typeof _global.process !== 'undefined' &&
- {}.toString.call(_global.process) === '[object process]');
- const isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow['HTMLElement']);
- const isMix = typeof _global.process !== 'undefined' &&
- {}.toString.call(_global.process) === '[object process]' && !isWebWorker &&
- !!(isWindowExists && internalWindow['HTMLElement']);
- const zoneSymbolEventNames$1 = {};
- const wrapFn = function (event) {
-
-
- event = event || _global.event;
- if (!event) {
- return;
- }
- let eventNameSymbol = zoneSymbolEventNames$1[event.type];
- if (!eventNameSymbol) {
- eventNameSymbol = zoneSymbolEventNames$1[event.type] = zoneSymbol('ON_PROPERTY' + event.type);
- }
- const target = this || event.target || _global;
- const listener = target[eventNameSymbol];
- let result;
- if (isBrowser && target === internalWindow && event.type === 'error') {
-
-
-
- const errorEvent = event;
- result = listener &&
- listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
- if (result === true) {
- event.preventDefault();
- }
- }
- else {
- result = listener && listener.apply(this, arguments);
- if (result != undefined && !result) {
- event.preventDefault();
- }
- }
- return result;
- };
- function patchProperty(obj, prop, prototype) {
- let desc = ObjectGetOwnPropertyDescriptor(obj, prop);
- if (!desc && prototype) {
-
- const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
- if (prototypeDesc) {
- desc = { enumerable: true, configurable: true };
- }
- }
-
-
- if (!desc || !desc.configurable) {
- return;
- }
- const onPropPatchedSymbol = zoneSymbol('on' + prop + 'patched');
- if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
- return;
- }
-
-
-
-
-
- delete desc.writable;
- delete desc.value;
- const originalDescGet = desc.get;
- const originalDescSet = desc.set;
-
- const eventName = prop.slice(2);
- let eventNameSymbol = zoneSymbolEventNames$1[eventName];
- if (!eventNameSymbol) {
- eventNameSymbol = zoneSymbolEventNames$1[eventName] = zoneSymbol('ON_PROPERTY' + eventName);
- }
- desc.set = function (newValue) {
-
-
- let target = this;
- if (!target && obj === _global) {
- target = _global;
- }
- if (!target) {
- return;
- }
- const previousValue = target[eventNameSymbol];
- if (typeof previousValue === 'function') {
- target.removeEventListener(eventName, wrapFn);
- }
-
-
- originalDescSet && originalDescSet.call(target, null);
- target[eventNameSymbol] = newValue;
- if (typeof newValue === 'function') {
- target.addEventListener(eventName, wrapFn, false);
- }
- };
-
-
- desc.get = function () {
-
-
- let target = this;
- if (!target && obj === _global) {
- target = _global;
- }
- if (!target) {
- return null;
- }
- const listener = target[eventNameSymbol];
- if (listener) {
- return listener;
- }
- else if (originalDescGet) {
-
-
-
-
-
-
- let value = originalDescGet.call(this);
- if (value) {
- desc.set.call(this, value);
- if (typeof target[REMOVE_ATTRIBUTE] === 'function') {
- target.removeAttribute(prop);
- }
- return value;
- }
- }
- return null;
- };
- ObjectDefineProperty(obj, prop, desc);
- obj[onPropPatchedSymbol] = true;
- }
- function patchOnProperties(obj, properties, prototype) {
- if (properties) {
- for (let i = 0; i < properties.length; i++) {
- patchProperty(obj, 'on' + properties[i], prototype);
- }
- }
- else {
- const onProperties = [];
- for (const prop in obj) {
- if (prop.slice(0, 2) == 'on') {
- onProperties.push(prop);
- }
- }
- for (let j = 0; j < onProperties.length; j++) {
- patchProperty(obj, onProperties[j], prototype);
- }
- }
- }
- const originalInstanceKey = zoneSymbol('originalInstance');
- function patchClass(className) {
- const OriginalClass = _global[className];
- if (!OriginalClass)
- return;
-
- _global[zoneSymbol(className)] = OriginalClass;
- _global[className] = function () {
- const a = bindArguments(arguments, className);
- switch (a.length) {
- case 0:
- this[originalInstanceKey] = new OriginalClass();
- break;
- case 1:
- this[originalInstanceKey] = new OriginalClass(a[0]);
- break;
- case 2:
- this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
- break;
- case 3:
- this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
- break;
- case 4:
- this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
- break;
- default:
- throw new Error('Arg list too long.');
- }
- };
-
- attachOriginToPatched(_global[className], OriginalClass);
- const instance = new OriginalClass(function () { });
- let prop;
- for (prop in instance) {
-
- if (className === 'XMLHttpRequest' && prop === 'responseBlob')
- continue;
- (function (prop) {
- if (typeof instance[prop] === 'function') {
- _global[className].prototype[prop] = function () {
- return this[originalInstanceKey][prop].apply(this[originalInstanceKey], arguments);
- };
- }
- else {
- ObjectDefineProperty(_global[className].prototype, prop, {
- set: function (fn) {
- if (typeof fn === 'function') {
- this[originalInstanceKey][prop] = wrapWithCurrentZone(fn, className + '.' + prop);
-
-
-
- attachOriginToPatched(this[originalInstanceKey][prop], fn);
- }
- else {
- this[originalInstanceKey][prop] = fn;
- }
- },
- get: function () {
- return this[originalInstanceKey][prop];
- }
- });
- }
- }(prop));
- }
- for (prop in OriginalClass) {
- if (prop !== 'prototype' && OriginalClass.hasOwnProperty(prop)) {
- _global[className][prop] = OriginalClass[prop];
- }
- }
- }
- function patchMethod(target, name, patchFn) {
- let proto = target;
- while (proto && !proto.hasOwnProperty(name)) {
- proto = ObjectGetPrototypeOf(proto);
- }
- if (!proto && target[name]) {
-
- proto = target;
- }
- const delegateName = zoneSymbol(name);
- let delegate = null;
- if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
- delegate = proto[delegateName] = proto[name];
-
-
- const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
- if (isPropertyWritable(desc)) {
- const patchDelegate = patchFn(delegate, delegateName, name);
- proto[name] = function () {
- return patchDelegate(this, arguments);
- };
- attachOriginToPatched(proto[name], delegate);
- }
- }
- return delegate;
- }
- function patchMacroTask(obj, funcName, metaCreator) {
- let setNative = null;
- function scheduleTask(task) {
- const data = task.data;
- data.args[data.cbIdx] = function () {
- task.invoke.apply(this, arguments);
- };
- setNative.apply(data.target, data.args);
- return task;
- }
- setNative = patchMethod(obj, funcName, (delegate) => function (self, args) {
- const meta = metaCreator(self, args);
- if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === 'function') {
- return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
- }
- else {
-
- return delegate.apply(self, args);
- }
- });
- }
- function attachOriginToPatched(patched, original) {
- patched[zoneSymbol('OriginalDelegate')] = original;
- }
- let isDetectedIEOrEdge = false;
- let ieOrEdge = false;
- function isIE() {
- try {
- const ua = internalWindow.navigator.userAgent;
- if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1) {
- return true;
- }
- }
- catch (error) {
- }
- return false;
- }
- function isIEOrEdge() {
- if (isDetectedIEOrEdge) {
- return ieOrEdge;
- }
- isDetectedIEOrEdge = true;
- try {
- const ua = internalWindow.navigator.userAgent;
- if (ua.indexOf('MSIE ') !== -1 || ua.indexOf('Trident/') !== -1 || ua.indexOf('Edge/') !== -1) {
- ieOrEdge = true;
- }
- }
- catch (error) {
- }
- return ieOrEdge;
- }
- Zone.__load_patch('ZoneAwarePromise', (global, Zone, api) => {
- const ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
- const ObjectDefineProperty = Object.defineProperty;
- function readableObjectToString(obj) {
- if (obj && obj.toString === Object.prototype.toString) {
- const className = obj.constructor && obj.constructor.name;
- return (className ? className : '') + ': ' + JSON.stringify(obj);
- }
- return obj ? obj.toString() : Object.prototype.toString.call(obj);
- }
- const __symbol__ = api.symbol;
- const _uncaughtPromiseErrors = [];
- const isDisableWrappingUncaughtPromiseRejection = global[__symbol__('DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION')] === true;
- const symbolPromise = __symbol__('Promise');
- const symbolThen = __symbol__('then');
- const creationTrace = '__creationTrace__';
- api.onUnhandledError = (e) => {
- if (api.showUncaughtError()) {
- const rejection = e && e.rejection;
- if (rejection) {
- console.error('Unhandled Promise rejection:', rejection instanceof Error ? rejection.message : rejection, '; Zone:', e.zone.name, '; Task:', e.task && e.task.source, '; Value:', rejection, rejection instanceof Error ? rejection.stack : undefined);
- }
- else {
- console.error(e);
- }
- }
- };
- api.microtaskDrainDone = () => {
- while (_uncaughtPromiseErrors.length) {
- const uncaughtPromiseError = _uncaughtPromiseErrors.shift();
- try {
- uncaughtPromiseError.zone.runGuarded(() => {
- if (uncaughtPromiseError.throwOriginal) {
- throw uncaughtPromiseError.rejection;
- }
- throw uncaughtPromiseError;
- });
- }
- catch (error) {
- handleUnhandledRejection(error);
- }
- }
- };
- const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__('unhandledPromiseRejectionHandler');
- function handleUnhandledRejection(e) {
- api.onUnhandledError(e);
- try {
- const handler = Zone[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
- if (typeof handler === 'function') {
- handler.call(this, e);
- }
- }
- catch (err) {
- }
- }
- function isThenable(value) {
- return value && value.then;
- }
- function forwardResolution(value) {
- return value;
- }
- function forwardRejection(rejection) {
- return ZoneAwarePromise.reject(rejection);
- }
- const symbolState = __symbol__('state');
- const symbolValue = __symbol__('value');
- const symbolFinally = __symbol__('finally');
- const symbolParentPromiseValue = __symbol__('parentPromiseValue');
- const symbolParentPromiseState = __symbol__('parentPromiseState');
- const source = 'Promise.then';
- const UNRESOLVED = null;
- const RESOLVED = true;
- const REJECTED = false;
- const REJECTED_NO_CATCH = 0;
- function makeResolver(promise, state) {
- return (v) => {
- try {
- resolvePromise(promise, state, v);
- }
- catch (err) {
- resolvePromise(promise, false, err);
- }
-
- };
- }
- const once = function () {
- let wasCalled = false;
- return function wrapper(wrappedFunction) {
- return function () {
- if (wasCalled) {
- return;
- }
- wasCalled = true;
- wrappedFunction.apply(null, arguments);
- };
- };
- };
- const TYPE_ERROR = 'Promise resolved with itself';
- const CURRENT_TASK_TRACE_SYMBOL = __symbol__('currentTaskTrace');
-
- function resolvePromise(promise, state, value) {
- const onceWrapper = once();
- if (promise === value) {
- throw new TypeError(TYPE_ERROR);
- }
- if (promise[symbolState] === UNRESOLVED) {
-
- let then = null;
- try {
- if (typeof value === 'object' || typeof value === 'function') {
- then = value && value.then;
- }
- }
- catch (err) {
- onceWrapper(() => {
- resolvePromise(promise, false, err);
- })();
- return promise;
- }
-
- if (state !== REJECTED && value instanceof ZoneAwarePromise &&
- value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) &&
- value[symbolState] !== UNRESOLVED) {
- clearRejectedNoCatch(value);
- resolvePromise(promise, value[symbolState], value[symbolValue]);
- }
- else if (state !== REJECTED && typeof then === 'function') {
- try {
- then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
- }
- catch (err) {
- onceWrapper(() => {
- resolvePromise(promise, false, err);
- })();
- }
- }
- else {
- promise[symbolState] = state;
- const queue = promise[symbolValue];
- promise[symbolValue] = value;
- if (promise[symbolFinally] === symbolFinally) {
-
- if (state === RESOLVED) {
-
-
- promise[symbolState] = promise[symbolParentPromiseState];
- promise[symbolValue] = promise[symbolParentPromiseValue];
- }
- }
-
-
- if (state === REJECTED && value instanceof Error) {
-
- const trace = Zone.currentTask && Zone.currentTask.data &&
- Zone.currentTask.data[creationTrace];
- if (trace) {
-
- ObjectDefineProperty(value, CURRENT_TASK_TRACE_SYMBOL, { configurable: true, enumerable: false, writable: true, value: trace });
- }
- }
- for (let i = 0; i < queue.length;) {
- scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
- }
- if (queue.length == 0 && state == REJECTED) {
- promise[symbolState] = REJECTED_NO_CATCH;
- let uncaughtPromiseError = value;
- try {
-
-
-
- throw new Error('Uncaught (in promise): ' + readableObjectToString(value) +
- (value && value.stack ? '\n' + value.stack : ''));
- }
- catch (err) {
- uncaughtPromiseError = err;
- }
- if (isDisableWrappingUncaughtPromiseRejection) {
-
-
- uncaughtPromiseError.throwOriginal = true;
- }
- uncaughtPromiseError.rejection = value;
- uncaughtPromiseError.promise = promise;
- uncaughtPromiseError.zone = Zone.current;
- uncaughtPromiseError.task = Zone.currentTask;
- _uncaughtPromiseErrors.push(uncaughtPromiseError);
- api.scheduleMicroTask();
- }
- }
- }
-
- return promise;
- }
- const REJECTION_HANDLED_HANDLER = __symbol__('rejectionHandledHandler');
- function clearRejectedNoCatch(promise) {
- if (promise[symbolState] === REJECTED_NO_CATCH) {
-
-
-
-
-
- try {
- const handler = Zone[REJECTION_HANDLED_HANDLER];
- if (handler && typeof handler === 'function') {
- handler.call(this, { rejection: promise[symbolValue], promise: promise });
- }
- }
- catch (err) {
- }
- promise[symbolState] = REJECTED;
- for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {
- if (promise === _uncaughtPromiseErrors[i].promise) {
- _uncaughtPromiseErrors.splice(i, 1);
- }
- }
- }
- }
- function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
- clearRejectedNoCatch(promise);
- const promiseState = promise[symbolState];
- const delegate = promiseState ?
- (typeof onFulfilled === 'function') ? onFulfilled : forwardResolution :
- (typeof onRejected === 'function') ? onRejected :
- forwardRejection;
- zone.scheduleMicroTask(source, () => {
- try {
- const parentPromiseValue = promise[symbolValue];
- const isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
- if (isFinallyPromise) {
-
- chainPromise[symbolParentPromiseValue] = parentPromiseValue;
- chainPromise[symbolParentPromiseState] = promiseState;
- }
-
- const value = zone.run(delegate, undefined, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ?
- [] :
- [parentPromiseValue]);
- resolvePromise(chainPromise, true, value);
- }
- catch (error) {
-
- resolvePromise(chainPromise, false, error);
- }
- }, chainPromise);
- }
- const ZONE_AWARE_PROMISE_TO_STRING = 'function ZoneAwarePromise() { [native code] }';
- const noop = function () { };
- const AggregateError = global.AggregateError;
- class ZoneAwarePromise {
- static toString() {
- return ZONE_AWARE_PROMISE_TO_STRING;
- }
- static resolve(value) {
- return resolvePromise(new this(null), RESOLVED, value);
- }
- static reject(error) {
- return resolvePromise(new this(null), REJECTED, error);
- }
- static any(values) {
- if (!values || typeof values[Symbol.iterator] !== 'function') {
- return Promise.reject(new AggregateError([], 'All promises were rejected'));
- }
- const promises = [];
- let count = 0;
- try {
- for (let v of values) {
- count++;
- promises.push(ZoneAwarePromise.resolve(v));
- }
- }
- catch (err) {
- return Promise.reject(new AggregateError([], 'All promises were rejected'));
- }
- if (count === 0) {
- return Promise.reject(new AggregateError([], 'All promises were rejected'));
- }
- let finished = false;
- const errors = [];
- return new ZoneAwarePromise((resolve, reject) => {
- for (let i = 0; i < promises.length; i++) {
- promises[i].then(v => {
- if (finished) {
- return;
- }
- finished = true;
- resolve(v);
- }, err => {
- errors.push(err);
- count--;
- if (count === 0) {
- finished = true;
- reject(new AggregateError(errors, 'All promises were rejected'));
- }
- });
- }
- });
- }
- ;
- static race(values) {
- let resolve;
- let reject;
- let promise = new this((res, rej) => {
- resolve = res;
- reject = rej;
- });
- function onResolve(value) {
- resolve(value);
- }
- function onReject(error) {
- reject(error);
- }
- for (let value of values) {
- if (!isThenable(value)) {
- value = this.resolve(value);
- }
- value.then(onResolve, onReject);
- }
- return promise;
- }
- static all(values) {
- return ZoneAwarePromise.allWithCallback(values);
- }
- static allSettled(values) {
- const P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
- return P.allWithCallback(values, {
- thenCallback: (value) => ({ status: 'fulfilled', value }),
- errorCallback: (err) => ({ status: 'rejected', reason: err })
- });
- }
- static allWithCallback(values, callback) {
- let resolve;
- let reject;
- let promise = new this((res, rej) => {
- resolve = res;
- reject = rej;
- });
-
- let unresolvedCount = 2;
- let valueIndex = 0;
- const resolvedValues = [];
- for (let value of values) {
- if (!isThenable(value)) {
- value = this.resolve(value);
- }
- const curValueIndex = valueIndex;
- try {
- value.then((value) => {
- resolvedValues[curValueIndex] = callback ? callback.thenCallback(value) : value;
- unresolvedCount--;
- if (unresolvedCount === 0) {
- resolve(resolvedValues);
- }
- }, (err) => {
- if (!callback) {
- reject(err);
- }
- else {
- resolvedValues[curValueIndex] = callback.errorCallback(err);
- unresolvedCount--;
- if (unresolvedCount === 0) {
- resolve(resolvedValues);
- }
- }
- });
- }
- catch (thenErr) {
- reject(thenErr);
- }
- unresolvedCount++;
- valueIndex++;
- }
-
- unresolvedCount -= 2;
- if (unresolvedCount === 0) {
- resolve(resolvedValues);
- }
- return promise;
- }
- constructor(executor) {
- const promise = this;
- if (!(promise instanceof ZoneAwarePromise)) {
- throw new Error('Must be an instanceof Promise.');
- }
- promise[symbolState] = UNRESOLVED;
- promise[symbolValue] = [];
- try {
- const onceWrapper = once();
- executor &&
- executor(onceWrapper(makeResolver(promise, RESOLVED)), onceWrapper(makeResolver(promise, REJECTED)));
- }
- catch (error) {
- resolvePromise(promise, false, error);
- }
- }
- get [Symbol.toStringTag]() {
- return 'Promise';
- }
- get [Symbol.species]() {
- return ZoneAwarePromise;
- }
- then(onFulfilled, onRejected) {
-
-
-
-
-
-
-
-
- let C = this.constructor?.[Symbol.species];
- if (!C || typeof C !== 'function') {
- C = this.constructor || ZoneAwarePromise;
- }
- const chainPromise = new C(noop);
- const zone = Zone.current;
- if (this[symbolState] == UNRESOLVED) {
- this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
- }
- else {
- scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
- }
- return chainPromise;
- }
- catch(onRejected) {
- return this.then(null, onRejected);
- }
- finally(onFinally) {
-
- let C = this.constructor?.[Symbol.species];
- if (!C || typeof C !== 'function') {
- C = ZoneAwarePromise;
- }
- const chainPromise = new C(noop);
- chainPromise[symbolFinally] = symbolFinally;
- const zone = Zone.current;
- if (this[symbolState] == UNRESOLVED) {
- this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
- }
- else {
- scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
- }
- return chainPromise;
- }
- }
-
-
- ZoneAwarePromise['resolve'] = ZoneAwarePromise.resolve;
- ZoneAwarePromise['reject'] = ZoneAwarePromise.reject;
- ZoneAwarePromise['race'] = ZoneAwarePromise.race;
- ZoneAwarePromise['all'] = ZoneAwarePromise.all;
- const NativePromise = global[symbolPromise] = global['Promise'];
- global['Promise'] = ZoneAwarePromise;
- const symbolThenPatched = __symbol__('thenPatched');
- function patchThen(Ctor) {
- const proto = Ctor.prototype;
- const prop = ObjectGetOwnPropertyDescriptor(proto, 'then');
- if (prop && (prop.writable === false || !prop.configurable)) {
-
-
- return;
- }
- const originalThen = proto.then;
-
- proto[symbolThen] = originalThen;
- Ctor.prototype.then = function (onResolve, onReject) {
- const wrapped = new ZoneAwarePromise((resolve, reject) => {
- originalThen.call(this, resolve, reject);
- });
- return wrapped.then(onResolve, onReject);
- };
- Ctor[symbolThenPatched] = true;
- }
- api.patchThen = patchThen;
- function zoneify(fn) {
- return function (self, args) {
- let resultPromise = fn.apply(self, args);
- if (resultPromise instanceof ZoneAwarePromise) {
- return resultPromise;
- }
- let ctor = resultPromise.constructor;
- if (!ctor[symbolThenPatched]) {
- patchThen(ctor);
- }
- return resultPromise;
- };
- }
- if (NativePromise) {
- patchThen(NativePromise);
- patchMethod(global, 'fetch', delegate => zoneify(delegate));
- }
-
- Promise[Zone.__symbol__('uncaughtPromiseErrors')] = _uncaughtPromiseErrors;
- return ZoneAwarePromise;
- });
- Zone.__load_patch('toString', (global) => {
-
- const originalFunctionToString = Function.prototype.toString;
- const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol('OriginalDelegate');
- const PROMISE_SYMBOL = zoneSymbol('Promise');
- const ERROR_SYMBOL = zoneSymbol('Error');
- const newFunctionToString = function toString() {
- if (typeof this === 'function') {
- const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
- if (originalDelegate) {
- if (typeof originalDelegate === 'function') {
- return originalFunctionToString.call(originalDelegate);
- }
- else {
- return Object.prototype.toString.call(originalDelegate);
- }
- }
- if (this === Promise) {
- const nativePromise = global[PROMISE_SYMBOL];
- if (nativePromise) {
- return originalFunctionToString.call(nativePromise);
- }
- }
- if (this === Error) {
- const nativeError = global[ERROR_SYMBOL];
- if (nativeError) {
- return originalFunctionToString.call(nativeError);
- }
- }
- }
- return originalFunctionToString.call(this);
- };
- newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
- Function.prototype.toString = newFunctionToString;
-
- const originalObjectToString = Object.prototype.toString;
- const PROMISE_OBJECT_TO_STRING = '[object Promise]';
- Object.prototype.toString = function () {
- if (typeof Promise === 'function' && this instanceof Promise) {
- return PROMISE_OBJECT_TO_STRING;
- }
- return originalObjectToString.call(this);
- };
- });
- let passiveSupported = false;
- if (typeof window !== 'undefined') {
- try {
- const options = Object.defineProperty({}, 'passive', {
- get: function () {
- passiveSupported = true;
- }
- });
-
-
-
- window.addEventListener('test', options, options);
- window.removeEventListener('test', options, options);
- }
- catch (err) {
- passiveSupported = false;
- }
- }
- const OPTIMIZED_ZONE_EVENT_TASK_DATA = {
- useG: true
- };
- const zoneSymbolEventNames = {};
- const globalSources = {};
- const EVENT_NAME_SYMBOL_REGX = new RegExp('^' + ZONE_SYMBOL_PREFIX + '(\\w+)(true|false)$');
- const IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol('propagationStopped');
- function prepareEventNames(eventName, eventNameToString) {
- const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
- const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
- const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
- const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
- zoneSymbolEventNames[eventName] = {};
- zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
- zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
- }
- function patchEventTarget(_global, api, apis, patchOptions) {
- const ADD_EVENT_LISTENER = (patchOptions && patchOptions.add) || ADD_EVENT_LISTENER_STR;
- const REMOVE_EVENT_LISTENER = (patchOptions && patchOptions.rm) || REMOVE_EVENT_LISTENER_STR;
- const LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.listeners) || 'eventListeners';
- const REMOVE_ALL_LISTENERS_EVENT_LISTENER = (patchOptions && patchOptions.rmAll) || 'removeAllListeners';
- const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
- const ADD_EVENT_LISTENER_SOURCE = '.' + ADD_EVENT_LISTENER + ':';
- const PREPEND_EVENT_LISTENER = 'prependListener';
- const PREPEND_EVENT_LISTENER_SOURCE = '.' + PREPEND_EVENT_LISTENER + ':';
- const invokeTask = function (task, target, event) {
-
-
- if (task.isRemoved) {
- return;
- }
- const delegate = task.callback;
- if (typeof delegate === 'object' && delegate.handleEvent) {
-
- task.callback = (event) => delegate.handleEvent(event);
- task.originalDelegate = delegate;
- }
-
-
-
-
- let error;
- try {
- task.invoke(task, target, [event]);
- }
- catch (err) {
- error = err;
- }
- const options = task.options;
- if (options && typeof options === 'object' && options.once) {
-
-
-
- const delegate = task.originalDelegate ? task.originalDelegate : task.callback;
- target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate, options);
- }
- return error;
- };
- function globalCallback(context, event, isCapture) {
-
-
- event = event || _global.event;
- if (!event) {
- return;
- }
-
-
- const target = context || event.target || _global;
- const tasks = target[zoneSymbolEventNames[event.type][isCapture ? TRUE_STR : FALSE_STR]];
- if (tasks) {
- const errors = [];
-
-
- if (tasks.length === 1) {
- const err = invokeTask(tasks[0], target, event);
- err && errors.push(err);
- }
- else {
-
-
-
- const copyTasks = tasks.slice();
- for (let i = 0; i < copyTasks.length; i++) {
- if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
- break;
- }
- const err = invokeTask(copyTasks[i], target, event);
- err && errors.push(err);
- }
- }
-
-
- if (errors.length === 1) {
- throw errors[0];
- }
- else {
- for (let i = 0; i < errors.length; i++) {
- const err = errors[i];
- api.nativeScheduleMicroTask(() => {
- throw err;
- });
- }
- }
- }
- }
-
- const globalZoneAwareCallback = function (event) {
- return globalCallback(this, event, false);
- };
-
- const globalZoneAwareCaptureCallback = function (event) {
- return globalCallback(this, event, true);
- };
- function patchEventTargetMethods(obj, patchOptions) {
- if (!obj) {
- return false;
- }
- let useGlobalCallback = true;
- if (patchOptions && patchOptions.useG !== undefined) {
- useGlobalCallback = patchOptions.useG;
- }
- const validateHandler = patchOptions && patchOptions.vh;
- let checkDuplicate = true;
- if (patchOptions && patchOptions.chkDup !== undefined) {
- checkDuplicate = patchOptions.chkDup;
- }
- let returnTarget = false;
- if (patchOptions && patchOptions.rt !== undefined) {
- returnTarget = patchOptions.rt;
- }
- let proto = obj;
- while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
- proto = ObjectGetPrototypeOf(proto);
- }
- if (!proto && obj[ADD_EVENT_LISTENER]) {
-
- proto = obj;
- }
- if (!proto) {
- return false;
- }
- if (proto[zoneSymbolAddEventListener]) {
- return false;
- }
- const eventNameToString = patchOptions && patchOptions.eventNameToString;
-
-
- const taskData = {};
- const nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER];
- const nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] =
- proto[REMOVE_EVENT_LISTENER];
- const nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] =
- proto[LISTENERS_EVENT_LISTENER];
- const nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] =
- proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];
- let nativePrependEventListener;
- if (patchOptions && patchOptions.prepend) {
- nativePrependEventListener = proto[zoneSymbol(patchOptions.prepend)] =
- proto[patchOptions.prepend];
- }
-
- function buildEventListenerOptions(options, passive) {
- if (!passiveSupported && typeof options === 'object' && options) {
-
-
-
- return !!options.capture;
- }
- if (!passiveSupported || !passive) {
- return options;
- }
- if (typeof options === 'boolean') {
- return { capture: options, passive: true };
- }
- if (!options) {
- return { passive: true };
- }
- if (typeof options === 'object' && options.passive !== false) {
- return { ...options, passive: true };
- }
- return options;
- }
- const customScheduleGlobal = function (task) {
-
-
- if (taskData.isExisting) {
- return;
- }
- return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
- };
- const customCancelGlobal = function (task) {
-
-
-
- if (!task.isRemoved) {
- const symbolEventNames = zoneSymbolEventNames[task.eventName];
- let symbolEventName;
- if (symbolEventNames) {
- symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
- }
- const existingTasks = symbolEventName && task.target[symbolEventName];
- if (existingTasks) {
- for (let i = 0; i < existingTasks.length; i++) {
- const existingTask = existingTasks[i];
- if (existingTask === task) {
- existingTasks.splice(i, 1);
-
- task.isRemoved = true;
- if (existingTasks.length === 0) {
-
-
- task.allRemoved = true;
- task.target[symbolEventName] = null;
- }
- break;
- }
- }
- }
- }
-
-
-
- if (!task.allRemoved) {
- return;
- }
- return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
- };
- const customScheduleNonGlobal = function (task) {
- return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
- };
- const customSchedulePrepend = function (task) {
- return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
- };
- const customCancelNonGlobal = function (task) {
- return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
- };
- const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
- const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
- const compareTaskCallbackVsDelegate = function (task, delegate) {
- const typeOfDelegate = typeof delegate;
- return (typeOfDelegate === 'function' && task.callback === delegate) ||
- (typeOfDelegate === 'object' && task.originalDelegate === delegate);
- };
- const compare = (patchOptions && patchOptions.diff) ? patchOptions.diff : compareTaskCallbackVsDelegate;
- const unpatchedEvents = Zone[zoneSymbol('UNPATCHED_EVENTS')];
- const passiveEvents = _global[zoneSymbol('PASSIVE_EVENTS')];
- const makeAddListener = function (nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget = false, prepend = false) {
- return function () {
- const target = this || _global;
- let eventName = arguments[0];
- if (patchOptions && patchOptions.transferEventName) {
- eventName = patchOptions.transferEventName(eventName);
- }
- let delegate = arguments[1];
- if (!delegate) {
- return nativeListener.apply(this, arguments);
- }
- if (isNode && eventName === 'uncaughtException') {
-
- return nativeListener.apply(this, arguments);
- }
-
-
-
- let isHandleEvent = false;
- if (typeof delegate !== 'function') {
- if (!delegate.handleEvent) {
- return nativeListener.apply(this, arguments);
- }
- isHandleEvent = true;
- }
- if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
- return;
- }
- const passive = passiveSupported && !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
- const options = buildEventListenerOptions(arguments[2], passive);
- if (unpatchedEvents) {
-
- for (let i = 0; i < unpatchedEvents.length; i++) {
- if (eventName === unpatchedEvents[i]) {
- if (passive) {
- return nativeListener.call(target, eventName, delegate, options);
- }
- else {
- return nativeListener.apply(this, arguments);
- }
- }
- }
- }
- const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
- const once = options && typeof options === 'object' ? options.once : false;
- const zone = Zone.current;
- let symbolEventNames = zoneSymbolEventNames[eventName];
- if (!symbolEventNames) {
- prepareEventNames(eventName, eventNameToString);
- symbolEventNames = zoneSymbolEventNames[eventName];
- }
- const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
- let existingTasks = target[symbolEventName];
- let isExisting = false;
- if (existingTasks) {
-
- isExisting = true;
- if (checkDuplicate) {
- for (let i = 0; i < existingTasks.length; i++) {
- if (compare(existingTasks[i], delegate)) {
-
- return;
- }
- }
- }
- }
- else {
- existingTasks = target[symbolEventName] = [];
- }
- let source;
- const constructorName = target.constructor['name'];
- const targetSource = globalSources[constructorName];
- if (targetSource) {
- source = targetSource[eventName];
- }
- if (!source) {
- source = constructorName + addSource +
- (eventNameToString ? eventNameToString(eventName) : eventName);
- }
-
-
- taskData.options = options;
- if (once) {
-
-
-
- taskData.options.once = false;
- }
- taskData.target = target;
- taskData.capture = capture;
- taskData.eventName = eventName;
- taskData.isExisting = isExisting;
- const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : undefined;
-
- if (data) {
- data.taskData = taskData;
- }
- const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
-
-
- taskData.target = null;
-
- if (data) {
- data.taskData = null;
- }
-
-
- if (once) {
- options.once = true;
- }
- if (!(!passiveSupported && typeof task.options === 'boolean')) {
-
-
- task.options = options;
- }
- task.target = target;
- task.capture = capture;
- task.eventName = eventName;
- if (isHandleEvent) {
-
- task.originalDelegate = delegate;
- }
- if (!prepend) {
- existingTasks.push(task);
- }
- else {
- existingTasks.unshift(task);
- }
- if (returnTarget) {
- return target;
- }
- };
- };
- proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
- if (nativePrependEventListener) {
- proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
- }
- proto[REMOVE_EVENT_LISTENER] = function () {
- const target = this || _global;
- let eventName = arguments[0];
- if (patchOptions && patchOptions.transferEventName) {
- eventName = patchOptions.transferEventName(eventName);
- }
- const options = arguments[2];
- const capture = !options ? false : typeof options === 'boolean' ? true : options.capture;
- const delegate = arguments[1];
- if (!delegate) {
- return nativeRemoveEventListener.apply(this, arguments);
- }
- if (validateHandler &&
- !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
- return;
- }
- const symbolEventNames = zoneSymbolEventNames[eventName];
- let symbolEventName;
- if (symbolEventNames) {
- symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
- }
- const existingTasks = symbolEventName && target[symbolEventName];
- if (existingTasks) {
- for (let i = 0; i < existingTasks.length; i++) {
- const existingTask = existingTasks[i];
- if (compare(existingTask, delegate)) {
- existingTasks.splice(i, 1);
-
- existingTask.isRemoved = true;
- if (existingTasks.length === 0) {
-
-
- existingTask.allRemoved = true;
- target[symbolEventName] = null;
-
-
-
- if (typeof eventName === 'string') {
- const onPropertySymbol = ZONE_SYMBOL_PREFIX + 'ON_PROPERTY' + eventName;
- target[onPropertySymbol] = null;
- }
- }
- existingTask.zone.cancelTask(existingTask);
- if (returnTarget) {
- return target;
- }
- return;
- }
- }
- }
-
-
-
-
- return nativeRemoveEventListener.apply(this, arguments);
- };
- proto[LISTENERS_EVENT_LISTENER] = function () {
- const target = this || _global;
- let eventName = arguments[0];
- if (patchOptions && patchOptions.transferEventName) {
- eventName = patchOptions.transferEventName(eventName);
- }
- const listeners = [];
- const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
- for (let i = 0; i < tasks.length; i++) {
- const task = tasks[i];
- let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
- listeners.push(delegate);
- }
- return listeners;
- };
- proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function () {
- const target = this || _global;
- let eventName = arguments[0];
- if (!eventName) {
- const keys = Object.keys(target);
- for (let i = 0; i < keys.length; i++) {
- const prop = keys[i];
- const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
- let evtName = match && match[1];
-
-
-
-
- if (evtName && evtName !== 'removeListener') {
- this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
- }
- }
-
- this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, 'removeListener');
- }
- else {
- if (patchOptions && patchOptions.transferEventName) {
- eventName = patchOptions.transferEventName(eventName);
- }
- const symbolEventNames = zoneSymbolEventNames[eventName];
- if (symbolEventNames) {
- const symbolEventName = symbolEventNames[FALSE_STR];
- const symbolCaptureEventName = symbolEventNames[TRUE_STR];
- const tasks = target[symbolEventName];
- const captureTasks = target[symbolCaptureEventName];
- if (tasks) {
- const removeTasks = tasks.slice();
- for (let i = 0; i < removeTasks.length; i++) {
- const task = removeTasks[i];
- let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
- this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
- }
- }
- if (captureTasks) {
- const removeTasks = captureTasks.slice();
- for (let i = 0; i < removeTasks.length; i++) {
- const task = removeTasks[i];
- let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
- this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
- }
- }
- }
- }
- if (returnTarget) {
- return this;
- }
- };
-
- attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
- attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
- if (nativeRemoveAllListeners) {
- attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
- }
- if (nativeListeners) {
- attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
- }
- return true;
- }
- let results = [];
- for (let i = 0; i < apis.length; i++) {
- results[i] = patchEventTargetMethods(apis[i], patchOptions);
- }
- return results;
- }
- function findEventTasks(target, eventName) {
- if (!eventName) {
- const foundTasks = [];
- for (let prop in target) {
- const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
- let evtName = match && match[1];
- if (evtName && (!eventName || evtName === eventName)) {
- const tasks = target[prop];
- if (tasks) {
- for (let i = 0; i < tasks.length; i++) {
- foundTasks.push(tasks[i]);
- }
- }
- }
- }
- return foundTasks;
- }
- let symbolEventName = zoneSymbolEventNames[eventName];
- if (!symbolEventName) {
- prepareEventNames(eventName);
- symbolEventName = zoneSymbolEventNames[eventName];
- }
- const captureFalseTasks = target[symbolEventName[FALSE_STR]];
- const captureTrueTasks = target[symbolEventName[TRUE_STR]];
- if (!captureFalseTasks) {
- return captureTrueTasks ? captureTrueTasks.slice() : [];
- }
- else {
- return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) :
- captureFalseTasks.slice();
- }
- }
- function patchEventPrototype(global, api) {
- const Event = global['Event'];
- if (Event && Event.prototype) {
- api.patchMethod(Event.prototype, 'stopImmediatePropagation', (delegate) => function (self, args) {
- self[IMMEDIATE_PROPAGATION_SYMBOL] = true;
-
-
-
- delegate && delegate.apply(self, args);
- });
- }
- }
- function patchCallbacks(api, target, targetName, method, callbacks) {
- const symbol = Zone.__symbol__(method);
- if (target[symbol]) {
- return;
- }
- const nativeDelegate = target[symbol] = target[method];
- target[method] = function (name, opts, options) {
- if (opts && opts.prototype) {
- callbacks.forEach(function (callback) {
- const source = `${targetName}.${method}::` + callback;
- const prototype = opts.prototype;
-
-
-
-
-
-
-
-
- try {
- if (prototype.hasOwnProperty(callback)) {
- const descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
- if (descriptor && descriptor.value) {
- descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
- api._redefineProperty(opts.prototype, callback, descriptor);
- }
- else if (prototype[callback]) {
- prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
- }
- }
- else if (prototype[callback]) {
- prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
- }
- }
- catch {
-
-
- }
- });
- }
- return nativeDelegate.call(target, name, opts, options);
- };
- api.attachOriginToPatched(target[method], nativeDelegate);
- }
- function filterProperties(target, onProperties, ignoreProperties) {
- if (!ignoreProperties || ignoreProperties.length === 0) {
- return onProperties;
- }
- const tip = ignoreProperties.filter(ip => ip.target === target);
- if (!tip || tip.length === 0) {
- return onProperties;
- }
- const targetIgnoreProperties = tip[0].ignoreProperties;
- return onProperties.filter(op => targetIgnoreProperties.indexOf(op) === -1);
- }
- function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
-
-
- if (!target) {
- return;
- }
- const filteredProperties = filterProperties(target, onProperties, ignoreProperties);
- patchOnProperties(target, filteredProperties, prototype);
- }
- function getOnEventNames(target) {
- return Object.getOwnPropertyNames(target)
- .filter(name => name.startsWith('on') && name.length > 2)
- .map(name => name.substring(2));
- }
- function propertyDescriptorPatch(api, _global) {
- if (isNode && !isMix) {
- return;
- }
- if (Zone[api.symbol('patchEvents')]) {
-
- return;
- }
- const ignoreProperties = _global['__Zone_ignore_on_properties'];
-
- let patchTargets = [];
- if (isBrowser) {
- const internalWindow = window;
- patchTargets = patchTargets.concat([
- 'Document', 'SVGElement', 'Element', 'HTMLElement', 'HTMLBodyElement', 'HTMLMediaElement',
- 'HTMLFrameSetElement', 'HTMLFrameElement', 'HTMLIFrameElement', 'HTMLMarqueeElement', 'Worker'
- ]);
- const ignoreErrorProperties = isIE() ? [{ target: internalWindow, ignoreProperties: ['error'] }] : [];
-
-
- patchFilteredProperties(internalWindow, getOnEventNames(internalWindow), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow));
- }
- patchTargets = patchTargets.concat([
- 'XMLHttpRequest', 'XMLHttpRequestEventTarget', 'IDBIndex', 'IDBRequest', 'IDBOpenDBRequest',
- 'IDBDatabase', 'IDBTransaction', 'IDBCursor', 'WebSocket'
- ]);
- for (let i = 0; i < patchTargets.length; i++) {
- const target = _global[patchTargets[i]];
- target && target.prototype &&
- patchFilteredProperties(target.prototype, getOnEventNames(target.prototype), ignoreProperties);
- }
- }
- Zone.__load_patch('util', (global, Zone, api) => {
-
-
- const eventNames = getOnEventNames(global);
- api.patchOnProperties = patchOnProperties;
- api.patchMethod = patchMethod;
- api.bindArguments = bindArguments;
- api.patchMacroTask = patchMacroTask;
-
-
-
-
-
-
- const SYMBOL_BLACK_LISTED_EVENTS = Zone.__symbol__('BLACK_LISTED_EVENTS');
- const SYMBOL_UNPATCHED_EVENTS = Zone.__symbol__('UNPATCHED_EVENTS');
- if (global[SYMBOL_UNPATCHED_EVENTS]) {
- global[SYMBOL_BLACK_LISTED_EVENTS] = global[SYMBOL_UNPATCHED_EVENTS];
- }
- if (global[SYMBOL_BLACK_LISTED_EVENTS]) {
- Zone[SYMBOL_BLACK_LISTED_EVENTS] = Zone[SYMBOL_UNPATCHED_EVENTS] =
- global[SYMBOL_BLACK_LISTED_EVENTS];
- }
- api.patchEventPrototype = patchEventPrototype;
- api.patchEventTarget = patchEventTarget;
- api.isIEOrEdge = isIEOrEdge;
- api.ObjectDefineProperty = ObjectDefineProperty;
- api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
- api.ObjectCreate = ObjectCreate;
- api.ArraySlice = ArraySlice;
- api.patchClass = patchClass;
- api.wrapWithCurrentZone = wrapWithCurrentZone;
- api.filterProperties = filterProperties;
- api.attachOriginToPatched = attachOriginToPatched;
- api._redefineProperty = Object.defineProperty;
- api.patchCallbacks = patchCallbacks;
- api.getGlobalObjects = () => ({
- globalSources,
- zoneSymbolEventNames,
- eventNames,
- isBrowser,
- isMix,
- isNode,
- TRUE_STR,
- FALSE_STR,
- ZONE_SYMBOL_PREFIX,
- ADD_EVENT_LISTENER_STR,
- REMOVE_EVENT_LISTENER_STR
- });
- });
- function patchQueueMicrotask(global, api) {
- api.patchMethod(global, 'queueMicrotask', (delegate) => {
- return function (self, args) {
- Zone.current.scheduleMicroTask('queueMicrotask', args[0]);
- };
- });
- }
- const taskSymbol = zoneSymbol('zoneTask');
- function patchTimer(window, setName, cancelName, nameSuffix) {
- let setNative = null;
- let clearNative = null;
- setName += nameSuffix;
- cancelName += nameSuffix;
- const tasksByHandleId = {};
- function scheduleTask(task) {
- const data = task.data;
- data.args[0] = function () {
- return task.invoke.apply(this, arguments);
- };
- data.handleId = setNative.apply(window, data.args);
- return task;
- }
- function clearTask(task) {
- return clearNative.call(window, task.data.handleId);
- }
- setNative =
- patchMethod(window, setName, (delegate) => function (self, args) {
- if (typeof args[0] === 'function') {
- const options = {
- isPeriodic: nameSuffix === 'Interval',
- delay: (nameSuffix === 'Timeout' || nameSuffix === 'Interval') ? args[1] || 0 :
- undefined,
- args: args
- };
- const callback = args[0];
- args[0] = function timer() {
- try {
- return callback.apply(this, arguments);
- }
- finally {
-
-
-
-
-
-
-
- if (!(options.isPeriodic)) {
- if (typeof options.handleId === 'number') {
-
-
- delete tasksByHandleId[options.handleId];
- }
- else if (options.handleId) {
-
-
- options.handleId[taskSymbol] = null;
- }
- }
- }
- };
- const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
- if (!task) {
- return task;
- }
-
- const handle = task.data.handleId;
- if (typeof handle === 'number') {
-
-
- tasksByHandleId[handle] = task;
- }
- else if (handle) {
-
-
- handle[taskSymbol] = task;
- }
-
-
- if (handle && handle.ref && handle.unref && typeof handle.ref === 'function' &&
- typeof handle.unref === 'function') {
- task.ref = handle.ref.bind(handle);
- task.unref = handle.unref.bind(handle);
- }
- if (typeof handle === 'number' || handle) {
- return handle;
- }
- return task;
- }
- else {
-
- return delegate.apply(window, args);
- }
- });
- clearNative =
- patchMethod(window, cancelName, (delegate) => function (self, args) {
- const id = args[0];
- let task;
- if (typeof id === 'number') {
-
- task = tasksByHandleId[id];
- }
- else {
-
- task = id && id[taskSymbol];
-
- if (!task) {
- task = id;
- }
- }
- if (task && typeof task.type === 'string') {
- if (task.state !== 'notScheduled' &&
- (task.cancelFn && task.data.isPeriodic || task.runCount === 0)) {
- if (typeof id === 'number') {
- delete tasksByHandleId[id];
- }
- else if (id) {
- id[taskSymbol] = null;
- }
-
- task.zone.cancelTask(task);
- }
- }
- else {
-
- delegate.apply(window, args);
- }
- });
- }
- function patchCustomElements(_global, api) {
- const { isBrowser, isMix } = api.getGlobalObjects();
- if ((!isBrowser && !isMix) || !_global['customElements'] || !('customElements' in _global)) {
- return;
- }
- const callbacks = ['connectedCallback', 'disconnectedCallback', 'adoptedCallback', 'attributeChangedCallback'];
- api.patchCallbacks(api, _global.customElements, 'customElements', 'define', callbacks);
- }
- function eventTargetPatch(_global, api) {
- if (Zone[api.symbol('patchEventTarget')]) {
-
- return;
- }
- const { eventNames, zoneSymbolEventNames, TRUE_STR, FALSE_STR, ZONE_SYMBOL_PREFIX } = api.getGlobalObjects();
-
- for (let i = 0; i < eventNames.length; i++) {
- const eventName = eventNames[i];
- const falseEventName = eventName + FALSE_STR;
- const trueEventName = eventName + TRUE_STR;
- const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
- const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
- zoneSymbolEventNames[eventName] = {};
- zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
- zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
- }
- const EVENT_TARGET = _global['EventTarget'];
- if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
- return;
- }
- api.patchEventTarget(_global, api, [EVENT_TARGET && EVENT_TARGET.prototype]);
- return true;
- }
- function patchEvent(global, api) {
- api.patchEventPrototype(global, api);
- }
- Zone.__load_patch('legacy', (global) => {
- const legacyPatch = global[Zone.__symbol__('legacyPatch')];
- if (legacyPatch) {
- legacyPatch();
- }
- });
- Zone.__load_patch('timers', (global) => {
- const set = 'set';
- const clear = 'clear';
- patchTimer(global, set, clear, 'Timeout');
- patchTimer(global, set, clear, 'Interval');
- patchTimer(global, set, clear, 'Immediate');
- });
- Zone.__load_patch('requestAnimationFrame', (global) => {
- patchTimer(global, 'request', 'cancel', 'AnimationFrame');
- patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
- patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
- });
- Zone.__load_patch('blocking', (global, Zone) => {
- const blockingMethods = ['alert', 'prompt', 'confirm'];
- for (let i = 0; i < blockingMethods.length; i++) {
- const name = blockingMethods[i];
- patchMethod(global, name, (delegate, symbol, name) => {
- return function (s, args) {
- return Zone.current.run(delegate, global, args, name);
- };
- });
- }
- });
- Zone.__load_patch('EventTarget', (global, Zone, api) => {
- patchEvent(global, api);
- eventTargetPatch(global, api);
-
- const XMLHttpRequestEventTarget = global['XMLHttpRequestEventTarget'];
- if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
- api.patchEventTarget(global, api, [XMLHttpRequestEventTarget.prototype]);
- }
- });
- Zone.__load_patch('MutationObserver', (global, Zone, api) => {
- patchClass('MutationObserver');
- patchClass('WebKitMutationObserver');
- });
- Zone.__load_patch('IntersectionObserver', (global, Zone, api) => {
- patchClass('IntersectionObserver');
- });
- Zone.__load_patch('FileReader', (global, Zone, api) => {
- patchClass('FileReader');
- });
- Zone.__load_patch('on_property', (global, Zone, api) => {
- propertyDescriptorPatch(api, global);
- });
- Zone.__load_patch('customElements', (global, Zone, api) => {
- patchCustomElements(global, api);
- });
- Zone.__load_patch('XHR', (global, Zone) => {
-
- patchXHR(global);
- const XHR_TASK = zoneSymbol('xhrTask');
- const XHR_SYNC = zoneSymbol('xhrSync');
- const XHR_LISTENER = zoneSymbol('xhrListener');
- const XHR_SCHEDULED = zoneSymbol('xhrScheduled');
- const XHR_URL = zoneSymbol('xhrURL');
- const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol('xhrErrorBeforeScheduled');
- function patchXHR(window) {
- const XMLHttpRequest = window['XMLHttpRequest'];
- if (!XMLHttpRequest) {
-
- return;
- }
- const XMLHttpRequestPrototype = XMLHttpRequest.prototype;
- function findPendingTask(target) {
- return target[XHR_TASK];
- }
- let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
- let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
- if (!oriAddListener) {
- const XMLHttpRequestEventTarget = window['XMLHttpRequestEventTarget'];
- if (XMLHttpRequestEventTarget) {
- const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;
- oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
- oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
- }
- }
- const READY_STATE_CHANGE = 'readystatechange';
- const SCHEDULED = 'scheduled';
- function scheduleTask(task) {
- const data = task.data;
- const target = data.target;
- target[XHR_SCHEDULED] = false;
- target[XHR_ERROR_BEFORE_SCHEDULED] = false;
-
- const listener = target[XHR_LISTENER];
- if (!oriAddListener) {
- oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
- oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
- }
- if (listener) {
- oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
- }
- const newListener = target[XHR_LISTENER] = () => {
- if (target.readyState === target.DONE) {
-
-
- if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
-
-
-
-
-
-
-
- const loadTasks = target[Zone.__symbol__('loadfalse')];
- if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
- const oriInvoke = task.invoke;
- task.invoke = function () {
-
-
- const loadTasks = target[Zone.__symbol__('loadfalse')];
- for (let i = 0; i < loadTasks.length; i++) {
- if (loadTasks[i] === task) {
- loadTasks.splice(i, 1);
- }
- }
- if (!data.aborted && task.state === SCHEDULED) {
- oriInvoke.call(task);
- }
- };
- loadTasks.push(task);
- }
- else {
- task.invoke();
- }
- }
- else if (!data.aborted && target[XHR_SCHEDULED] === false) {
-
- target[XHR_ERROR_BEFORE_SCHEDULED] = true;
- }
- }
- };
- oriAddListener.call(target, READY_STATE_CHANGE, newListener);
- const storedTask = target[XHR_TASK];
- if (!storedTask) {
- target[XHR_TASK] = task;
- }
- sendNative.apply(target, data.args);
- target[XHR_SCHEDULED] = true;
- return task;
- }
- function placeholderCallback() { }
- function clearTask(task) {
- const data = task.data;
-
-
- data.aborted = true;
- return abortNative.apply(data.target, data.args);
- }
- const openNative = patchMethod(XMLHttpRequestPrototype, 'open', () => function (self, args) {
- self[XHR_SYNC] = args[2] == false;
- self[XHR_URL] = args[1];
- return openNative.apply(self, args);
- });
- const XMLHTTPREQUEST_SOURCE = 'XMLHttpRequest.send';
- const fetchTaskAborting = zoneSymbol('fetchTaskAborting');
- const fetchTaskScheduling = zoneSymbol('fetchTaskScheduling');
- const sendNative = patchMethod(XMLHttpRequestPrototype, 'send', () => function (self, args) {
- if (Zone.current[fetchTaskScheduling] === true) {
-
-
-
- return sendNative.apply(self, args);
- }
- if (self[XHR_SYNC]) {
-
- return sendNative.apply(self, args);
- }
- else {
- const options = { target: self, url: self[XHR_URL], isPeriodic: false, args: args, aborted: false };
- const task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
- if (self && self[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted &&
- task.state === SCHEDULED) {
-
-
-
- task.invoke();
- }
- }
- });
- const abortNative = patchMethod(XMLHttpRequestPrototype, 'abort', () => function (self, args) {
- const task = findPendingTask(self);
- if (task && typeof task.type == 'string') {
-
-
-
-
- if (task.cancelFn == null || (task.data && task.data.aborted)) {
- return;
- }
- task.zone.cancelTask(task);
- }
- else if (Zone.current[fetchTaskAborting] === true) {
-
- return abortNative.apply(self, args);
- }
-
-
-
- });
- }
- });
- Zone.__load_patch('geolocation', (global) => {
-
- if (global['navigator'] && global['navigator'].geolocation) {
- patchPrototype(global['navigator'].geolocation, ['getCurrentPosition', 'watchPosition']);
- }
- });
- Zone.__load_patch('PromiseRejectionEvent', (global, Zone) => {
-
- function findPromiseRejectionHandler(evtName) {
- return function (e) {
- const eventTasks = findEventTasks(global, evtName);
- eventTasks.forEach(eventTask => {
-
-
- const PromiseRejectionEvent = global['PromiseRejectionEvent'];
- if (PromiseRejectionEvent) {
- const evt = new PromiseRejectionEvent(evtName, { promise: e.promise, reason: e.rejection });
- eventTask.invoke(evt);
- }
- });
- };
- }
- if (global['PromiseRejectionEvent']) {
- Zone[zoneSymbol('unhandledPromiseRejectionHandler')] =
- findPromiseRejectionHandler('unhandledrejection');
- Zone[zoneSymbol('rejectionHandledHandler')] =
- findPromiseRejectionHandler('rejectionhandled');
- }
- });
- Zone.__load_patch('queueMicrotask', (global, Zone, api) => {
- patchQueueMicrotask(global, api);
- });
- const NEWLINE = '\n';
- const IGNORE_FRAMES = {};
- const creationTrace = '__creationTrace__';
- const ERROR_TAG = 'STACKTRACE TRACKING';
- const SEP_TAG = '__SEP_TAG__';
- let sepTemplate = SEP_TAG + '@[native]';
- class LongStackTrace {
- constructor() {
- this.error = getStacktrace();
- this.timestamp = new Date();
- }
- }
- function getStacktraceWithUncaughtError() {
- return new Error(ERROR_TAG);
- }
- function getStacktraceWithCaughtError() {
- try {
- throw getStacktraceWithUncaughtError();
- }
- catch (err) {
- return err;
- }
- }
- const error = getStacktraceWithUncaughtError();
- const caughtError = getStacktraceWithCaughtError();
- const getStacktrace = error.stack ?
- getStacktraceWithUncaughtError :
- (caughtError.stack ? getStacktraceWithCaughtError : getStacktraceWithUncaughtError);
- function getFrames(error) {
- return error.stack ? error.stack.split(NEWLINE) : [];
- }
- function addErrorStack(lines, error) {
- let trace = getFrames(error);
- for (let i = 0; i < trace.length; i++) {
- const frame = trace[i];
-
- if (!IGNORE_FRAMES.hasOwnProperty(frame)) {
- lines.push(trace[i]);
- }
- }
- }
- function renderLongStackTrace(frames, stack) {
- const longTrace = [stack ? stack.trim() : ''];
- if (frames) {
- let timestamp = new Date().getTime();
- for (let i = 0; i < frames.length; i++) {
- const traceFrames = frames[i];
- const lastTime = traceFrames.timestamp;
- let separator = `____________________Elapsed ${timestamp - lastTime.getTime()} ms; At: ${lastTime}`;
- separator = separator.replace(/[^\w\d]/g, '_');
- longTrace.push(sepTemplate.replace(SEP_TAG, separator));
- addErrorStack(longTrace, traceFrames.error);
- timestamp = lastTime.getTime();
- }
- }
- return longTrace.join(NEWLINE);
- }
- function stackTracesEnabled() {
-
-
- return Error.stackTraceLimit > 0;
- }
- Zone['longStackTraceZoneSpec'] = {
- name: 'long-stack-trace',
- longStackTraceLimit: 10,
-
-
- getLongStackTrace: function (error) {
- if (!error) {
- return undefined;
- }
- const trace = error[Zone.__symbol__('currentTaskTrace')];
- if (!trace) {
- return error.stack;
- }
- return renderLongStackTrace(trace, error.stack);
- },
- onScheduleTask: function (parentZoneDelegate, currentZone, targetZone, task) {
- if (stackTracesEnabled()) {
- const currentTask = Zone.currentTask;
- let trace = currentTask && currentTask.data && currentTask.data[creationTrace] || [];
- trace = [new LongStackTrace()].concat(trace);
- if (trace.length > this.longStackTraceLimit) {
- trace.length = this.longStackTraceLimit;
- }
- if (!task.data)
- task.data = {};
- if (task.type === 'eventTask') {
-
-
-
-
-
- task.data = { ...task.data };
- }
- task.data[creationTrace] = trace;
- }
- return parentZoneDelegate.scheduleTask(targetZone, task);
- },
- onHandleError: function (parentZoneDelegate, currentZone, targetZone, error) {
- if (stackTracesEnabled()) {
- const parentTask = Zone.currentTask || error.task;
- if (error instanceof Error && parentTask) {
- const longStack = renderLongStackTrace(parentTask.data && parentTask.data[creationTrace], error.stack);
- try {
- error.stack = error.longStack = longStack;
- }
- catch (err) {
- }
- }
- }
- return parentZoneDelegate.handleError(targetZone, error);
- }
- };
- function captureStackTraces(stackTraces, count) {
- if (count > 0) {
- stackTraces.push(getFrames((new LongStackTrace()).error));
- captureStackTraces(stackTraces, count - 1);
- }
- }
- function computeIgnoreFrames() {
- if (!stackTracesEnabled()) {
- return;
- }
- const frames = [];
- captureStackTraces(frames, 2);
- const frames1 = frames[0];
- const frames2 = frames[1];
- for (let i = 0; i < frames1.length; i++) {
- const frame1 = frames1[i];
- if (frame1.indexOf(ERROR_TAG) == -1) {
- let match = frame1.match(/^\s*at\s+/);
- if (match) {
- sepTemplate = match[0] + SEP_TAG + ' (http://localhost)';
- break;
- }
- }
- }
- for (let i = 0; i < frames1.length; i++) {
- const frame1 = frames1[i];
- const frame2 = frames2[i];
- if (frame1 === frame2) {
- IGNORE_FRAMES[frame1] = true;
- }
- else {
- break;
- }
- }
- }
- computeIgnoreFrames();
- class ProxyZoneSpec {
- static get() {
- return Zone.current.get('ProxyZoneSpec');
- }
- static isLoaded() {
- return ProxyZoneSpec.get() instanceof ProxyZoneSpec;
- }
- static assertPresent() {
- if (!ProxyZoneSpec.isLoaded()) {
- throw new Error(`Expected to be running in 'ProxyZone', but it was not found.`);
- }
- return ProxyZoneSpec.get();
- }
- constructor(defaultSpecDelegate = null) {
- this.defaultSpecDelegate = defaultSpecDelegate;
- this.name = 'ProxyZone';
- this._delegateSpec = null;
- this.properties = { 'ProxyZoneSpec': this };
- this.propertyKeys = null;
- this.lastTaskState = null;
- this.isNeedToTriggerHasTask = false;
- this.tasks = [];
- this.setDelegate(defaultSpecDelegate);
- }
- setDelegate(delegateSpec) {
- const isNewDelegate = this._delegateSpec !== delegateSpec;
- this._delegateSpec = delegateSpec;
- this.propertyKeys && this.propertyKeys.forEach((key) => delete this.properties[key]);
- this.propertyKeys = null;
- if (delegateSpec && delegateSpec.properties) {
- this.propertyKeys = Object.keys(delegateSpec.properties);
- this.propertyKeys.forEach((k) => this.properties[k] = delegateSpec.properties[k]);
- }
-
- if (isNewDelegate && this.lastTaskState &&
- (this.lastTaskState.macroTask || this.lastTaskState.microTask)) {
- this.isNeedToTriggerHasTask = true;
- }
- }
- getDelegate() {
- return this._delegateSpec;
- }
- resetDelegate() {
- this.getDelegate();
- this.setDelegate(this.defaultSpecDelegate);
- }
- tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone) {
- if (this.isNeedToTriggerHasTask && this.lastTaskState) {
-
-
- this.isNeedToTriggerHasTask = false;
- this.onHasTask(parentZoneDelegate, currentZone, targetZone, this.lastTaskState);
- }
- }
- removeFromTasks(task) {
- if (!this.tasks) {
- return;
- }
- for (let i = 0; i < this.tasks.length; i++) {
- if (this.tasks[i] === task) {
- this.tasks.splice(i, 1);
- return;
- }
- }
- }
- getAndClearPendingTasksInfo() {
- if (this.tasks.length === 0) {
- return '';
- }
- const taskInfo = this.tasks.map((task) => {
- const dataInfo = task.data &&
- Object.keys(task.data)
- .map((key) => {
- return key + ':' + task.data[key];
- })
- .join(',');
- return `type: ${task.type}, source: ${task.source}, args: {${dataInfo}}`;
- });
- const pendingTasksInfo = '--Pending async tasks are: [' + taskInfo + ']';
-
- this.tasks = [];
- return pendingTasksInfo;
- }
- onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec) {
- if (this._delegateSpec && this._delegateSpec.onFork) {
- return this._delegateSpec.onFork(parentZoneDelegate, currentZone, targetZone, zoneSpec);
- }
- else {
- return parentZoneDelegate.fork(targetZone, zoneSpec);
- }
- }
- onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source) {
- if (this._delegateSpec && this._delegateSpec.onIntercept) {
- return this._delegateSpec.onIntercept(parentZoneDelegate, currentZone, targetZone, delegate, source);
- }
- else {
- return parentZoneDelegate.intercept(targetZone, delegate, source);
- }
- }
- onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
- this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
- if (this._delegateSpec && this._delegateSpec.onInvoke) {
- return this._delegateSpec.onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source);
- }
- else {
- return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
- }
- }
- onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
- if (this._delegateSpec && this._delegateSpec.onHandleError) {
- return this._delegateSpec.onHandleError(parentZoneDelegate, currentZone, targetZone, error);
- }
- else {
- return parentZoneDelegate.handleError(targetZone, error);
- }
- }
- onScheduleTask(parentZoneDelegate, currentZone, targetZone, task) {
- if (task.type !== 'eventTask') {
- this.tasks.push(task);
- }
- if (this._delegateSpec && this._delegateSpec.onScheduleTask) {
- return this._delegateSpec.onScheduleTask(parentZoneDelegate, currentZone, targetZone, task);
- }
- else {
- return parentZoneDelegate.scheduleTask(targetZone, task);
- }
- }
- onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs) {
- if (task.type !== 'eventTask') {
- this.removeFromTasks(task);
- }
- this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
- if (this._delegateSpec && this._delegateSpec.onInvokeTask) {
- return this._delegateSpec.onInvokeTask(parentZoneDelegate, currentZone, targetZone, task, applyThis, applyArgs);
- }
- else {
- return parentZoneDelegate.invokeTask(targetZone, task, applyThis, applyArgs);
- }
- }
- onCancelTask(parentZoneDelegate, currentZone, targetZone, task) {
- if (task.type !== 'eventTask') {
- this.removeFromTasks(task);
- }
- this.tryTriggerHasTask(parentZoneDelegate, currentZone, targetZone);
- if (this._delegateSpec && this._delegateSpec.onCancelTask) {
- return this._delegateSpec.onCancelTask(parentZoneDelegate, currentZone, targetZone, task);
- }
- else {
- return parentZoneDelegate.cancelTask(targetZone, task);
- }
- }
- onHasTask(delegate, current, target, hasTaskState) {
- this.lastTaskState = hasTaskState;
- if (this._delegateSpec && this._delegateSpec.onHasTask) {
- this._delegateSpec.onHasTask(delegate, current, target, hasTaskState);
- }
- else {
- delegate.hasTask(target, hasTaskState);
- }
- }
- }
- Zone['ProxyZoneSpec'] = ProxyZoneSpec;
- class SyncTestZoneSpec {
- constructor(namePrefix) {
- this.runZone = Zone.current;
- this.name = 'syncTestZone for ' + namePrefix;
- }
- onScheduleTask(delegate, current, target, task) {
- switch (task.type) {
- case 'microTask':
- case 'macroTask':
- throw new Error(`Cannot call ${task.source} from within a sync test (${this.name}).`);
- case 'eventTask':
- task = delegate.scheduleTask(target, task);
- break;
- }
- return task;
- }
- }
- Zone['SyncTestZoneSpec'] = SyncTestZoneSpec;
- Zone.__load_patch('jasmine', (global, Zone, api) => {
- const __extends = function (d, b) {
- for (const p in b)
- if (b.hasOwnProperty(p))
- d[p] = b[p];
- function __() {
- this.constructor = d;
- }
- d.prototype = b === null ? Object.create(b) : ((__.prototype = b.prototype), new __());
- };
-
-
- if (!Zone)
- throw new Error('Missing: zone.js');
- if (typeof jest !== 'undefined') {
-
-
- return;
- }
- if (typeof jasmine == 'undefined' || jasmine['__zone_patch__']) {
- return;
- }
- jasmine['__zone_patch__'] = true;
- const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
- const ProxyZoneSpec = Zone['ProxyZoneSpec'];
- if (!SyncTestZoneSpec)
- throw new Error('Missing: SyncTestZoneSpec');
- if (!ProxyZoneSpec)
- throw new Error('Missing: ProxyZoneSpec');
- const ambientZone = Zone.current;
- const symbol = Zone.__symbol__;
-
- const disablePatchingJasmineClock = global[symbol('fakeAsyncDisablePatchingClock')] === true;
-
-
-
- const enableAutoFakeAsyncWhenClockPatched = !disablePatchingJasmineClock &&
- ((global[symbol('fakeAsyncPatchLock')] === true) ||
- (global[symbol('fakeAsyncAutoFakeAsyncWhenClockPatched')] === true));
- const ignoreUnhandledRejection = global[symbol('ignoreUnhandledRejection')] === true;
- if (!ignoreUnhandledRejection) {
- const globalErrors = jasmine.GlobalErrors;
- if (globalErrors && !jasmine[symbol('GlobalErrors')]) {
- jasmine[symbol('GlobalErrors')] = globalErrors;
- jasmine.GlobalErrors = function () {
- const instance = new globalErrors();
- const originalInstall = instance.install;
- if (originalInstall && !instance[symbol('install')]) {
- instance[symbol('install')] = originalInstall;
- instance.install = function () {
- const isNode = typeof process !== 'undefined' && !!process.on;
-
-
-
-
-
-
- const originalHandlers = isNode ? process.listeners('unhandledRejection') :
- global.eventListeners('unhandledrejection');
- const result = originalInstall.apply(this, arguments);
- isNode ? process.removeAllListeners('unhandledRejection') :
- global.removeAllListeners('unhandledrejection');
- if (originalHandlers) {
- originalHandlers.forEach(handler => {
- if (isNode) {
- process.on('unhandledRejection', handler);
- }
- else {
- global.addEventListener('unhandledrejection', handler);
- }
- });
- }
- return result;
- };
- }
- return instance;
- };
- }
- }
-
- const jasmineEnv = jasmine.getEnv();
- ['describe', 'xdescribe', 'fdescribe'].forEach(methodName => {
- let originalJasmineFn = jasmineEnv[methodName];
- jasmineEnv[methodName] = function (description, specDefinitions) {
- return originalJasmineFn.call(this, description, wrapDescribeInZone(description, specDefinitions));
- };
- });
- ['it', 'xit', 'fit'].forEach(methodName => {
- let originalJasmineFn = jasmineEnv[methodName];
- jasmineEnv[symbol(methodName)] = originalJasmineFn;
- jasmineEnv[methodName] = function (description, specDefinitions, timeout) {
- arguments[1] = wrapTestInZone(specDefinitions);
- return originalJasmineFn.apply(this, arguments);
- };
- });
- ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach(methodName => {
- let originalJasmineFn = jasmineEnv[methodName];
- jasmineEnv[symbol(methodName)] = originalJasmineFn;
- jasmineEnv[methodName] = function (specDefinitions, timeout) {
- arguments[0] = wrapTestInZone(specDefinitions);
- return originalJasmineFn.apply(this, arguments);
- };
- });
- if (!disablePatchingJasmineClock) {
-
-
- const originalClockFn = (jasmine[symbol('clock')] = jasmine['clock']);
- jasmine['clock'] = function () {
- const clock = originalClockFn.apply(this, arguments);
- if (!clock[symbol('patched')]) {
- clock[symbol('patched')] = symbol('patched');
- const originalTick = (clock[symbol('tick')] = clock.tick);
- clock.tick = function () {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- return fakeAsyncZoneSpec.tick.apply(fakeAsyncZoneSpec, arguments);
- }
- return originalTick.apply(this, arguments);
- };
- const originalMockDate = (clock[symbol('mockDate')] = clock.mockDate);
- clock.mockDate = function () {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- const dateTime = arguments.length > 0 ? arguments[0] : new Date();
- return fakeAsyncZoneSpec.setFakeBaseSystemTime.apply(fakeAsyncZoneSpec, dateTime && typeof dateTime.getTime === 'function' ? [dateTime.getTime()] :
- arguments);
- }
- return originalMockDate.apply(this, arguments);
- };
-
- if (enableAutoFakeAsyncWhenClockPatched) {
- ['install', 'uninstall'].forEach(methodName => {
- const originalClockFn = (clock[symbol(methodName)] = clock[methodName]);
- clock[methodName] = function () {
- const FakeAsyncTestZoneSpec = Zone['FakeAsyncTestZoneSpec'];
- if (FakeAsyncTestZoneSpec) {
- jasmine[symbol('clockInstalled')] = 'install' === methodName;
- return;
- }
- return originalClockFn.apply(this, arguments);
- };
- });
- }
- }
- return clock;
- };
- }
-
- if (!jasmine[Zone.__symbol__('createSpyObj')]) {
- const originalCreateSpyObj = jasmine.createSpyObj;
- jasmine[Zone.__symbol__('createSpyObj')] = originalCreateSpyObj;
- jasmine.createSpyObj = function () {
- const args = Array.prototype.slice.call(arguments);
- const propertyNames = args.length >= 3 ? args[2] : null;
- let spyObj;
- if (propertyNames) {
- const defineProperty = Object.defineProperty;
- Object.defineProperty = function (obj, p, attributes) {
- return defineProperty.call(this, obj, p, { ...attributes, configurable: true, enumerable: true });
- };
- try {
- spyObj = originalCreateSpyObj.apply(this, args);
- }
- finally {
- Object.defineProperty = defineProperty;
- }
- }
- else {
- spyObj = originalCreateSpyObj.apply(this, args);
- }
- return spyObj;
- };
- }
-
- function wrapDescribeInZone(description, describeBody) {
- return function () {
-
-
- const syncZone = ambientZone.fork(new SyncTestZoneSpec(`jasmine.describe#${description}`));
- return syncZone.run(describeBody, this, arguments);
- };
- }
- function runInTestZone(testBody, applyThis, queueRunner, done) {
- const isClockInstalled = !!jasmine[symbol('clockInstalled')];
- queueRunner.testProxyZoneSpec;
- const testProxyZone = queueRunner.testProxyZone;
- if (isClockInstalled && enableAutoFakeAsyncWhenClockPatched) {
-
- const fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
- if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
- testBody = fakeAsyncModule.fakeAsync(testBody);
- }
- }
- if (done) {
- return testProxyZone.run(testBody, applyThis, [done]);
- }
- else {
- return testProxyZone.run(testBody, applyThis);
- }
- }
-
- function wrapTestInZone(testBody) {
-
-
-
- return (testBody && (testBody.length ? function (done) {
- return runInTestZone(testBody, this, this.queueRunner, done);
- } : function () {
- return runInTestZone(testBody, this, this.queueRunner);
- }));
- }
- const QueueRunner = jasmine.QueueRunner;
- jasmine.QueueRunner = (function (_super) {
- __extends(ZoneQueueRunner, _super);
- function ZoneQueueRunner(attrs) {
- if (attrs.onComplete) {
- attrs.onComplete = (fn => () => {
-
- this.testProxyZone = null;
- this.testProxyZoneSpec = null;
- ambientZone.scheduleMicroTask('jasmine.onComplete', fn);
- })(attrs.onComplete);
- }
- const nativeSetTimeout = global[Zone.__symbol__('setTimeout')];
- const nativeClearTimeout = global[Zone.__symbol__('clearTimeout')];
- if (nativeSetTimeout) {
-
- attrs.timeout = {
- setTimeout: nativeSetTimeout ? nativeSetTimeout : global.setTimeout,
- clearTimeout: nativeClearTimeout ? nativeClearTimeout : global.clearTimeout
- };
- }
-
-
- if (jasmine.UserContext) {
- if (!attrs.userContext) {
- attrs.userContext = new jasmine.UserContext();
- }
- attrs.userContext.queueRunner = this;
- }
- else {
- if (!attrs.userContext) {
- attrs.userContext = {};
- }
- attrs.userContext.queueRunner = this;
- }
-
- const onException = attrs.onException;
- attrs.onException = function (error) {
- if (error &&
- error.message ===
- 'Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.') {
-
-
- const proxyZoneSpec = this && this.testProxyZoneSpec;
- if (proxyZoneSpec) {
- const pendingTasksInfo = proxyZoneSpec.getAndClearPendingTasksInfo();
- try {
-
- error.message += pendingTasksInfo;
- }
- catch (err) {
- }
- }
- }
- if (onException) {
- onException.call(this, error);
- }
- };
- _super.call(this, attrs);
- }
- ZoneQueueRunner.prototype.execute = function () {
- let zone = Zone.current;
- let isChildOfAmbientZone = false;
- while (zone) {
- if (zone === ambientZone) {
- isChildOfAmbientZone = true;
- break;
- }
- zone = zone.parent;
- }
- if (!isChildOfAmbientZone)
- throw new Error('Unexpected Zone: ' + Zone.current.name);
-
-
-
-
-
-
-
-
-
- this.testProxyZoneSpec = new ProxyZoneSpec();
- this.testProxyZone = ambientZone.fork(this.testProxyZoneSpec);
- if (!Zone.currentTask) {
-
-
-
-
-
- Zone.current.scheduleMicroTask('jasmine.execute().forceTask', () => QueueRunner.prototype.execute.call(this));
- }
- else {
- _super.prototype.execute.call(this);
- }
- };
- return ZoneQueueRunner;
- })(QueueRunner);
- });
- Zone.__load_patch('jest', (context, Zone, api) => {
- if (typeof jest === 'undefined' || jest['__zone_patch__']) {
- return;
- }
-
-
-
-
-
-
-
-
- Zone[api.symbol('ignoreConsoleErrorUncaughtError')] = true;
- jest['__zone_patch__'] = true;
- const ProxyZoneSpec = Zone['ProxyZoneSpec'];
- const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
- if (!ProxyZoneSpec) {
- throw new Error('Missing ProxyZoneSpec');
- }
- const rootZone = Zone.current;
- const syncZone = rootZone.fork(new SyncTestZoneSpec('jest.describe'));
- const proxyZoneSpec = new ProxyZoneSpec();
- const proxyZone = rootZone.fork(proxyZoneSpec);
- function wrapDescribeFactoryInZone(originalJestFn) {
- return function (...tableArgs) {
- const originalDescribeFn = originalJestFn.apply(this, tableArgs);
- return function (...args) {
- args[1] = wrapDescribeInZone(args[1]);
- return originalDescribeFn.apply(this, args);
- };
- };
- }
- function wrapTestFactoryInZone(originalJestFn) {
- return function (...tableArgs) {
- return function (...args) {
- args[1] = wrapTestInZone(args[1]);
- return originalJestFn.apply(this, tableArgs).apply(this, args);
- };
- };
- }
-
- function wrapDescribeInZone(describeBody) {
- return function (...args) {
- return syncZone.run(describeBody, this, args);
- };
- }
-
- function wrapTestInZone(testBody, isTestFunc = false) {
- if (typeof testBody !== 'function') {
- return testBody;
- }
- const wrappedFunc = function () {
- if (Zone[api.symbol('useFakeTimersCalled')] === true && testBody &&
- !testBody.isFakeAsync) {
-
- const fakeAsyncModule = Zone[Zone.__symbol__('fakeAsyncTest')];
- if (fakeAsyncModule && typeof fakeAsyncModule.fakeAsync === 'function') {
- testBody = fakeAsyncModule.fakeAsync(testBody);
- }
- }
- proxyZoneSpec.isTestFunc = isTestFunc;
- return proxyZone.run(testBody, null, arguments);
- };
-
-
- Object.defineProperty(wrappedFunc, 'length', { configurable: true, writable: true, enumerable: false });
- wrappedFunc.length = testBody.length;
- return wrappedFunc;
- }
- ['describe', 'xdescribe', 'fdescribe'].forEach(methodName => {
- let originalJestFn = context[methodName];
- if (context[Zone.__symbol__(methodName)]) {
- return;
- }
- context[Zone.__symbol__(methodName)] = originalJestFn;
- context[methodName] = function (...args) {
- args[1] = wrapDescribeInZone(args[1]);
- return originalJestFn.apply(this, args);
- };
- context[methodName].each = wrapDescribeFactoryInZone(originalJestFn.each);
- });
- context.describe.only = context.fdescribe;
- context.describe.skip = context.xdescribe;
- ['it', 'xit', 'fit', 'test', 'xtest'].forEach(methodName => {
- let originalJestFn = context[methodName];
- if (context[Zone.__symbol__(methodName)]) {
- return;
- }
- context[Zone.__symbol__(methodName)] = originalJestFn;
- context[methodName] = function (...args) {
- args[1] = wrapTestInZone(args[1], true);
- return originalJestFn.apply(this, args);
- };
- context[methodName].each = wrapTestFactoryInZone(originalJestFn.each);
- context[methodName].todo = originalJestFn.todo;
- });
- context.it.only = context.fit;
- context.it.skip = context.xit;
- context.test.only = context.fit;
- context.test.skip = context.xit;
- ['beforeEach', 'afterEach', 'beforeAll', 'afterAll'].forEach(methodName => {
- let originalJestFn = context[methodName];
- if (context[Zone.__symbol__(methodName)]) {
- return;
- }
- context[Zone.__symbol__(methodName)] = originalJestFn;
- context[methodName] = function (...args) {
- args[0] = wrapTestInZone(args[0]);
- return originalJestFn.apply(this, args);
- };
- });
- Zone.patchJestObject = function patchJestObject(Timer, isModern = false) {
-
- function isPatchingFakeTimer() {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- return !!fakeAsyncZoneSpec;
- }
-
-
- function isInTestFunc() {
- const proxyZoneSpec = Zone.current.get('ProxyZoneSpec');
- return proxyZoneSpec && proxyZoneSpec.isTestFunc;
- }
- if (Timer[api.symbol('fakeTimers')]) {
- return;
- }
- Timer[api.symbol('fakeTimers')] = true;
-
- api.patchMethod(Timer, '_checkFakeTimers', delegate => {
- return function (self, args) {
- if (isPatchingFakeTimer()) {
- return true;
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'useFakeTimers', delegate => {
- return function (self, args) {
- Zone[api.symbol('useFakeTimersCalled')] = true;
- if (isModern || isInTestFunc()) {
- return delegate.apply(self, args);
- }
- return self;
- };
- });
-
- api.patchMethod(Timer, 'useRealTimers', delegate => {
- return function (self, args) {
- Zone[api.symbol('useFakeTimersCalled')] = false;
- if (isModern || isInTestFunc()) {
- return delegate.apply(self, args);
- }
- return self;
- };
- });
-
- api.patchMethod(Timer, 'setSystemTime', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec && isPatchingFakeTimer()) {
- fakeAsyncZoneSpec.setFakeBaseSystemTime(args[0]);
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'getRealSystemTime', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec && isPatchingFakeTimer()) {
- return fakeAsyncZoneSpec.getRealSystemTime();
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'runAllTicks', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- fakeAsyncZoneSpec.flushMicrotasks();
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'runAllTimers', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- fakeAsyncZoneSpec.flush(100, true);
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'advanceTimersByTime', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- fakeAsyncZoneSpec.tick(args[0]);
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'runOnlyPendingTimers', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- fakeAsyncZoneSpec.flushOnlyPendingTimers();
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'advanceTimersToNextTimer', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- fakeAsyncZoneSpec.tickToNext(args[0]);
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'clearAllTimers', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- fakeAsyncZoneSpec.removeAllTimers();
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
-
- api.patchMethod(Timer, 'getTimerCount', delegate => {
- return function (self, args) {
- const fakeAsyncZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncZoneSpec) {
- return fakeAsyncZoneSpec.getTimerCount();
- }
- else {
- return delegate.apply(self, args);
- }
- };
- });
- };
- });
- Zone.__load_patch('mocha', (global, Zone) => {
- const Mocha = global.Mocha;
- if (typeof Mocha === 'undefined') {
-
-
- return;
- }
- if (typeof Zone === 'undefined') {
- throw new Error('Missing Zone.js');
- }
- const ProxyZoneSpec = Zone['ProxyZoneSpec'];
- const SyncTestZoneSpec = Zone['SyncTestZoneSpec'];
- if (!ProxyZoneSpec) {
- throw new Error('Missing ProxyZoneSpec');
- }
- if (Mocha['__zone_patch__']) {
- throw new Error('"Mocha" has already been patched with "Zone".');
- }
- Mocha['__zone_patch__'] = true;
- const rootZone = Zone.current;
- const syncZone = rootZone.fork(new SyncTestZoneSpec('Mocha.describe'));
- let testZone = null;
- const suiteZone = rootZone.fork(new ProxyZoneSpec());
- const mochaOriginal = {
- after: global.after,
- afterEach: global.afterEach,
- before: global.before,
- beforeEach: global.beforeEach,
- describe: global.describe,
- it: global.it
- };
- function modifyArguments(args, syncTest, asyncTest) {
- for (let i = 0; i < args.length; i++) {
- let arg = args[i];
- if (typeof arg === 'function') {
-
-
-
-
-
- args[i] = (arg.length === 0) ? syncTest(arg) : asyncTest(arg);
-
-
- args[i].toString = function () {
- return arg.toString();
- };
- }
- }
- return args;
- }
- function wrapDescribeInZone(args) {
- const syncTest = function (fn) {
- return function () {
- return syncZone.run(fn, this, arguments);
- };
- };
- return modifyArguments(args, syncTest);
- }
- function wrapTestInZone(args) {
- const asyncTest = function (fn) {
- return function (done) {
- return testZone.run(fn, this, [done]);
- };
- };
- const syncTest = function (fn) {
- return function () {
- return testZone.run(fn, this);
- };
- };
- return modifyArguments(args, syncTest, asyncTest);
- }
- function wrapSuiteInZone(args) {
- const asyncTest = function (fn) {
- return function (done) {
- return suiteZone.run(fn, this, [done]);
- };
- };
- const syncTest = function (fn) {
- return function () {
- return suiteZone.run(fn, this);
- };
- };
- return modifyArguments(args, syncTest, asyncTest);
- }
- global.describe = global.suite = function () {
- return mochaOriginal.describe.apply(this, wrapDescribeInZone(arguments));
- };
- global.xdescribe = global.suite.skip = global.describe.skip = function () {
- return mochaOriginal.describe.skip.apply(this, wrapDescribeInZone(arguments));
- };
- global.describe.only = global.suite.only = function () {
- return mochaOriginal.describe.only.apply(this, wrapDescribeInZone(arguments));
- };
- global.it = global.specify = global.test = function () {
- return mochaOriginal.it.apply(this, wrapTestInZone(arguments));
- };
- global.xit = global.xspecify = global.it.skip = function () {
- return mochaOriginal.it.skip.apply(this, wrapTestInZone(arguments));
- };
- global.it.only = global.test.only = function () {
- return mochaOriginal.it.only.apply(this, wrapTestInZone(arguments));
- };
- global.after = global.suiteTeardown = function () {
- return mochaOriginal.after.apply(this, wrapSuiteInZone(arguments));
- };
- global.afterEach = global.teardown = function () {
- return mochaOriginal.afterEach.apply(this, wrapTestInZone(arguments));
- };
- global.before = global.suiteSetup = function () {
- return mochaOriginal.before.apply(this, wrapSuiteInZone(arguments));
- };
- global.beforeEach = global.setup = function () {
- return mochaOriginal.beforeEach.apply(this, wrapTestInZone(arguments));
- };
- ((originalRunTest, originalRun) => {
- Mocha.Runner.prototype.runTest = function (fn) {
- Zone.current.scheduleMicroTask('mocha.forceTask', () => {
- originalRunTest.call(this, fn);
- });
- };
- Mocha.Runner.prototype.run = function (fn) {
- this.on('test', (e) => {
- testZone = rootZone.fork(new ProxyZoneSpec());
- });
- this.on('fail', (test, err) => {
- const proxyZoneSpec = testZone && testZone.get('ProxyZoneSpec');
- if (proxyZoneSpec && err) {
- try {
-
- err.message += proxyZoneSpec.getAndClearPendingTasksInfo();
- }
- catch (error) {
- }
- }
- });
- return originalRun.call(this, fn);
- };
- })(Mocha.Runner.prototype.runTest, Mocha.Runner.prototype.run);
- });
- (function (_global) {
- class AsyncTestZoneSpec {
- static { this.symbolParentUnresolved = Zone.__symbol__('parentUnresolved'); }
- constructor(finishCallback, failCallback, namePrefix) {
- this.finishCallback = finishCallback;
- this.failCallback = failCallback;
- this._pendingMicroTasks = false;
- this._pendingMacroTasks = false;
- this._alreadyErrored = false;
- this._isSync = false;
- this._existingFinishTimer = null;
- this.entryFunction = null;
- this.runZone = Zone.current;
- this.unresolvedChainedPromiseCount = 0;
- this.supportWaitUnresolvedChainedPromise = false;
- this.name = 'asyncTestZone for ' + namePrefix;
- this.properties = { 'AsyncTestZoneSpec': this };
- this.supportWaitUnresolvedChainedPromise =
- _global[Zone.__symbol__('supportWaitUnResolvedChainedPromise')] === true;
- }
- isUnresolvedChainedPromisePending() {
- return this.unresolvedChainedPromiseCount > 0;
- }
- _finishCallbackIfDone() {
-
-
-
-
-
-
-
-
-
-
-
-
-
- if (this._existingFinishTimer !== null) {
- clearTimeout(this._existingFinishTimer);
- this._existingFinishTimer = null;
- }
- if (!(this._pendingMicroTasks || this._pendingMacroTasks ||
- (this.supportWaitUnresolvedChainedPromise && this.isUnresolvedChainedPromisePending()))) {
-
-
- this.runZone.run(() => {
- this._existingFinishTimer = setTimeout(() => {
- if (!this._alreadyErrored && !(this._pendingMicroTasks || this._pendingMacroTasks)) {
- this.finishCallback();
- }
- }, 0);
- });
- }
- }
- patchPromiseForTest() {
- if (!this.supportWaitUnresolvedChainedPromise) {
- return;
- }
- const patchPromiseForTest = Promise[Zone.__symbol__('patchPromiseForTest')];
- if (patchPromiseForTest) {
- patchPromiseForTest();
- }
- }
- unPatchPromiseForTest() {
- if (!this.supportWaitUnresolvedChainedPromise) {
- return;
- }
- const unPatchPromiseForTest = Promise[Zone.__symbol__('unPatchPromiseForTest')];
- if (unPatchPromiseForTest) {
- unPatchPromiseForTest();
- }
- }
- onScheduleTask(delegate, current, target, task) {
- if (task.type !== 'eventTask') {
- this._isSync = false;
- }
- if (task.type === 'microTask' && task.data && task.data instanceof Promise) {
-
- if (task.data[AsyncTestZoneSpec.symbolParentUnresolved] === true) {
-
- this.unresolvedChainedPromiseCount--;
- }
- }
- return delegate.scheduleTask(target, task);
- }
- onInvokeTask(delegate, current, target, task, applyThis, applyArgs) {
- if (task.type !== 'eventTask') {
- this._isSync = false;
- }
- return delegate.invokeTask(target, task, applyThis, applyArgs);
- }
- onCancelTask(delegate, current, target, task) {
- if (task.type !== 'eventTask') {
- this._isSync = false;
- }
- return delegate.cancelTask(target, task);
- }
-
-
-
-
-
- onInvoke(parentZoneDelegate, currentZone, targetZone, delegate, applyThis, applyArgs, source) {
- if (!this.entryFunction) {
- this.entryFunction = delegate;
- }
- try {
- this._isSync = true;
- return parentZoneDelegate.invoke(targetZone, delegate, applyThis, applyArgs, source);
- }
- finally {
-
-
-
-
-
-
-
-
-
-
- if (this._isSync && this.entryFunction === delegate) {
- this._finishCallbackIfDone();
- }
- }
- }
- onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
-
- const result = parentZoneDelegate.handleError(targetZone, error);
- if (result) {
- this.failCallback(error);
- this._alreadyErrored = true;
- }
- return false;
- }
- onHasTask(delegate, current, target, hasTaskState) {
- delegate.hasTask(target, hasTaskState);
-
-
-
-
-
-
-
-
-
-
-
-
- if (current !== target) {
- return;
- }
- if (hasTaskState.change == 'microTask') {
- this._pendingMicroTasks = hasTaskState.microTask;
- this._finishCallbackIfDone();
- }
- else if (hasTaskState.change == 'macroTask') {
- this._pendingMacroTasks = hasTaskState.macroTask;
- this._finishCallbackIfDone();
- }
- }
- }
-
-
- Zone['AsyncTestZoneSpec'] = AsyncTestZoneSpec;
- })(typeof window !== 'undefined' && window || typeof self !== 'undefined' && self || global);
- Zone.__load_patch('asynctest', (global, Zone, api) => {
-
- Zone[api.symbol('asyncTest')] = function asyncTest(fn) {
-
-
- if (global.jasmine) {
-
- return function (done) {
- if (!done) {
-
-
- done = function () { };
- done.fail = function (e) {
- throw e;
- };
- }
- runInTestZone(fn, this, done, (err) => {
- if (typeof err === 'string') {
- return done.fail(new Error(err));
- }
- else {
- done.fail(err);
- }
- });
- };
- }
-
-
-
-
- return function () {
- return new Promise((finishCallback, failCallback) => {
- runInTestZone(fn, this, finishCallback, failCallback);
- });
- };
- };
- function runInTestZone(fn, context, finishCallback, failCallback) {
- const currentZone = Zone.current;
- const AsyncTestZoneSpec = Zone['AsyncTestZoneSpec'];
- if (AsyncTestZoneSpec === undefined) {
- throw new Error('AsyncTestZoneSpec is needed for the async() test helper but could not be found. ' +
- 'Please make sure that your environment includes zone.js/plugins/async-test');
- }
- const ProxyZoneSpec = Zone['ProxyZoneSpec'];
- if (!ProxyZoneSpec) {
- throw new Error('ProxyZoneSpec is needed for the async() test helper but could not be found. ' +
- 'Please make sure that your environment includes zone.js/plugins/proxy');
- }
- const proxyZoneSpec = ProxyZoneSpec.get();
- ProxyZoneSpec.assertPresent();
-
-
- const proxyZone = Zone.current.getZoneWith('ProxyZoneSpec');
- const previousDelegate = proxyZoneSpec.getDelegate();
- proxyZone.parent.run(() => {
- const testZoneSpec = new AsyncTestZoneSpec(() => {
-
- if (proxyZoneSpec.getDelegate() == testZoneSpec) {
-
-
-
- proxyZoneSpec.setDelegate(previousDelegate);
- }
- testZoneSpec.unPatchPromiseForTest();
- currentZone.run(() => {
- finishCallback();
- });
- }, (error) => {
-
- if (proxyZoneSpec.getDelegate() == testZoneSpec) {
-
- proxyZoneSpec.setDelegate(previousDelegate);
- }
- testZoneSpec.unPatchPromiseForTest();
- currentZone.run(() => {
- failCallback(error);
- });
- }, 'test');
- proxyZoneSpec.setDelegate(testZoneSpec);
- testZoneSpec.patchPromiseForTest();
- });
- return Zone.current.runGuarded(fn, context);
- }
- });
- (function (global) {
- const OriginalDate = global.Date;
-
-
-
-
- function FakeDate() {
- if (arguments.length === 0) {
- const d = new OriginalDate();
- d.setTime(FakeDate.now());
- return d;
- }
- else {
- const args = Array.prototype.slice.call(arguments);
- return new OriginalDate(...args);
- }
- }
- FakeDate.now = function () {
- const fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (fakeAsyncTestZoneSpec) {
- return fakeAsyncTestZoneSpec.getFakeSystemTime();
- }
- return OriginalDate.now.apply(this, arguments);
- };
- FakeDate.UTC = OriginalDate.UTC;
- FakeDate.parse = OriginalDate.parse;
-
- const timers = {
- setTimeout: global.setTimeout,
- setInterval: global.setInterval,
- clearTimeout: global.clearTimeout,
- clearInterval: global.clearInterval
- };
- class Scheduler {
-
- static { this.nextId = 1; }
- constructor() {
-
- this._schedulerQueue = [];
-
- this._currentTickTime = 0;
-
- this._currentFakeBaseSystemTime = OriginalDate.now();
-
- this._currentTickRequeuePeriodicEntries = [];
- }
- getCurrentTickTime() {
- return this._currentTickTime;
- }
- getFakeSystemTime() {
- return this._currentFakeBaseSystemTime + this._currentTickTime;
- }
- setFakeBaseSystemTime(fakeBaseSystemTime) {
- this._currentFakeBaseSystemTime = fakeBaseSystemTime;
- }
- getRealSystemTime() {
- return OriginalDate.now();
- }
- scheduleFunction(cb, delay, options) {
- options = {
- ...{
- args: [],
- isPeriodic: false,
- isRequestAnimationFrame: false,
- id: -1,
- isRequeuePeriodic: false
- },
- ...options
- };
- let currentId = options.id < 0 ? Scheduler.nextId++ : options.id;
- let endTime = this._currentTickTime + delay;
-
- let newEntry = {
- endTime: endTime,
- id: currentId,
- func: cb,
- args: options.args,
- delay: delay,
- isPeriodic: options.isPeriodic,
- isRequestAnimationFrame: options.isRequestAnimationFrame
- };
- if (options.isRequeuePeriodic) {
- this._currentTickRequeuePeriodicEntries.push(newEntry);
- }
- let i = 0;
- for (; i < this._schedulerQueue.length; i++) {
- let currentEntry = this._schedulerQueue[i];
- if (newEntry.endTime < currentEntry.endTime) {
- break;
- }
- }
- this._schedulerQueue.splice(i, 0, newEntry);
- return currentId;
- }
- removeScheduledFunctionWithId(id) {
- for (let i = 0; i < this._schedulerQueue.length; i++) {
- if (this._schedulerQueue[i].id == id) {
- this._schedulerQueue.splice(i, 1);
- break;
- }
- }
- }
- removeAll() {
- this._schedulerQueue = [];
- }
- getTimerCount() {
- return this._schedulerQueue.length;
- }
- tickToNext(step = 1, doTick, tickOptions) {
- if (this._schedulerQueue.length < step) {
- return;
- }
-
-
- const startTime = this._currentTickTime;
- const targetTask = this._schedulerQueue[step - 1];
- this.tick(targetTask.endTime - startTime, doTick, tickOptions);
- }
- tick(millis = 0, doTick, tickOptions) {
- let finalTime = this._currentTickTime + millis;
- let lastCurrentTime = 0;
- tickOptions = Object.assign({ processNewMacroTasksSynchronously: true }, tickOptions);
-
-
-
- const schedulerQueue = tickOptions.processNewMacroTasksSynchronously ?
- this._schedulerQueue :
- this._schedulerQueue.slice();
- if (schedulerQueue.length === 0 && doTick) {
- doTick(millis);
- return;
- }
- while (schedulerQueue.length > 0) {
-
- this._currentTickRequeuePeriodicEntries = [];
- let current = schedulerQueue[0];
- if (finalTime < current.endTime) {
-
- break;
- }
- else {
-
- let current = schedulerQueue.shift();
- if (!tickOptions.processNewMacroTasksSynchronously) {
- const idx = this._schedulerQueue.indexOf(current);
- if (idx >= 0) {
- this._schedulerQueue.splice(idx, 1);
- }
- }
- lastCurrentTime = this._currentTickTime;
- this._currentTickTime = current.endTime;
- if (doTick) {
- doTick(this._currentTickTime - lastCurrentTime);
- }
- let retval = current.func.apply(global, current.isRequestAnimationFrame ? [this._currentTickTime] : current.args);
- if (!retval) {
-
- break;
- }
-
-
- if (!tickOptions.processNewMacroTasksSynchronously) {
- this._currentTickRequeuePeriodicEntries.forEach(newEntry => {
- let i = 0;
- for (; i < schedulerQueue.length; i++) {
- const currentEntry = schedulerQueue[i];
- if (newEntry.endTime < currentEntry.endTime) {
- break;
- }
- }
- schedulerQueue.splice(i, 0, newEntry);
- });
- }
- }
- }
- lastCurrentTime = this._currentTickTime;
- this._currentTickTime = finalTime;
- if (doTick) {
- doTick(this._currentTickTime - lastCurrentTime);
- }
- }
- flushOnlyPendingTimers(doTick) {
- if (this._schedulerQueue.length === 0) {
- return 0;
- }
-
-
- const startTime = this._currentTickTime;
- const lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
- this.tick(lastTask.endTime - startTime, doTick, { processNewMacroTasksSynchronously: false });
- return this._currentTickTime - startTime;
- }
- flush(limit = 20, flushPeriodic = false, doTick) {
- if (flushPeriodic) {
- return this.flushPeriodic(doTick);
- }
- else {
- return this.flushNonPeriodic(limit, doTick);
- }
- }
- flushPeriodic(doTick) {
- if (this._schedulerQueue.length === 0) {
- return 0;
- }
-
-
- const startTime = this._currentTickTime;
- const lastTask = this._schedulerQueue[this._schedulerQueue.length - 1];
- this.tick(lastTask.endTime - startTime, doTick);
- return this._currentTickTime - startTime;
- }
- flushNonPeriodic(limit, doTick) {
- const startTime = this._currentTickTime;
- let lastCurrentTime = 0;
- let count = 0;
- while (this._schedulerQueue.length > 0) {
- count++;
- if (count > limit) {
- throw new Error('flush failed after reaching the limit of ' + limit +
- ' tasks. Does your code use a polling timeout?');
- }
-
-
- if (this._schedulerQueue.filter(task => !task.isPeriodic && !task.isRequestAnimationFrame)
- .length === 0) {
- break;
- }
- const current = this._schedulerQueue.shift();
- lastCurrentTime = this._currentTickTime;
- this._currentTickTime = current.endTime;
- if (doTick) {
-
- doTick(this._currentTickTime - lastCurrentTime);
- }
- const retval = current.func.apply(global, current.args);
- if (!retval) {
-
- break;
- }
- }
- return this._currentTickTime - startTime;
- }
- }
- class FakeAsyncTestZoneSpec {
- static assertInZone() {
- if (Zone.current.get('FakeAsyncTestZoneSpec') == null) {
- throw new Error('The code should be running in the fakeAsync zone to call this function');
- }
- }
- constructor(namePrefix, trackPendingRequestAnimationFrame = false, macroTaskOptions) {
- this.trackPendingRequestAnimationFrame = trackPendingRequestAnimationFrame;
- this.macroTaskOptions = macroTaskOptions;
- this._scheduler = new Scheduler();
- this._microtasks = [];
- this._lastError = null;
- this._uncaughtPromiseErrors = Promise[Zone.__symbol__('uncaughtPromiseErrors')];
- this.pendingPeriodicTimers = [];
- this.pendingTimers = [];
- this.patchDateLocked = false;
- this.properties = { 'FakeAsyncTestZoneSpec': this };
- this.name = 'fakeAsyncTestZone for ' + namePrefix;
-
-
- if (!this.macroTaskOptions) {
- this.macroTaskOptions = global[Zone.__symbol__('FakeAsyncTestMacroTask')];
- }
- }
- _fnAndFlush(fn, completers) {
- return (...args) => {
- fn.apply(global, args);
- if (this._lastError === null) {
- if (completers.onSuccess != null) {
- completers.onSuccess.apply(global);
- }
-
- this.flushMicrotasks();
- }
- else {
- if (completers.onError != null) {
- completers.onError.apply(global);
- }
- }
-
- return this._lastError === null;
- };
- }
- static _removeTimer(timers, id) {
- let index = timers.indexOf(id);
- if (index > -1) {
- timers.splice(index, 1);
- }
- }
- _dequeueTimer(id) {
- return () => {
- FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
- };
- }
- _requeuePeriodicTimer(fn, interval, args, id) {
- return () => {
-
- if (this.pendingPeriodicTimers.indexOf(id) !== -1) {
- this._scheduler.scheduleFunction(fn, interval, { args, isPeriodic: true, id, isRequeuePeriodic: true });
- }
- };
- }
- _dequeuePeriodicTimer(id) {
- return () => {
- FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
- };
- }
- _setTimeout(fn, delay, args, isTimer = true) {
- let removeTimerFn = this._dequeueTimer(Scheduler.nextId);
-
- let cb = this._fnAndFlush(fn, { onSuccess: removeTimerFn, onError: removeTimerFn });
- let id = this._scheduler.scheduleFunction(cb, delay, { args, isRequestAnimationFrame: !isTimer });
- if (isTimer) {
- this.pendingTimers.push(id);
- }
- return id;
- }
- _clearTimeout(id) {
- FakeAsyncTestZoneSpec._removeTimer(this.pendingTimers, id);
- this._scheduler.removeScheduledFunctionWithId(id);
- }
- _setInterval(fn, interval, args) {
- let id = Scheduler.nextId;
- let completers = { onSuccess: null, onError: this._dequeuePeriodicTimer(id) };
- let cb = this._fnAndFlush(fn, completers);
-
- completers.onSuccess = this._requeuePeriodicTimer(cb, interval, args, id);
-
- this._scheduler.scheduleFunction(cb, interval, { args, isPeriodic: true });
- this.pendingPeriodicTimers.push(id);
- return id;
- }
- _clearInterval(id) {
- FakeAsyncTestZoneSpec._removeTimer(this.pendingPeriodicTimers, id);
- this._scheduler.removeScheduledFunctionWithId(id);
- }
- _resetLastErrorAndThrow() {
- let error = this._lastError || this._uncaughtPromiseErrors[0];
- this._uncaughtPromiseErrors.length = 0;
- this._lastError = null;
- throw error;
- }
- getCurrentTickTime() {
- return this._scheduler.getCurrentTickTime();
- }
- getFakeSystemTime() {
- return this._scheduler.getFakeSystemTime();
- }
- setFakeBaseSystemTime(realTime) {
- this._scheduler.setFakeBaseSystemTime(realTime);
- }
- getRealSystemTime() {
- return this._scheduler.getRealSystemTime();
- }
- static patchDate() {
- if (!!global[Zone.__symbol__('disableDatePatching')]) {
-
-
-
-
-
- return;
- }
- if (global['Date'] === FakeDate) {
-
- return;
- }
- global['Date'] = FakeDate;
- FakeDate.prototype = OriginalDate.prototype;
-
-
-
- FakeAsyncTestZoneSpec.checkTimerPatch();
- }
- static resetDate() {
- if (global['Date'] === FakeDate) {
- global['Date'] = OriginalDate;
- }
- }
- static checkTimerPatch() {
- if (global.setTimeout !== timers.setTimeout) {
- global.setTimeout = timers.setTimeout;
- global.clearTimeout = timers.clearTimeout;
- }
- if (global.setInterval !== timers.setInterval) {
- global.setInterval = timers.setInterval;
- global.clearInterval = timers.clearInterval;
- }
- }
- lockDatePatch() {
- this.patchDateLocked = true;
- FakeAsyncTestZoneSpec.patchDate();
- }
- unlockDatePatch() {
- this.patchDateLocked = false;
- FakeAsyncTestZoneSpec.resetDate();
- }
- tickToNext(steps = 1, doTick, tickOptions = { processNewMacroTasksSynchronously: true }) {
- if (steps <= 0) {
- return;
- }
- FakeAsyncTestZoneSpec.assertInZone();
- this.flushMicrotasks();
- this._scheduler.tickToNext(steps, doTick, tickOptions);
- if (this._lastError !== null) {
- this._resetLastErrorAndThrow();
- }
- }
- tick(millis = 0, doTick, tickOptions = { processNewMacroTasksSynchronously: true }) {
- FakeAsyncTestZoneSpec.assertInZone();
- this.flushMicrotasks();
- this._scheduler.tick(millis, doTick, tickOptions);
- if (this._lastError !== null) {
- this._resetLastErrorAndThrow();
- }
- }
- flushMicrotasks() {
- FakeAsyncTestZoneSpec.assertInZone();
- const flushErrors = () => {
- if (this._lastError !== null || this._uncaughtPromiseErrors.length) {
-
- this._resetLastErrorAndThrow();
- }
- };
- while (this._microtasks.length > 0) {
- let microtask = this._microtasks.shift();
- microtask.func.apply(microtask.target, microtask.args);
- }
- flushErrors();
- }
- flush(limit, flushPeriodic, doTick) {
- FakeAsyncTestZoneSpec.assertInZone();
- this.flushMicrotasks();
- const elapsed = this._scheduler.flush(limit, flushPeriodic, doTick);
- if (this._lastError !== null) {
- this._resetLastErrorAndThrow();
- }
- return elapsed;
- }
- flushOnlyPendingTimers(doTick) {
- FakeAsyncTestZoneSpec.assertInZone();
- this.flushMicrotasks();
- const elapsed = this._scheduler.flushOnlyPendingTimers(doTick);
- if (this._lastError !== null) {
- this._resetLastErrorAndThrow();
- }
- return elapsed;
- }
- removeAllTimers() {
- FakeAsyncTestZoneSpec.assertInZone();
- this._scheduler.removeAll();
- this.pendingPeriodicTimers = [];
- this.pendingTimers = [];
- }
- getTimerCount() {
- return this._scheduler.getTimerCount() + this._microtasks.length;
- }
- onScheduleTask(delegate, current, target, task) {
- switch (task.type) {
- case 'microTask':
- let args = task.data && task.data.args;
-
-
-
- let additionalArgs;
- if (args) {
- let callbackIndex = task.data.cbIdx;
- if (typeof args.length === 'number' && args.length > callbackIndex + 1) {
- additionalArgs = Array.prototype.slice.call(args, callbackIndex + 1);
- }
- }
- this._microtasks.push({
- func: task.invoke,
- args: additionalArgs,
- target: task.data && task.data.target
- });
- break;
- case 'macroTask':
- switch (task.source) {
- case 'setTimeout':
- task.data['handleId'] = this._setTimeout(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
- break;
- case 'setImmediate':
- task.data['handleId'] = this._setTimeout(task.invoke, 0, Array.prototype.slice.call(task.data['args'], 1));
- break;
- case 'setInterval':
- task.data['handleId'] = this._setInterval(task.invoke, task.data['delay'], Array.prototype.slice.call(task.data['args'], 2));
- break;
- case 'XMLHttpRequest.send':
- throw new Error('Cannot make XHRs from within a fake async test. Request URL: ' +
- task.data['url']);
- case 'requestAnimationFrame':
- case 'webkitRequestAnimationFrame':
- case 'mozRequestAnimationFrame':
-
-
- task.data['handleId'] = this._setTimeout(task.invoke, 16, task.data['args'], this.trackPendingRequestAnimationFrame);
- break;
- default:
-
-
- const macroTaskOption = this.findMacroTaskOption(task);
- if (macroTaskOption) {
- const args = task.data && task.data['args'];
- const delay = args && args.length > 1 ? args[1] : 0;
- let callbackArgs = macroTaskOption.callbackArgs ? macroTaskOption.callbackArgs : args;
- if (!!macroTaskOption.isPeriodic) {
-
- task.data['handleId'] = this._setInterval(task.invoke, delay, callbackArgs);
- task.data.isPeriodic = true;
- }
- else {
-
- task.data['handleId'] = this._setTimeout(task.invoke, delay, callbackArgs);
- }
- break;
- }
- throw new Error('Unknown macroTask scheduled in fake async test: ' + task.source);
- }
- break;
- case 'eventTask':
- task = delegate.scheduleTask(target, task);
- break;
- }
- return task;
- }
- onCancelTask(delegate, current, target, task) {
- switch (task.source) {
- case 'setTimeout':
- case 'requestAnimationFrame':
- case 'webkitRequestAnimationFrame':
- case 'mozRequestAnimationFrame':
- return this._clearTimeout(task.data['handleId']);
- case 'setInterval':
- return this._clearInterval(task.data['handleId']);
- default:
-
-
- const macroTaskOption = this.findMacroTaskOption(task);
- if (macroTaskOption) {
- const handleId = task.data['handleId'];
- return macroTaskOption.isPeriodic ? this._clearInterval(handleId) :
- this._clearTimeout(handleId);
- }
- return delegate.cancelTask(target, task);
- }
- }
- onInvoke(delegate, current, target, callback, applyThis, applyArgs, source) {
- try {
- FakeAsyncTestZoneSpec.patchDate();
- return delegate.invoke(target, callback, applyThis, applyArgs, source);
- }
- finally {
- if (!this.patchDateLocked) {
- FakeAsyncTestZoneSpec.resetDate();
- }
- }
- }
- findMacroTaskOption(task) {
- if (!this.macroTaskOptions) {
- return null;
- }
- for (let i = 0; i < this.macroTaskOptions.length; i++) {
- const macroTaskOption = this.macroTaskOptions[i];
- if (macroTaskOption.source === task.source) {
- return macroTaskOption;
- }
- }
- return null;
- }
- onHandleError(parentZoneDelegate, currentZone, targetZone, error) {
- this._lastError = error;
- return false;
- }
- }
-
-
- Zone['FakeAsyncTestZoneSpec'] = FakeAsyncTestZoneSpec;
- })(typeof window === 'object' && window || typeof self === 'object' && self || global);
- Zone.__load_patch('fakeasync', (global, Zone, api) => {
- const FakeAsyncTestZoneSpec = Zone && Zone['FakeAsyncTestZoneSpec'];
- function getProxyZoneSpec() {
- return Zone && Zone['ProxyZoneSpec'];
- }
- let _fakeAsyncTestZoneSpec = null;
-
- function resetFakeAsyncZone() {
- if (_fakeAsyncTestZoneSpec) {
- _fakeAsyncTestZoneSpec.unlockDatePatch();
- }
- _fakeAsyncTestZoneSpec = null;
-
- getProxyZoneSpec() && getProxyZoneSpec().assertPresent().resetDelegate();
- }
-
- function fakeAsync(fn) {
-
- const fakeAsyncFn = function (...args) {
- const ProxyZoneSpec = getProxyZoneSpec();
- if (!ProxyZoneSpec) {
- throw new Error('ProxyZoneSpec is needed for the async() test helper but could not be found. ' +
- 'Please make sure that your environment includes zone.js/plugins/proxy');
- }
- const proxyZoneSpec = ProxyZoneSpec.assertPresent();
- if (Zone.current.get('FakeAsyncTestZoneSpec')) {
- throw new Error('fakeAsync() calls can not be nested');
- }
- try {
-
- if (!_fakeAsyncTestZoneSpec) {
- if (proxyZoneSpec.getDelegate() instanceof FakeAsyncTestZoneSpec) {
- throw new Error('fakeAsync() calls can not be nested');
- }
- _fakeAsyncTestZoneSpec = new FakeAsyncTestZoneSpec();
- }
- let res;
- const lastProxyZoneSpec = proxyZoneSpec.getDelegate();
- proxyZoneSpec.setDelegate(_fakeAsyncTestZoneSpec);
- _fakeAsyncTestZoneSpec.lockDatePatch();
- try {
- res = fn.apply(this, args);
- flushMicrotasks();
- }
- finally {
- proxyZoneSpec.setDelegate(lastProxyZoneSpec);
- }
- if (_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length > 0) {
- throw new Error(`${_fakeAsyncTestZoneSpec.pendingPeriodicTimers.length} ` +
- `periodic timer(s) still in the queue.`);
- }
- if (_fakeAsyncTestZoneSpec.pendingTimers.length > 0) {
- throw new Error(`${_fakeAsyncTestZoneSpec.pendingTimers.length} timer(s) still in the queue.`);
- }
- return res;
- }
- finally {
- resetFakeAsyncZone();
- }
- };
- fakeAsyncFn.isFakeAsync = true;
- return fakeAsyncFn;
- }
- function _getFakeAsyncZoneSpec() {
- if (_fakeAsyncTestZoneSpec == null) {
- _fakeAsyncTestZoneSpec = Zone.current.get('FakeAsyncTestZoneSpec');
- if (_fakeAsyncTestZoneSpec == null) {
- throw new Error('The code should be running in the fakeAsync zone to call this function');
- }
- }
- return _fakeAsyncTestZoneSpec;
- }
-
- function tick(millis = 0, ignoreNestedTimeout = false) {
- _getFakeAsyncZoneSpec().tick(millis, null, ignoreNestedTimeout);
- }
-
- function flush(maxTurns) {
- return _getFakeAsyncZoneSpec().flush(maxTurns);
- }
-
- function discardPeriodicTasks() {
- const zoneSpec = _getFakeAsyncZoneSpec();
- zoneSpec.pendingPeriodicTimers;
- zoneSpec.pendingPeriodicTimers.length = 0;
- }
-
- function flushMicrotasks() {
- _getFakeAsyncZoneSpec().flushMicrotasks();
- }
- Zone[api.symbol('fakeAsyncTest')] =
- { resetFakeAsyncZone, flushMicrotasks, discardPeriodicTasks, tick, flush, fakeAsync };
- }, true);
- Zone.__load_patch('promisefortest', (global, Zone, api) => {
- const symbolState = api.symbol('state');
- const UNRESOLVED = null;
- const symbolParentUnresolved = api.symbol('parentUnresolved');
-
-
-
-
-
-
-
- Promise[api.symbol('patchPromiseForTest')] = function patchPromiseForTest() {
- let oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
- if (oriThen) {
- return;
- }
- oriThen = Promise[Zone.__symbol__('ZonePromiseThen')] = Promise.prototype.then;
- Promise.prototype.then = function () {
- const chained = oriThen.apply(this, arguments);
- if (this[symbolState] === UNRESOLVED) {
-
- const asyncTestZoneSpec = Zone.current.get('AsyncTestZoneSpec');
- if (asyncTestZoneSpec) {
- asyncTestZoneSpec.unresolvedChainedPromiseCount++;
- chained[symbolParentUnresolved] = true;
- }
- }
- return chained;
- };
- };
- Promise[api.symbol('unPatchPromiseForTest')] = function unpatchPromiseForTest() {
-
- const oriThen = Promise[Zone.__symbol__('ZonePromiseThen')];
- if (oriThen) {
- Promise.prototype.then = oriThen;
- Promise[Zone.__symbol__('ZonePromiseThen')] = undefined;
- }
- };
- });
|