SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
CREATING WINDOWS STORE JAVASCRIPT
              APPS

     revealed by Eugene Zharkov / @2j2e
PROTOTYPE




Check official UX guidlines
APP FLOW
Do not forget about:
 Form factors
 App contracts
 All type of the tiles
 Toast notifications
 Touch first
 Animations
ASYNC PATTERNS
     You should understand how:
to compose asynchronous code
to use promises
to chain and group promises
to code promise chains to avoid nesting
to wrap non-promise values in a promise
to handle errors in a promise
PROMISES
A promise is an object that represent a value that will be
                     available later.

        Most API's are wraped to the promises.

      All based on two methods .then and .done.
PROMISES
 A promise is an object that represent a value that will be
                      available later.
HiloHiloimageQueryBuilder.js

  i (hsstig.idbe {
   f ti.etnsbnal)
  / Cet `ioPcue ojcsisedo rtrig`trgFl`ojcs
   / rae Hl.itr` bet nta f eunn Soaeie bet
     qeyrms =qeyrms.hnti.cetVeMdl)
      urPoie  urPoiete(hs_raeiwoes;
  }
PROMISE CHAIN
vrweIaeFrieeree =qeyule.ul(itrsirr)eeue
 a hnmgsoTlRtivd  urBidrbidpcueLbay.xct(
);
weIaeFrieeree
 hnmgsoTlRtivd
    .hnHl.ie.raeieredymgs
     te(ioTlscetTlFinlIae)
    .hnti.eLclmgPts
     te(hsgtoaIaeah)
    .hnHl.ie.raeiepae)
     te(ioTlscetTlUdts
    .hnqeeiepae)
     te(uuTlUdts;
PROMISE CHAIN
BIND FUNCTION
                    Define funtion environment with .bind
HiloHiloTilesTileUpdater.js

  vrqeeiepae =ti.uuTlUdtsbn(hs;
   a uuTlUdts  hsqeeiepae.idti)

  qeeiepae:fnto (oiiain){
   uuTlUdts ucin ntfctos
      vrsl =ti;
       a ef   hs
      ntfctosfrahfnto (oiiain {
       oiiain.oEc(ucin ntfcto)
           sl.iepae.paentfcto)
            eftlUdtrudt(oiiain;
      };
       )
  },
BIND FUNCTION
                   Bind can receive additional parameters.
HiloHiloTilescreateTileFriendlyImages.js

  fnto cetTlFinlIae(ie){
   ucin raeieredymgsfls
       vrlclodr=apiainaacretlclodr
        a oaFle  plctoDt.urn.oaFle;

              vrcpTubalTFle =cpFlsoodrbn(ul fls;
               a oyhmnisoodr  oyieTFle.idnl, ie)

      vrweFleCetd=lclodrcetFleAyctubalodr
       a hnodrrae  oaFle.raeodrsn(hmniFle
  Nm,cetoCliinpinrpaexsig;
   ae rainolsoOto.elcEitn)

              rtr weFleCetd
               eun hnodrrae
                   .hncpTubalTFle)
                    te(oyhmnisoodr;
  }
GROUPING A PROMISE
  When you have non-sequential, asynchronous operations
that must all complete before you can continue a task, you can
                 use the WinJS.Promise.join
   vrweFlIOe =treFl.pnsn(iecesoeraWie;
    a hniespn  agtieoeAycflAcsMd.edrt)
   vrweTubiIRay=sucFl.eTubalsn(hmniMd.iget
    a hnhmalsed   oreiegthmniAyctubaloesnlI
   e)
    m;
   vrweEeyhnIRay=WnSPoieji( oee:weFlIOe,ra
    a hnvrtigsed   iJ.rms.on{ pnd hniespn ed
   y weTubiIRay};
    : hnhmalsed )
HANDLING ERRORS
        Use .done at the end of method chain.

It doesn't return another promise and throw unhandled
                       expetions.
HANDLING ERRORS
HiloHilocropcroppedImageWriter.js

  vrdcdrrms =gtretto
   a eoePoie   eOinain
  .hnfnto (ereePos {
   te(ucin rtivdrp)
      eiOinain=(ereePossz !=0
       xfretto    rtivdrp.ie = )
           ?rtivdrp[Sse.ht.retto"
             ereePos"ytmPooOinain]
           :pooretto.oml
             htOinainnra;

  } fnto (ro){
   , ucin err
       sic (ro.ubr {
        wth errnme)
            cs Hl.mgWie.ICDCERUSPOTDPRTO:
             ae ioIaertrWNOE_R_NUPREOEAIN
            cs Hl.mgWie.ICDCERPOETNTUPRE:
             ae ioIaertrWNOE_R_RPRYOSPOTD
                 eiOinain=pooretto.oml
                  xfretto  htOinainnra;
                 bek
                  ra;
            dfut
             eal:
                 trwerr
                  ho ro;
       }
  };
   )
MVP
The model represents the state and operations of business
objects that your app manipulates
The view (HTML and CSS) defines the structure, layout, and
appearance of what the user sees on the screen. The view
manages the controls on the page and forwards user events
to a presenter class
The presenter contains the logic to respond to events,
update the model and, in turn, manipulate the state of the
view
MVP - VIEW
HiloHilohubhub.html

  <i i=hbiaetmlt"dt-i-oto=WnSBnigTmlt"
   dv d"u-mg-epae aawncnrl"iJ.idn.epae>
     <i dt-i-id"tl.akrudmg:ulbcgonUl at nm;
      dv aawnbn=syebcgonIae r.akrudr; l: ae
  casae casae cas"hmni"
   lsNm: lsNm" ls=tubal>
     <dv
      /i>
  <dv
   /i>
MVP - PRESENTER TEST
HiloHilo.SpecficationsspecshubListViewPresenter.spec.js

  dsrb(we sapd,fnto ( {
   ecie"hn npe" ucin )
     vre;
      a l

        bfrEc(ucin( {
         eoeahfnto )
          vrapiw={;
           a pVe   }
          e =nwSesWnotoSu(;
           l  e pc.iCnrltb)
          e.iCnrladvnLsee =fnto ( {}
           lwnoto.dEetitnr  ucin )  ;

              vrlsvePeetr=nwHl.u.itiwrsne(l apiw
               a itiwrsne  e ioHbLsVePeetre, pVe)
  ;
        lsvePeetrstiwtt(idw.IVeMngmn.plcto
         itiwrsne.eVeSaeWnosU.iwaaeetApiai
  niwtt.npe)
   VeSaesapd;
     };
      )

     i(teLsVe sol ueaLsLyu" fnto ( {
      t"h itiw hud s  itaot, ucin )
        epc(lwnoto.aotisaco WnSU.itaot.qa(
         xete.iCnrllyu ntnef iJ.ILsLyu)eult
  re;
   u)
     };
      )

  };
   )
PRESENTERS
Each presenter is responsible for a specific part of the page (a
                          control)

One page-specific presenter (the mediator) coordinates the
other presenters (control-specific) and receives forwarded
                          events
PRESENTERS
HiloHilodetaildetail.js

  ray fnto (lmn,otos {
   ed: ucin eeet pin)

     vrqey=otosqey
      a ur   pin.ur;
     vrqeyae=qeystig.otAder
      a urDt   ur.etnsmnhnYa;
     vrpgTte=Hl.aeomte.eMnhrmqeyae +""+Hl
      a aeil   iodtFratrgtotFo(urDt)    io
  .aeomte.eYaFo(urDt)
   dtFratrgterrmqeyae;
     ti.idaeil(aeil)
      hsbnPgTtepgTte;

     vrhlApaE =dcmn.urSlco(#pbr)
      a iopBrl  ouetqeyeetr"apa";
     vrhlApa =nwHl.otosHlApa.iopBrrsne(io
      a iopBr  e ioCnrl.iopBrHlApaPeetrhlA
  pBrl WnSNvgto,qey;
   paE, iJ.aiain ur)

         vrflsrpl=dcmn.urSlco(#imti";
          a imtiE   ouetqeyeetr"flsrp)
         vrfiveE =dcmn.urSlco(#lpiw)
          a lpiwl  ouetqeyeetr"five";

         vrfivePeetr=nwHl.ealFivePeetrfiveE)
          a lpiwrsne  e ioDti.lpiwrsne(lpiwl;
         vrflsrprsne =nwHl.ealFlsrprsne(imtiE
          a imtiPeetr  e ioDti.imtiPeetrflsrpl
  );


     vrdtiPeetr=nwHl.ealDtiPeetrflsrprsne
      a ealrsne    e ioDti.ealrsne(imtiPeet
  r fivePeetr hlApa,WnSNvgto)
   , lpiwrsne, iopBr iJ.aiain;
     dtiPeetradvnLsee(pgSlce" fnto (rs {
      ealrsne.dEetitnr"aeeetd, ucin ag)
        vrieIdx=ag.ealieIdx
         a tmne   rsdti.tmne;
        otosieIdx=ieIdx
         pin.tmne   tmne;
     };
      )

         dtiPeetr
          ealrsne
SEPARATING RESPONSIBILITIES
HiloHilohubhub.html

  <eto i=iaenv dt-i-oto=WnSU.tloto"dt-i-pi
   scin d"mg-a" aawncnrl"iJ.IHmCnrl aawnot
  os"ui 'Hl/otosHlApa/iopBrhm'"<scin
   n={r: /iocnrl/iopBrhlApa.tl}>/eto>

HiloHilocontrolsHiloAppBarhiloAppBar.html

  <i i=apa"dt-i-oto=WnSU.pBr dt-i-pin={tcy
   dv d"pbr aawncnrl"iJ.IApa" aawnotos"sik
  :fle"
    as}>
     <utn
      bto
       dt-i-oto=WnSU.pBromn"
        aawncnrl"iJ.IApaCmad
       dt-i-pin={d'oae,io:rtt' scin 'eeto'
        aawnotos"i:rtt' cn'oae, eto: slcin,
  dsbe:tu}
   iald re"
       dt-i-id"dsbe:iCrut"
        aawnbn={iald sorp}
       dt-i-e={iCnrl {ae:RttApaBto.ae}"
        aawnrs"wnoto: lbl'oaepBrutnNm'}>
     <bto>
      /utn
     <utn
      bto
       dt-i-oto=WnSU.pBromn"
        aawncnrl"iJ.IApaCmad
       dt-i-pin={d'rp,io:co' scin 'eeto' ds
        aawnotos"i:co' cn'rp, eto: slcin, ia
  be:tu}
   ld re"
       dt-i-id"dsbe:iCrut"
        aawnbn={iald sorp}
       dt-i-e={iCnrl {ae:CoApaBto.ae}"
        aawnrs"wnoto: lbl'rppBrutnNm'}>
     <bto>
      /utn
  <dv
   /i>
UPDATING TILES
Hilodefault.js

  i (urnSaekn ==atvto.ciainidluc){
   f crettt.id = ciainAtvtoKn.anh

     i (urnSaepeiuEeuintt !=atvto.plctoEeui
      f crettt.rvosxctoSae = ciainApiainxct
  oSaetriae){
   ntt.emntd

                  / We teapi satd w wn t udt istl
                   / hn h p s tre, e at o pae t ie
                  / o tesatsre.Sneti AIi ntacsil
                   / n h tr cen ic hs P s o cesbe
                  / isd o Bed w ol ivk i we w aenti
                   / nie f ln, e ny noe t hn e r o n
                  / dsg md.
                   / ein oe
                  i (WnosApiainoe.einoedsgMdEald {
                   f !idw.plctoMdlDsgMd.einoenbe)
                     vrtlUdtr=nwHl.ie.iepae(;
                      a iepae   e ioTlsTlUdtr)
                     tlUdtrudt(;
                      iepae.pae)
                  }
  }
UPDATING TILES
HiloHiloTilesTileUpdater.js

  udt:fnto ( {
   pae ucin )
     / Bn tefnto t acnet s ta `hs wl b rsle
      / id h ucin o   otx, o ht ti` il e eovd
     / we i i ivkdi tepoie
      / hn t s noe n h rms.
     vrqeeiepae =ti.uuTlUdtsbn(hs;
      a uuTlUdts    hsqeeiepae.idti)

        / Bidaqeyt gttenme o iae nee frtetls
         / ul  ur o e h ubr f mgs edd o h ie.
        vrqeyule =nwHl.mgQeyule(;
         a urBidr  e ioIaeurBidr)
        qeyule.on(ubrfmgsoeree;
         urBidrcutnmeOIaeTRtiv)

     vrweIaeFrieeree =qeyule.ul(itrsirr)ee
      a hnmgsoTlRtivd   urBidrbidpcueLbay.xc
  ue)
   t(;
     weIaeFrieeree
      hnmgsoTlRtivd
        .hnHl.ie.raeieredymgs
         te(ioTlscetTlFinlIae)
        .hnti.eLclmgPts
         te(hsgtoaIaeah)
        .hnHl.ie.raeiepae)
         te(ioTlscetTlUdts
        .hnqeeiepae)
         te(uuTlUdts;
  }
UPDATING TILES
      The XML for a typical tile notification
<ie
 tl>
  <iul
   vsa>
    <idn tmlt=TlWdIaeolcin>
     bnig epae"ieiemgCleto"
     <mg i=1 sc"sapaa//oa/hmnistubmg_.p">
      iae d"" r=m-pdt:/lcltubal/hmIae0jg/
     <mg i=2 sc"sapaa//oa/hmnistubmg_.p">
      iae d"" r=m-pdt:/lcltubal/hmIae1jg/
     <mg i=3 sc"sapaa//oa/hmnistubmg_.p">
      iae d"" r=m-pdt:/lcltubal/hmIae2jg/
     <mg i=4 sc"sapaa//oa/hmnistubmg_.p">
      iae d"" r=m-pdt:/lcltubal/hmIae3jg/
     <mg i=5 sc"sapaa//oa/hmnistubmg_.p">
      iae d"" r=m-pdt:/lcltubal/hmIae4jg/
    <bnig
     /idn>
  <idn tmlt=TlSurIae>
   bnig epae"ieqaemg"
     <mg i=1 sc"sapaa//oa/hmnistubmg_.p">
      iae d"" r=m-pdt:/lcltubal/hmIae0jg/
    <bnig
     /idn>
  <vsa>
   /iul
<tl>
 /ie
PAGE NAVIGATION
HiloDefault.html

  <i i=cnetot dt-i-oto=Hl.aeotoNvgtr dt-i-
   dv d"otnhs" aawncnrl"ioPgCnrlaiao" aawno
  pin={oe 'Hl/u/u.tl}>
   tos"hm: /iohbhbhm'"
  <dv
   /i>

HiloHilohubhubPresenter.js

  ieCikd fnto (rs {
   tmlce: ucin ag)

        / Gtte`ioPcue ie ta wsbudt teivkdiae
         / e h Hl.itr` tm ht a on o h noe mg,
        / adteie idxfo tels ve cnrl
         / n h tm ne rm h it iw oto.
        vrpcue=ag.ealie.aa
         a itr   rsdti.tmdt;

        / Bidteqeyta cnfn ti pcuewti i' mnhgop
         / ul h ur ht a id hs itr ihn ts ot ru.
        vrotos=ti.ulQeyoPcuepcue;
         a pin   hsbidurFritr(itr)

        / Nvgt t tedti ve,seiyn temnhqeyt
         / aiae o h eal iw pcfig h ot ur o
        / so,adteidxo teidvda ie ta wsivkd
         / hw n h ne f h niiul tm ht a noe.
        ti.a.aiae"Hl/ealdti.tl,otos;
         hsnvnvgt(/iodti/ealhm" pin)
  },
CREATING PAGES
HiloHilohubhub.js

  Hl.otospgsdfn(hb,{
   iocnrl.ae.eie"u"

        ray fnto (lmn,otos {
         ed: ucin eeet pin)

              / Hnl teapbrbto cik frsoigadhdn teap
               / ade h p a utn lcs o hwn n iig h p
  br
   a.
       vrapaE =dcmn.urSlco(#pbr)
        a pBrl  ouetqeyeetr"apa";
       vrhlApa =nwHl.otosHlApa.iopBrrsne(
        a iopBr  e ioCnrl.iopBrHlApaPeetra
  pBrl WnSNvgto)
   paE, iJ.aiain;

       / Hnl slcigadivkn (lcig iae.
        / ade eetn n noig cikn) mgs
       vrlsVeE =dcmn.urSlco(#itrsirr";
        a itiwl   ouetqeyeetr"pcueLbay)
       ti.itiwrsne =nwHl.u.itiwrsne(itiwl
        hslsVePeetr   e ioHbLsVePeetrlsVeE,
   WnosU.iwaaeetApiainiw;
    idw.IVeMngmn.plctoVe)

              / Codnt teprso tehbpg.
               / oriae h at f h u ae
              ti.uVePeetr=nwHl.u.uVePeetr
               hshbiwrsne   e ioHbHbiwrsne(
                 WnSNvgto,
                  iJ.aiain
                 hlApa,
                  iopBr
                 ti.itiwrsne,
                  hslsVePeetr
                 nwHl.mgQeyule(
                  e ioIaeurBidr)
              );

      ti.uVePeetr
       hshbiwrsne
         .tr(nwFlespcueLbay
          satkonodr.itrsirr)
         .hnfnto ( {
          te(ucin )
            WnSApiainadvnLsee(Hl:otnshne"
             iJ.plcto.dEetitnr"ioCnetCagd,
  Hl.aiao.eod;
   ionvgtrrla)
SUPPORTING DIFFERENT LAYOUTS
HiloHiloPageControlNavigator.js

   fnto PgCnrlaiao(lmn,otos {
    ucin aeotoNvgtreeet pin)

             / ...
              /

             wno.neie=ti.rszdbn(hs;
              idworsz  hs_eie.idti)

             / ...
              /
        },

  _eie:fnto (rs {
   rszd ucin ag)
      i (hspgCnrl& ti.aeoto.paeaot {
       f ti.aeoto & hspgCnrludtLyu)
         ti.aeoto.paeaotcl(hspgCnrl ti.aelmn
          hspgCnrludtLyu.alti.aeoto, hspgEeet
  ,apiwvle ti.lsVesae;
     pVe.au, hs_atiwtt)
      }
      ti.lsVesae=apiwvle
       hs_atiwtt   pVe.au;
  },
SUPPORTING DIFFERENT LAYOUTS
HiloHilohubhub.js

  udtLyu:fnto (lmn,veSae lsVeSae {
   paeaot ucin eeet iwtt, atiwtt)
     ti.itiwrsne.eVeSaeveSae lsVeSae;
      hslsVePeetrstiwtt(iwtt, atiwtt)
  },

HiloHilohublistViewPresenter.js

  stiwtt:fnto (iwtt){
   eVeSae ucin veSae
     ti.vlyu =ti.eetaotveSae;
      hsl.aot  hsslcLyu(iwtt)
  },

  slcLyu:fnto (iwtt,lsVeSae {
   eetaot ucin veSae atiwtt)

        i (atiwtt ==veSae {rtr;}
         f lsVeSae = iwtt)  eun

        i (iwtt ==apiwtt.npe){
         f veSae = pVeSaesapd
           rtr nwWnSU.itaot)
            eun e iJ.ILsLyu(;
        }
        es {
         le
           vrlyu =nwWnSU.rdaot)
            a aot   e iJ.IGiLyu(;
           lyu.ruIf =fnto ( {rtr lsVeLyuStig;}
            aotgopno    ucin ) eun itiwaotetns ;
           lyu.aRw =3
            aotmxos   ;
           rtr lyu;
            eun aot
        }
  },
DATA BINDING
Templates for group items and group headers in the normal
                          view.
HiloHilomonthmonth.html

  <i i=mnhtmepae dt-i-oto=WnSBnigTmlt"
   dv d"otIeTmlt" aawncnrl"iJ.idn.epae>
     <i dt-i-id"tl.akrudmg:ulbcgonUl casae
      dv aawnbn=syebcgonIae r.akrudr; lsNm:
  casae>/i>
   lsNm"<dv
  <dv
   /i>

  <i i=mnhruHaeTmlt"dt-i-oto=WnSBnigTmlt"
   dv d"otGopedrepae aawncnrl"iJ.idn.epae>
     < cas"otLn"he=#>sa dt-i-id"neHM:tte>/p
      a ls=mnhik rf""<pn aawnbn=inrTL il"<s
  a>(sa dt-i-id"neTx:cut>/pn)/>
   n <pn aawnbn=inret on"<sa><a
  <dv
   /i>

  <i i=mnhnpeTmlt"dt-i-oto=WnSBnigTmlt"
   dv d"otSapdepae aawncnrl"iJ.idn.epae>
     <pndt-i-id"neHM:tte>/pn (sa dt-i-id"ne
      sa aawnbn=inrTL il"<sa> <pn aawnbn=in
  ret cut>/pn)
   Tx: on"<sa>
     <i dt-i-id"tl.akrudmg:bcgonUl"cas"hmn
      dv aawnbn=syebcgonIae akrudr; ls=tuba
  i"<dv
   l>/i>
  <dv
   /i>
DATA SOURCE TYPES
WinJS.Binding.List - synchronous data source, in-memory
data source (an array), all its data must be available for
display
StorageDataSource - built-in support for the Windows file
system
VirtualizedDataSource - custom implementation
UX
You should provide both pointer and touch experience to your
                              user.
The pointer is an old school, touch control requires some skills
                        from developer.
OBJECT ROTATION
HiloHilorotateTouchProvider.js

  fnto Tuhrvdrosrco(nuEeet {
   ucin ocPoieCntutriptlmn)

     vrrcgie =nwWnosU.nu.etrRcgie(;
      a eonzr  e idw.IIptGsueeonzr)
     rcgie.etrStig =WnosU.nu.etrStig.aiua
      eonzrgsueetns  idw.IIptGsueetnsmnplt
  inoae
   oRtt;

        iptlmn.dEetitnr"SoneDw" fnto (v){
         nuEeetadvnLsee(MPitron, ucin et
          vrp =etcreton;
           a p  v.urnPit
          i (ppitreiepitreieye==pitreieyetuh
           f p.oneDvc.oneDvcTp = oneDvcTp.oc)
   {
                    rcgie.rcsDwEetp)
                     eonzrpoesonvn(p;
           }
        } fle;
         , as)

     iptlmn.dEetitnr"SoneMv" fnto (v){
      nuEeetadvnLsee(MPitroe, ucin et
        vrps=etitreitPit;
         a p   v.nemdaeons
        i (p[]& ps0.oneDvc.oneDvcTp ==pitre
         f ps0 & p[]pitreiepitreieye = oneDv
  ieyetuh {
   cTp.oc)
           rcgie.rcsMvEet(p)
            eonzrpoesoevnsps;
        }
     } fle;
      , as)

        iptlmn.dEetitnr"SoneU" fnto (v){
         nuEeetadvnLsee(MPitrp, ucin et
          vrp =etcreton;
           a p  v.urnPit
          i (ppitreiepitreieye==pitreieyetuh
           f p.oneDvc.oneDvcTp = oneDvcTp.oc)
   {
                    rcgie.rcsUEetp)
                     eonzrpoespvn(p;
              }
PERFORMANCE TIPS
Limit the start time
Emphasize responsiveness
Use thumbnails for quick rendering
Retrieve thumbnails when accessing items
Release media and stream resources when they're no
longer needed
Optimize ListView performance
Keep DOM interactions to a minimum
Optimize property access
Use independent animations
Manage layout efficiently
Store state efficiently
Keep your app’s memory usage low when it's suspended
Minimize the amount of resources that your app uses
IN DEPTH
Bytecode caching is a technique in which the system creates
bytecode for each JavaScript file once, rather than re-creating
 the bytecode each time it starts the app (30% improvment in
                         large apps).

 Avoid synchronous API calls. Break proccessing operations
             into series of smaller operations.
IN DEPTH
 Use Windows Runtime thumbnail APIs to cache and show
                    thumbnails.

  Use DOM objects only to store information that directly
    affects how the DOM lays out or draws elements.

Certain types of animations are offloaded from the UI thread
            to GPU-accelerated system thread.
IN DEPTH
 Combine API calls to reduce the number of layout passes.

 Store session data in the sessionState in-memory object.

When your app begins the suspension process, it should free
any large objects that can be easily rebuilt when it resumes.
WAYS TO TEST YOUR APP
  Unit testing
  Integration testing
  UX testing
  Security testing
  Localization testing
  Accessibility testing
  Performance testing
  Device testing
MOCHA
Hilo.SpecificationsspecsqueriesimageQueryBuilder.spec.js

  dsrb(IaeQeyBidr,fnto ( {
   ecie"mg ur ule" ucin )

        vrqeyule,soaeodr
         a urBidr trgFle;

        bfrEc(ucin(oe {
         eoeahfnto dn)
          qeyule =nwHl.mgQeyule(;
           urBidr  e ioIaeurBidr)

        vrweFle =WnosSoaeApiainaacretlclodr
         a hnodr   idw.trg.plctoDt.urn.oaFle.
  gtodrsn(Idxd)
   eFleAyc"nee";
        weFle.hnfnto (odr {
         hnodrte(ucin fle)
           soaeodr=fle;
            trgFle   odr
           dn(;
            oe)
        };
         )
     };
      )
ASYNC TESTS
Hilo.SpecificationsspecsqueriesimageQueryBuilder.spec.js

  dsrb(we eeuigaqeyta seiistenme o iae t la
   ecie"hn xctn  ur ht pcfe h ubr f mgs o o
  d,fnto ( {
   " ucin )
     vrqeyeut
      a urRsl;

        bfrEc(ucin( {
         eoeahfnto )
           qeyeut=qeyule
            urRsl    urBidr
              .on()
               cut1
              .ul(trgFle)
               bidsoaeodr
              .xct(;
               eeue)
        };
         )

        i(sol la teseiidnme o iae" fnto (oe {
         t"hud od h pcfe ubr f mgs, ucin dn)
           qeyeutte(ucin(mgs {
            urRsl.hnfnto iae)
              epc(mgslnt)eul()
               xetiae.egh.qas1;
              dn(;
               oe)
           }.oenl,dn)
            )dn(ul oe;
        };
         )
  };
   )
HANDLING EXCEPTIONS
   Mocha test runner should intercepts this exception and
                 reports it as a test failure.

        But WinJS is intercepting all promises errors.

.done function is never called, test will go into a wait state and
  Mocha will time out (2 seconds), omitting the fail message.
TEST APP STATES



 Debug Location toolbar
OTHER TESTS
Pseudo-localized versions
STRIDE methodology for threat modeling
Performance Analyzer for HTML5 Apps , Performance
Monitor :)
Visual Studio profiler
Windows App Certification Kit
DETAILS
 source - http://bit.ly/win8js

app docs - http://bit.ly/pphilojs

    eu.zharkov@gmail.com
            @2j2e

Weitere ähnliche Inhalte

Was ist angesagt?

The Ring programming language version 1.6 book - Part 61 of 189
The Ring programming language version 1.6 book - Part 61 of 189The Ring programming language version 1.6 book - Part 61 of 189
The Ring programming language version 1.6 book - Part 61 of 189Mahmoud Samir Fayed
 
Img 20150911 0001
Img 20150911 0001Img 20150911 0001
Img 20150911 0001Flenny Wong
 
Real Time Web with Node
Real Time Web with NodeReal Time Web with Node
Real Time Web with NodeTim Caswell
 
Node Powered Mobile
Node Powered MobileNode Powered Mobile
Node Powered MobileTim Caswell
 
17. pengantar teknik pondasi
17. pengantar teknik pondasi17. pengantar teknik pondasi
17. pengantar teknik pondasiKHRISTIAN MAUKO
 

Was ist angesagt? (6)

The Ring programming language version 1.6 book - Part 61 of 189
The Ring programming language version 1.6 book - Part 61 of 189The Ring programming language version 1.6 book - Part 61 of 189
The Ring programming language version 1.6 book - Part 61 of 189
 
Img 20150911 0001
Img 20150911 0001Img 20150911 0001
Img 20150911 0001
 
Real Time Web with Node
Real Time Web with NodeReal Time Web with Node
Real Time Web with Node
 
Node Powered Mobile
Node Powered MobileNode Powered Mobile
Node Powered Mobile
 
17. pengantar teknik pondasi
17. pengantar teknik pondasi17. pengantar teknik pondasi
17. pengantar teknik pondasi
 
EUnit in Practice(Japanese)
EUnit in Practice(Japanese)EUnit in Practice(Japanese)
EUnit in Practice(Japanese)
 

Ähnlich wie Creating windows store java script apps

Asynchronous java script
Asynchronous java scriptAsynchronous java script
Asynchronous java scriptRon Martin
 
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best PracticesJohannes Hoppe
 
How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...
How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...
How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...Ari Lerner
 
Refactoring to symfony components
Refactoring to symfony componentsRefactoring to symfony components
Refactoring to symfony componentsMichael Peacock
 
SecureSocial - Authentication for Play Framework
SecureSocial - Authentication for Play FrameworkSecureSocial - Authentication for Play Framework
SecureSocial - Authentication for Play Frameworkjaliss
 
Architecting Android Apps: Marko Gargenta
Architecting Android Apps: Marko GargentaArchitecting Android Apps: Marko Gargenta
Architecting Android Apps: Marko Gargentajaxconf
 
JavaScript Design Patterns
JavaScript Design PatternsJavaScript Design Patterns
JavaScript Design PatternsDerek Brown
 
Drupal 8 in action, the route to the method
Drupal 8 in action, the route to the methodDrupal 8 in action, the route to the method
Drupal 8 in action, the route to the methodjuanolalla
 
Presenting Seq for Node.js
Presenting Seq for Node.jsPresenting Seq for Node.js
Presenting Seq for Node.jsDouglas Muth
 
PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best PracticesEdorian
 
Automated tests - facts and myths
Automated tests - facts and mythsAutomated tests - facts and myths
Automated tests - facts and mythsWojciech Sznapka
 
One page app with AngularJS
One page app with AngularJSOne page app with AngularJS
One page app with AngularJSAdam Štipák
 
Arquillian - extensions which you have to take with you to a deserted island
Arquillian - extensions which you have to take with you to a deserted islandArquillian - extensions which you have to take with you to a deserted island
Arquillian - extensions which you have to take with you to a deserted islandSoftwareMill
 
참고 코드(Shelllilst filtering)
참고 코드(Shelllilst filtering)참고 코드(Shelllilst filtering)
참고 코드(Shelllilst filtering)문서 사해
 

Ähnlich wie Creating windows store java script apps (20)

Asynchronous java script
Asynchronous java scriptAsynchronous java script
Asynchronous java script
 
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
2013-02-21 - .NET UG Rhein-Neckar: JavaScript Best Practices
 
Javascript: The Important Bits
Javascript: The Important BitsJavascript: The Important Bits
Javascript: The Important Bits
 
JavaScript pitfalls
JavaScript pitfallsJavaScript pitfalls
JavaScript pitfalls
 
How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...
How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...
How to create a 3.2 billion dollar business in 20 minutes: combining AngularJ...
 
Refactoring to symfony components
Refactoring to symfony componentsRefactoring to symfony components
Refactoring to symfony components
 
JavaFX, because you're worth it
JavaFX, because you're worth itJavaFX, because you're worth it
JavaFX, because you're worth it
 
SecureSocial - Authentication for Play Framework
SecureSocial - Authentication for Play FrameworkSecureSocial - Authentication for Play Framework
SecureSocial - Authentication for Play Framework
 
Architecting Android Apps: Marko Gargenta
Architecting Android Apps: Marko GargentaArchitecting Android Apps: Marko Gargenta
Architecting Android Apps: Marko Gargenta
 
JavaScript Design Patterns
JavaScript Design PatternsJavaScript Design Patterns
JavaScript Design Patterns
 
Drupal 8 in action, the route to the method
Drupal 8 in action, the route to the methodDrupal 8 in action, the route to the method
Drupal 8 in action, the route to the method
 
Presenting Seq for Node.js
Presenting Seq for Node.jsPresenting Seq for Node.js
Presenting Seq for Node.js
 
PhpUnit Best Practices
PhpUnit Best PracticesPhpUnit Best Practices
PhpUnit Best Practices
 
Introduction to JavaFX 2
Introduction to JavaFX 2Introduction to JavaFX 2
Introduction to JavaFX 2
 
Starting out with Ember.js
Starting out with Ember.jsStarting out with Ember.js
Starting out with Ember.js
 
Automated tests - facts and myths
Automated tests - facts and mythsAutomated tests - facts and myths
Automated tests - facts and myths
 
One page app with AngularJS
One page app with AngularJSOne page app with AngularJS
One page app with AngularJS
 
Arquillian - extensions which you have to take with you to a deserted island
Arquillian - extensions which you have to take with you to a deserted islandArquillian - extensions which you have to take with you to a deserted island
Arquillian - extensions which you have to take with you to a deserted island
 
Arquillian Extensions
Arquillian ExtensionsArquillian Extensions
Arquillian Extensions
 
참고 코드(Shelllilst filtering)
참고 코드(Shelllilst filtering)참고 코드(Shelllilst filtering)
참고 코드(Shelllilst filtering)
 

Mehr von Eugene Zharkov

Monorepo: React + React Native. React Alicante
Monorepo:  React + React Native. React Alicante Monorepo:  React + React Native. React Alicante
Monorepo: React + React Native. React Alicante Eugene Zharkov
 
Monorepo: React Web & React Native
Monorepo: React Web & React NativeMonorepo: React Web & React Native
Monorepo: React Web & React NativeEugene Zharkov
 
Create React Native App vs Expo vs Manually
Create React Native App vs Expo vs ManuallyCreate React Native App vs Expo vs Manually
Create React Native App vs Expo vs ManuallyEugene Zharkov
 
Build automation with Fastlane
Build automation with FastlaneBuild automation with Fastlane
Build automation with FastlaneEugene Zharkov
 
React Native Animation
React Native AnimationReact Native Animation
React Native AnimationEugene Zharkov
 
React Native: Hurdle Race
React Native: Hurdle RaceReact Native: Hurdle Race
React Native: Hurdle RaceEugene Zharkov
 
Burn your grass with react native
Burn your grass with react nativeBurn your grass with react native
Burn your grass with react nativeEugene Zharkov
 
Фронтенд сказки
Фронтенд сказкиФронтенд сказки
Фронтенд сказкиEugene Zharkov
 
How to be a good frontend developer
How to be a good frontend developerHow to be a good frontend developer
How to be a good frontend developerEugene Zharkov
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveEugene Zharkov
 
Что там в summary
Что там в summaryЧто там в summary
Что там в summaryEugene Zharkov
 
Switch to React.js from AngularJS developer
Switch to React.js from AngularJS developerSwitch to React.js from AngularJS developer
Switch to React.js from AngularJS developerEugene Zharkov
 
Mobile applications in a new way with React Native
Mobile applications in a new way with React NativeMobile applications in a new way with React Native
Mobile applications in a new way with React NativeEugene Zharkov
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переигралEugene Zharkov
 
Angular 2.0: Brighter future?
Angular 2.0: Brighter future?Angular 2.0: Brighter future?
Angular 2.0: Brighter future?Eugene Zharkov
 
Как объяснить на платьях процесс разработки?
Как объяснить на платьях процесс разработки?Как объяснить на платьях процесс разработки?
Как объяснить на платьях процесс разработки?Eugene Zharkov
 
Angular.JS: Do it right
Angular.JS: Do it rightAngular.JS: Do it right
Angular.JS: Do it rightEugene Zharkov
 

Mehr von Eugene Zharkov (20)

Monorepo: React + React Native. React Alicante
Monorepo:  React + React Native. React Alicante Monorepo:  React + React Native. React Alicante
Monorepo: React + React Native. React Alicante
 
Monorepo: React Web & React Native
Monorepo: React Web & React NativeMonorepo: React Web & React Native
Monorepo: React Web & React Native
 
Create React Native App vs Expo vs Manually
Create React Native App vs Expo vs ManuallyCreate React Native App vs Expo vs Manually
Create React Native App vs Expo vs Manually
 
Build automation with Fastlane
Build automation with FastlaneBuild automation with Fastlane
Build automation with Fastlane
 
GraphQL and/or REST
GraphQL and/or RESTGraphQL and/or REST
GraphQL and/or REST
 
React Native Animation
React Native AnimationReact Native Animation
React Native Animation
 
React Native: Hurdle Race
React Native: Hurdle RaceReact Native: Hurdle Race
React Native: Hurdle Race
 
Burn your grass with react native
Burn your grass with react nativeBurn your grass with react native
Burn your grass with react native
 
Фронтенд сказки
Фронтенд сказкиФронтенд сказки
Фронтенд сказки
 
How to be a good frontend developer
How to be a good frontend developerHow to be a good frontend developer
How to be a good frontend developer
 
Cycle.js: Functional and Reactive
Cycle.js: Functional and ReactiveCycle.js: Functional and Reactive
Cycle.js: Functional and Reactive
 
Что там в summary
Что там в summaryЧто там в summary
Что там в summary
 
Elm: give it a try
Elm: give it a tryElm: give it a try
Elm: give it a try
 
Switch to React.js from AngularJS developer
Switch to React.js from AngularJS developerSwitch to React.js from AngularJS developer
Switch to React.js from AngularJS developer
 
AngularJS: Good parts
AngularJS: Good partsAngularJS: Good parts
AngularJS: Good parts
 
Mobile applications in a new way with React Native
Mobile applications in a new way with React NativeMobile applications in a new way with React Native
Mobile applications in a new way with React Native
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
 
Angular 2.0: Brighter future?
Angular 2.0: Brighter future?Angular 2.0: Brighter future?
Angular 2.0: Brighter future?
 
Как объяснить на платьях процесс разработки?
Как объяснить на платьях процесс разработки?Как объяснить на платьях процесс разработки?
Как объяснить на платьях процесс разработки?
 
Angular.JS: Do it right
Angular.JS: Do it rightAngular.JS: Do it right
Angular.JS: Do it right
 

Kürzlich hochgeladen

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...apidays
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobeapidays
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century educationjfdjdjcjdnsjd
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamUiPathCommunity
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 

Kürzlich hochgeladen (20)

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 

Creating windows store java script apps

  • 1. CREATING WINDOWS STORE JAVASCRIPT APPS revealed by Eugene Zharkov / @2j2e
  • 3. APP FLOW Do not forget about: Form factors App contracts All type of the tiles Toast notifications Touch first Animations
  • 4. ASYNC PATTERNS You should understand how: to compose asynchronous code to use promises to chain and group promises to code promise chains to avoid nesting to wrap non-promise values in a promise to handle errors in a promise
  • 5. PROMISES A promise is an object that represent a value that will be available later. Most API's are wraped to the promises. All based on two methods .then and .done.
  • 6. PROMISES A promise is an object that represent a value that will be available later. HiloHiloimageQueryBuilder.js i (hsstig.idbe { f ti.etnsbnal) / Cet `ioPcue ojcsisedo rtrig`trgFl`ojcs / rae Hl.itr` bet nta f eunn Soaeie bet qeyrms =qeyrms.hnti.cetVeMdl) urPoie urPoiete(hs_raeiwoes; }
  • 7. PROMISE CHAIN vrweIaeFrieeree =qeyule.ul(itrsirr)eeue a hnmgsoTlRtivd urBidrbidpcueLbay.xct( ); weIaeFrieeree hnmgsoTlRtivd .hnHl.ie.raeieredymgs te(ioTlscetTlFinlIae) .hnti.eLclmgPts te(hsgtoaIaeah) .hnHl.ie.raeiepae) te(ioTlscetTlUdts .hnqeeiepae) te(uuTlUdts;
  • 9. BIND FUNCTION Define funtion environment with .bind HiloHiloTilesTileUpdater.js vrqeeiepae =ti.uuTlUdtsbn(hs; a uuTlUdts hsqeeiepae.idti) qeeiepae:fnto (oiiain){ uuTlUdts ucin ntfctos vrsl =ti; a ef hs ntfctosfrahfnto (oiiain { oiiain.oEc(ucin ntfcto) sl.iepae.paentfcto) eftlUdtrudt(oiiain; }; ) },
  • 10. BIND FUNCTION Bind can receive additional parameters. HiloHiloTilescreateTileFriendlyImages.js fnto cetTlFinlIae(ie){ ucin raeieredymgsfls vrlclodr=apiainaacretlclodr a oaFle plctoDt.urn.oaFle; vrcpTubalTFle =cpFlsoodrbn(ul fls; a oyhmnisoodr oyieTFle.idnl, ie) vrweFleCetd=lclodrcetFleAyctubalodr a hnodrrae oaFle.raeodrsn(hmniFle Nm,cetoCliinpinrpaexsig; ae rainolsoOto.elcEitn) rtr weFleCetd eun hnodrrae .hncpTubalTFle) te(oyhmnisoodr; }
  • 11. GROUPING A PROMISE When you have non-sequential, asynchronous operations that must all complete before you can continue a task, you can use the WinJS.Promise.join vrweFlIOe =treFl.pnsn(iecesoeraWie; a hniespn agtieoeAycflAcsMd.edrt) vrweTubiIRay=sucFl.eTubalsn(hmniMd.iget a hnhmalsed oreiegthmniAyctubaloesnlI e) m; vrweEeyhnIRay=WnSPoieji( oee:weFlIOe,ra a hnvrtigsed iJ.rms.on{ pnd hniespn ed y weTubiIRay}; : hnhmalsed )
  • 12. HANDLING ERRORS Use .done at the end of method chain. It doesn't return another promise and throw unhandled expetions.
  • 13. HANDLING ERRORS HiloHilocropcroppedImageWriter.js vrdcdrrms =gtretto a eoePoie eOinain .hnfnto (ereePos { te(ucin rtivdrp) eiOinain=(ereePossz !=0 xfretto rtivdrp.ie = ) ?rtivdrp[Sse.ht.retto" ereePos"ytmPooOinain] :pooretto.oml htOinainnra; } fnto (ro){ , ucin err sic (ro.ubr { wth errnme) cs Hl.mgWie.ICDCERUSPOTDPRTO: ae ioIaertrWNOE_R_NUPREOEAIN cs Hl.mgWie.ICDCERPOETNTUPRE: ae ioIaertrWNOE_R_RPRYOSPOTD eiOinain=pooretto.oml xfretto htOinainnra; bek ra; dfut eal: trwerr ho ro; } }; )
  • 14. MVP The model represents the state and operations of business objects that your app manipulates The view (HTML and CSS) defines the structure, layout, and appearance of what the user sees on the screen. The view manages the controls on the page and forwards user events to a presenter class The presenter contains the logic to respond to events, update the model and, in turn, manipulate the state of the view
  • 15. MVP - VIEW HiloHilohubhub.html <i i=hbiaetmlt"dt-i-oto=WnSBnigTmlt" dv d"u-mg-epae aawncnrl"iJ.idn.epae> <i dt-i-id"tl.akrudmg:ulbcgonUl at nm; dv aawnbn=syebcgonIae r.akrudr; l: ae casae casae cas"hmni" lsNm: lsNm" ls=tubal> <dv /i> <dv /i>
  • 16. MVP - PRESENTER TEST HiloHilo.SpecficationsspecshubListViewPresenter.spec.js dsrb(we sapd,fnto ( { ecie"hn npe" ucin ) vre; a l bfrEc(ucin( { eoeahfnto ) vrapiw={; a pVe } e =nwSesWnotoSu(; l e pc.iCnrltb) e.iCnrladvnLsee =fnto ( {} lwnoto.dEetitnr ucin ) ; vrlsvePeetr=nwHl.u.itiwrsne(l apiw a itiwrsne e ioHbLsVePeetre, pVe) ; lsvePeetrstiwtt(idw.IVeMngmn.plcto itiwrsne.eVeSaeWnosU.iwaaeetApiai niwtt.npe) VeSaesapd; }; ) i(teLsVe sol ueaLsLyu" fnto ( { t"h itiw hud s itaot, ucin ) epc(lwnoto.aotisaco WnSU.itaot.qa( xete.iCnrllyu ntnef iJ.ILsLyu)eult re; u) }; ) }; )
  • 17. PRESENTERS Each presenter is responsible for a specific part of the page (a control) One page-specific presenter (the mediator) coordinates the other presenters (control-specific) and receives forwarded events
  • 18. PRESENTERS HiloHilodetaildetail.js ray fnto (lmn,otos { ed: ucin eeet pin) vrqey=otosqey a ur pin.ur; vrqeyae=qeystig.otAder a urDt ur.etnsmnhnYa; vrpgTte=Hl.aeomte.eMnhrmqeyae +""+Hl a aeil iodtFratrgtotFo(urDt) io .aeomte.eYaFo(urDt) dtFratrgterrmqeyae; ti.idaeil(aeil) hsbnPgTtepgTte; vrhlApaE =dcmn.urSlco(#pbr) a iopBrl ouetqeyeetr"apa"; vrhlApa =nwHl.otosHlApa.iopBrrsne(io a iopBr e ioCnrl.iopBrHlApaPeetrhlA pBrl WnSNvgto,qey; paE, iJ.aiain ur) vrflsrpl=dcmn.urSlco(#imti"; a imtiE ouetqeyeetr"flsrp) vrfiveE =dcmn.urSlco(#lpiw) a lpiwl ouetqeyeetr"five"; vrfivePeetr=nwHl.ealFivePeetrfiveE) a lpiwrsne e ioDti.lpiwrsne(lpiwl; vrflsrprsne =nwHl.ealFlsrprsne(imtiE a imtiPeetr e ioDti.imtiPeetrflsrpl ); vrdtiPeetr=nwHl.ealDtiPeetrflsrprsne a ealrsne e ioDti.ealrsne(imtiPeet r fivePeetr hlApa,WnSNvgto) , lpiwrsne, iopBr iJ.aiain; dtiPeetradvnLsee(pgSlce" fnto (rs { ealrsne.dEetitnr"aeeetd, ucin ag) vrieIdx=ag.ealieIdx a tmne rsdti.tmne; otosieIdx=ieIdx pin.tmne tmne; }; ) dtiPeetr ealrsne
  • 19. SEPARATING RESPONSIBILITIES HiloHilohubhub.html <eto i=iaenv dt-i-oto=WnSU.tloto"dt-i-pi scin d"mg-a" aawncnrl"iJ.IHmCnrl aawnot os"ui 'Hl/otosHlApa/iopBrhm'"<scin n={r: /iocnrl/iopBrhlApa.tl}>/eto> HiloHilocontrolsHiloAppBarhiloAppBar.html <i i=apa"dt-i-oto=WnSU.pBr dt-i-pin={tcy dv d"pbr aawncnrl"iJ.IApa" aawnotos"sik :fle" as}> <utn bto dt-i-oto=WnSU.pBromn" aawncnrl"iJ.IApaCmad dt-i-pin={d'oae,io:rtt' scin 'eeto' aawnotos"i:rtt' cn'oae, eto: slcin, dsbe:tu} iald re" dt-i-id"dsbe:iCrut" aawnbn={iald sorp} dt-i-e={iCnrl {ae:RttApaBto.ae}" aawnrs"wnoto: lbl'oaepBrutnNm'}> <bto> /utn <utn bto dt-i-oto=WnSU.pBromn" aawncnrl"iJ.IApaCmad dt-i-pin={d'rp,io:co' scin 'eeto' ds aawnotos"i:co' cn'rp, eto: slcin, ia be:tu} ld re" dt-i-id"dsbe:iCrut" aawnbn={iald sorp} dt-i-e={iCnrl {ae:CoApaBto.ae}" aawnrs"wnoto: lbl'rppBrutnNm'}> <bto> /utn <dv /i>
  • 20. UPDATING TILES Hilodefault.js i (urnSaekn ==atvto.ciainidluc){ f crettt.id = ciainAtvtoKn.anh i (urnSaepeiuEeuintt !=atvto.plctoEeui f crettt.rvosxctoSae = ciainApiainxct oSaetriae){ ntt.emntd / We teapi satd w wn t udt istl / hn h p s tre, e at o pae t ie / o tesatsre.Sneti AIi ntacsil / n h tr cen ic hs P s o cesbe / isd o Bed w ol ivk i we w aenti / nie f ln, e ny noe t hn e r o n / dsg md. / ein oe i (WnosApiainoe.einoedsgMdEald { f !idw.plctoMdlDsgMd.einoenbe) vrtlUdtr=nwHl.ie.iepae(; a iepae e ioTlsTlUdtr) tlUdtrudt(; iepae.pae) } }
  • 21. UPDATING TILES HiloHiloTilesTileUpdater.js udt:fnto ( { pae ucin ) / Bn tefnto t acnet s ta `hs wl b rsle / id h ucin o otx, o ht ti` il e eovd / we i i ivkdi tepoie / hn t s noe n h rms. vrqeeiepae =ti.uuTlUdtsbn(hs; a uuTlUdts hsqeeiepae.idti) / Bidaqeyt gttenme o iae nee frtetls / ul ur o e h ubr f mgs edd o h ie. vrqeyule =nwHl.mgQeyule(; a urBidr e ioIaeurBidr) qeyule.on(ubrfmgsoeree; urBidrcutnmeOIaeTRtiv) vrweIaeFrieeree =qeyule.ul(itrsirr)ee a hnmgsoTlRtivd urBidrbidpcueLbay.xc ue) t(; weIaeFrieeree hnmgsoTlRtivd .hnHl.ie.raeieredymgs te(ioTlscetTlFinlIae) .hnti.eLclmgPts te(hsgtoaIaeah) .hnHl.ie.raeiepae) te(ioTlscetTlUdts .hnqeeiepae) te(uuTlUdts; }
  • 22. UPDATING TILES The XML for a typical tile notification <ie tl> <iul vsa> <idn tmlt=TlWdIaeolcin> bnig epae"ieiemgCleto" <mg i=1 sc"sapaa//oa/hmnistubmg_.p"> iae d"" r=m-pdt:/lcltubal/hmIae0jg/ <mg i=2 sc"sapaa//oa/hmnistubmg_.p"> iae d"" r=m-pdt:/lcltubal/hmIae1jg/ <mg i=3 sc"sapaa//oa/hmnistubmg_.p"> iae d"" r=m-pdt:/lcltubal/hmIae2jg/ <mg i=4 sc"sapaa//oa/hmnistubmg_.p"> iae d"" r=m-pdt:/lcltubal/hmIae3jg/ <mg i=5 sc"sapaa//oa/hmnistubmg_.p"> iae d"" r=m-pdt:/lcltubal/hmIae4jg/ <bnig /idn> <idn tmlt=TlSurIae> bnig epae"ieqaemg" <mg i=1 sc"sapaa//oa/hmnistubmg_.p"> iae d"" r=m-pdt:/lcltubal/hmIae0jg/ <bnig /idn> <vsa> /iul <tl> /ie
  • 23. PAGE NAVIGATION HiloDefault.html <i i=cnetot dt-i-oto=Hl.aeotoNvgtr dt-i- dv d"otnhs" aawncnrl"ioPgCnrlaiao" aawno pin={oe 'Hl/u/u.tl}> tos"hm: /iohbhbhm'" <dv /i> HiloHilohubhubPresenter.js ieCikd fnto (rs { tmlce: ucin ag) / Gtte`ioPcue ie ta wsbudt teivkdiae / e h Hl.itr` tm ht a on o h noe mg, / adteie idxfo tels ve cnrl / n h tm ne rm h it iw oto. vrpcue=ag.ealie.aa a itr rsdti.tmdt; / Bidteqeyta cnfn ti pcuewti i' mnhgop / ul h ur ht a id hs itr ihn ts ot ru. vrotos=ti.ulQeyoPcuepcue; a pin hsbidurFritr(itr) / Nvgt t tedti ve,seiyn temnhqeyt / aiae o h eal iw pcfig h ot ur o / so,adteidxo teidvda ie ta wsivkd / hw n h ne f h niiul tm ht a noe. ti.a.aiae"Hl/ealdti.tl,otos; hsnvnvgt(/iodti/ealhm" pin) },
  • 24. CREATING PAGES HiloHilohubhub.js Hl.otospgsdfn(hb,{ iocnrl.ae.eie"u" ray fnto (lmn,otos { ed: ucin eeet pin) / Hnl teapbrbto cik frsoigadhdn teap / ade h p a utn lcs o hwn n iig h p br a. vrapaE =dcmn.urSlco(#pbr) a pBrl ouetqeyeetr"apa"; vrhlApa =nwHl.otosHlApa.iopBrrsne( a iopBr e ioCnrl.iopBrHlApaPeetra pBrl WnSNvgto) paE, iJ.aiain; / Hnl slcigadivkn (lcig iae. / ade eetn n noig cikn) mgs vrlsVeE =dcmn.urSlco(#itrsirr"; a itiwl ouetqeyeetr"pcueLbay) ti.itiwrsne =nwHl.u.itiwrsne(itiwl hslsVePeetr e ioHbLsVePeetrlsVeE, WnosU.iwaaeetApiainiw; idw.IVeMngmn.plctoVe) / Codnt teprso tehbpg. / oriae h at f h u ae ti.uVePeetr=nwHl.u.uVePeetr hshbiwrsne e ioHbHbiwrsne( WnSNvgto, iJ.aiain hlApa, iopBr ti.itiwrsne, hslsVePeetr nwHl.mgQeyule( e ioIaeurBidr) ); ti.uVePeetr hshbiwrsne .tr(nwFlespcueLbay satkonodr.itrsirr) .hnfnto ( { te(ucin ) WnSApiainadvnLsee(Hl:otnshne" iJ.plcto.dEetitnr"ioCnetCagd, Hl.aiao.eod; ionvgtrrla)
  • 25. SUPPORTING DIFFERENT LAYOUTS HiloHiloPageControlNavigator.js fnto PgCnrlaiao(lmn,otos { ucin aeotoNvgtreeet pin) / ... / wno.neie=ti.rszdbn(hs; idworsz hs_eie.idti) / ... / }, _eie:fnto (rs { rszd ucin ag) i (hspgCnrl& ti.aeoto.paeaot { f ti.aeoto & hspgCnrludtLyu) ti.aeoto.paeaotcl(hspgCnrl ti.aelmn hspgCnrludtLyu.alti.aeoto, hspgEeet ,apiwvle ti.lsVesae; pVe.au, hs_atiwtt) } ti.lsVesae=apiwvle hs_atiwtt pVe.au; },
  • 26. SUPPORTING DIFFERENT LAYOUTS HiloHilohubhub.js udtLyu:fnto (lmn,veSae lsVeSae { paeaot ucin eeet iwtt, atiwtt) ti.itiwrsne.eVeSaeveSae lsVeSae; hslsVePeetrstiwtt(iwtt, atiwtt) }, HiloHilohublistViewPresenter.js stiwtt:fnto (iwtt){ eVeSae ucin veSae ti.vlyu =ti.eetaotveSae; hsl.aot hsslcLyu(iwtt) }, slcLyu:fnto (iwtt,lsVeSae { eetaot ucin veSae atiwtt) i (atiwtt ==veSae {rtr;} f lsVeSae = iwtt) eun i (iwtt ==apiwtt.npe){ f veSae = pVeSaesapd rtr nwWnSU.itaot) eun e iJ.ILsLyu(; } es { le vrlyu =nwWnSU.rdaot) a aot e iJ.IGiLyu(; lyu.ruIf =fnto ( {rtr lsVeLyuStig;} aotgopno ucin ) eun itiwaotetns ; lyu.aRw =3 aotmxos ; rtr lyu; eun aot } },
  • 27. DATA BINDING Templates for group items and group headers in the normal view. HiloHilomonthmonth.html <i i=mnhtmepae dt-i-oto=WnSBnigTmlt" dv d"otIeTmlt" aawncnrl"iJ.idn.epae> <i dt-i-id"tl.akrudmg:ulbcgonUl casae dv aawnbn=syebcgonIae r.akrudr; lsNm: casae>/i> lsNm"<dv <dv /i> <i i=mnhruHaeTmlt"dt-i-oto=WnSBnigTmlt" dv d"otGopedrepae aawncnrl"iJ.idn.epae> < cas"otLn"he=#>sa dt-i-id"neHM:tte>/p a ls=mnhik rf""<pn aawnbn=inrTL il"<s a>(sa dt-i-id"neTx:cut>/pn)/> n <pn aawnbn=inret on"<sa><a <dv /i> <i i=mnhnpeTmlt"dt-i-oto=WnSBnigTmlt" dv d"otSapdepae aawncnrl"iJ.idn.epae> <pndt-i-id"neHM:tte>/pn (sa dt-i-id"ne sa aawnbn=inrTL il"<sa> <pn aawnbn=in ret cut>/pn) Tx: on"<sa> <i dt-i-id"tl.akrudmg:bcgonUl"cas"hmn dv aawnbn=syebcgonIae akrudr; ls=tuba i"<dv l>/i> <dv /i>
  • 28. DATA SOURCE TYPES WinJS.Binding.List - synchronous data source, in-memory data source (an array), all its data must be available for display StorageDataSource - built-in support for the Windows file system VirtualizedDataSource - custom implementation
  • 29. UX You should provide both pointer and touch experience to your user. The pointer is an old school, touch control requires some skills from developer.
  • 30. OBJECT ROTATION HiloHilorotateTouchProvider.js fnto Tuhrvdrosrco(nuEeet { ucin ocPoieCntutriptlmn) vrrcgie =nwWnosU.nu.etrRcgie(; a eonzr e idw.IIptGsueeonzr) rcgie.etrStig =WnosU.nu.etrStig.aiua eonzrgsueetns idw.IIptGsueetnsmnplt inoae oRtt; iptlmn.dEetitnr"SoneDw" fnto (v){ nuEeetadvnLsee(MPitron, ucin et vrp =etcreton; a p v.urnPit i (ppitreiepitreieye==pitreieyetuh f p.oneDvc.oneDvcTp = oneDvcTp.oc) { rcgie.rcsDwEetp) eonzrpoesonvn(p; } } fle; , as) iptlmn.dEetitnr"SoneMv" fnto (v){ nuEeetadvnLsee(MPitroe, ucin et vrps=etitreitPit; a p v.nemdaeons i (p[]& ps0.oneDvc.oneDvcTp ==pitre f ps0 & p[]pitreiepitreieye = oneDv ieyetuh { cTp.oc) rcgie.rcsMvEet(p) eonzrpoesoevnsps; } } fle; , as) iptlmn.dEetitnr"SoneU" fnto (v){ nuEeetadvnLsee(MPitrp, ucin et vrp =etcreton; a p v.urnPit i (ppitreiepitreieye==pitreieyetuh f p.oneDvc.oneDvcTp = oneDvcTp.oc) { rcgie.rcsUEetp) eonzrpoespvn(p; }
  • 31. PERFORMANCE TIPS Limit the start time Emphasize responsiveness Use thumbnails for quick rendering Retrieve thumbnails when accessing items Release media and stream resources when they're no longer needed Optimize ListView performance Keep DOM interactions to a minimum Optimize property access Use independent animations Manage layout efficiently Store state efficiently Keep your app’s memory usage low when it's suspended Minimize the amount of resources that your app uses
  • 32. IN DEPTH Bytecode caching is a technique in which the system creates bytecode for each JavaScript file once, rather than re-creating the bytecode each time it starts the app (30% improvment in large apps). Avoid synchronous API calls. Break proccessing operations into series of smaller operations.
  • 33. IN DEPTH Use Windows Runtime thumbnail APIs to cache and show thumbnails. Use DOM objects only to store information that directly affects how the DOM lays out or draws elements. Certain types of animations are offloaded from the UI thread to GPU-accelerated system thread.
  • 34. IN DEPTH Combine API calls to reduce the number of layout passes. Store session data in the sessionState in-memory object. When your app begins the suspension process, it should free any large objects that can be easily rebuilt when it resumes.
  • 35. WAYS TO TEST YOUR APP Unit testing Integration testing UX testing Security testing Localization testing Accessibility testing Performance testing Device testing
  • 36. MOCHA Hilo.SpecificationsspecsqueriesimageQueryBuilder.spec.js dsrb(IaeQeyBidr,fnto ( { ecie"mg ur ule" ucin ) vrqeyule,soaeodr a urBidr trgFle; bfrEc(ucin(oe { eoeahfnto dn) qeyule =nwHl.mgQeyule(; urBidr e ioIaeurBidr) vrweFle =WnosSoaeApiainaacretlclodr a hnodr idw.trg.plctoDt.urn.oaFle. gtodrsn(Idxd) eFleAyc"nee"; weFle.hnfnto (odr { hnodrte(ucin fle) soaeodr=fle; trgFle odr dn(; oe) }; ) }; )
  • 37. ASYNC TESTS Hilo.SpecificationsspecsqueriesimageQueryBuilder.spec.js dsrb(we eeuigaqeyta seiistenme o iae t la ecie"hn xctn ur ht pcfe h ubr f mgs o o d,fnto ( { " ucin ) vrqeyeut a urRsl; bfrEc(ucin( { eoeahfnto ) qeyeut=qeyule urRsl urBidr .on() cut1 .ul(trgFle) bidsoaeodr .xct(; eeue) }; ) i(sol la teseiidnme o iae" fnto (oe { t"hud od h pcfe ubr f mgs, ucin dn) qeyeutte(ucin(mgs { urRsl.hnfnto iae) epc(mgslnt)eul() xetiae.egh.qas1; dn(; oe) }.oenl,dn) )dn(ul oe; }; ) }; )
  • 38. HANDLING EXCEPTIONS Mocha test runner should intercepts this exception and reports it as a test failure. But WinJS is intercepting all promises errors. .done function is never called, test will go into a wait state and Mocha will time out (2 seconds), omitting the fail message.
  • 39. TEST APP STATES Debug Location toolbar
  • 40. OTHER TESTS Pseudo-localized versions STRIDE methodology for threat modeling Performance Analyzer for HTML5 Apps , Performance Monitor :) Visual Studio profiler Windows App Certification Kit
  • 41. DETAILS source - http://bit.ly/win8js app docs - http://bit.ly/pphilojs eu.zharkov@gmail.com @2j2e