33 module . exports = factory ( ) ;
44 else if ( typeof define === 'function' && define . amd )
55 define ( [ ] , factory ) ;
6- else if ( typeof exports === 'object' )
7- exports [ "ngFileSaver" ] = factory ( ) ;
8- else
9- root [ "ngFileSaver" ] = factory ( ) ;
6+ else {
7+ var a = factory ( ) ;
8+ for ( var i in a ) ( typeof exports === 'object' ? exports : root ) [ i ] = a [ i ] ;
9+ }
1010} ) ( this , function ( ) {
1111return /******/ ( function ( modules ) { // webpackBootstrap
1212/******/ // The module cache
@@ -393,7 +393,8 @@ return /******/ (function(modules) { // webpackBootstrap
393393
394394 var __WEBPACK_AMD_DEFINE_ARRAY__ , __WEBPACK_AMD_DEFINE_RESULT__ ; /* FileSaver.js
395395 * A saveAs() FileSaver implementation.
396- * 1.1.20160328
396+ * 1.3.2
397+ * 2016-06-16 18:25:19
397398 *
398399 * By Eli Grey, http://eligrey.com
399400 * License: MIT
@@ -408,7 +409,7 @@ return /******/ (function(modules) { // webpackBootstrap
408409 var saveAs = saveAs || ( function ( view ) {
409410 "use strict" ;
410411 // IE <10 is explicitly unsupported
411- if ( typeof navigator !== "undefined" && / M S I E [ 1 - 9 ] \. / . test ( navigator . userAgent ) ) {
412+ if ( typeof view === "undefined" || typeof navigator !== "undefined" && / M S I E [ 1 - 9 ] \. / . test ( navigator . userAgent ) ) {
412413 return ;
413414 }
414415 var
@@ -423,16 +424,14 @@ return /******/ (function(modules) { // webpackBootstrap
423424 var event = new MouseEvent ( "click" ) ;
424425 node . dispatchEvent ( event ) ;
425426 }
426- , is_safari = / V e r s i o n \/ [ \d \. ] + .* S a f a r i / . test ( navigator . userAgent )
427- , webkit_req_fs = view . webkitRequestFileSystem
428- , req_fs = view . requestFileSystem || webkit_req_fs || view . mozRequestFileSystem
427+ , is_safari = / c o n s t r u c t o r / i. test ( view . HTMLElement )
428+ , is_chrome_ios = / C r i O S \/ [ \d ] + / . test ( navigator . userAgent )
429429 , throw_outside = function ( ex ) {
430430 ( view . setImmediate || view . setTimeout ) ( function ( ) {
431431 throw ex ;
432432 } , 0 ) ;
433433 }
434434 , force_saveable_type = "application/octet-stream"
435- , fs_min_size = 0
436435 // the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
437436 , arbitrary_revoke_timeout = 1000 * 40 // in ms
438437 , revoke = function ( file ) {
@@ -443,22 +442,6 @@ return /******/ (function(modules) { // webpackBootstrap
443442 file . remove ( ) ;
444443 }
445444 } ;
446- /* // Take note W3C:
447- var
448- uri = typeof file === "string" ? file : file.toURL()
449- , revoker = function(evt) {
450- // idealy DownloadFinishedEvent.data would be the URL requested
451- if (evt.data === uri) {
452- if (typeof file === "string") { // file is an object URL
453- get_URL().revokeObjectURL(file);
454- } else { // file is a File
455- file.remove();
456- }
457- }
458- }
459- ;
460- view.addEventListener("downloadfinished", revoker);
461- */
462445 setTimeout ( revoker , arbitrary_revoke_timeout ) ;
463446 }
464447 , dispatch = function ( filesaver , event_types , event ) {
@@ -477,8 +460,9 @@ return /******/ (function(modules) { // webpackBootstrap
477460 }
478461 , auto_bom = function ( blob ) {
479462 // prepend BOM for UTF-8 XML and text/* types (including HTML)
463+ // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
480464 if ( / ^ \s * (?: t e x t \/ \S * | a p p l i c a t i o n \/ x m l | \S * \/ \S * \+ x m l ) \s * ; .* c h a r s e t \s * = \s * u t f - 8 / i. test ( blob . type ) ) {
481- return new Blob ( [ "\ufeff" , blob ] , { type : blob . type } ) ;
465+ return new Blob ( [ String . fromCharCode ( 0xFEFF ) , blob ] , { type : blob . type } ) ;
482466 }
483467 return blob ;
484468 }
@@ -490,20 +474,21 @@ return /******/ (function(modules) { // webpackBootstrap
490474 var
491475 filesaver = this
492476 , type = blob . type
493- , blob_changed = false
477+ , force = type === force_saveable_type
494478 , object_url
495- , target_view
496479 , dispatch_all = function ( ) {
497480 dispatch ( filesaver , "writestart progress write writeend" . split ( " " ) ) ;
498481 }
499482 // on any filesys errors revert to saving with object URLs
500483 , fs_error = function ( ) {
501- if ( target_view && is_safari && typeof FileReader !== "undefined" ) {
484+ if ( ( is_chrome_ios || ( force && is_safari ) ) && view . FileReader ) {
502485 // Safari doesn't allow downloading of blob urls
503486 var reader = new FileReader ( ) ;
504487 reader . onloadend = function ( ) {
505- var base64Data = reader . result ;
506- target_view . location . href = "data:attachment/file" + base64Data . slice ( base64Data . search ( / [ , ; ] / ) ) ;
488+ var url = is_chrome_ios ? reader . result : reader . result . replace ( / ^ d a t a : [ ^ ; ] * ; / , 'data:attachment/file;' ) ;
489+ var popup = view . open ( url , '_blank' ) ;
490+ if ( ! popup ) view . location . href = url ;
491+ url = undefined ; // release reference before dispatching
507492 filesaver . readyState = filesaver . DONE ;
508493 dispatch_all ( ) ;
509494 } ;
@@ -512,36 +497,25 @@ return /******/ (function(modules) { // webpackBootstrap
512497 return ;
513498 }
514499 // don't create more object URLs than needed
515- if ( blob_changed || ! object_url ) {
500+ if ( ! object_url ) {
516501 object_url = get_URL ( ) . createObjectURL ( blob ) ;
517502 }
518- if ( target_view ) {
519- target_view . location . href = object_url ;
503+ if ( force ) {
504+ view . location . href = object_url ;
520505 } else {
521- var new_tab = view . open ( object_url , "_blank" ) ;
522- if ( new_tab === undefined && is_safari ) {
523- //Apple do not allow window.open, see http ://bit.ly/1kZffRI
524- view . location . href = object_url
506+ var opened = view . open ( object_url , "_blank" ) ;
507+ if ( ! opened ) {
508+ // Apple does not allow window.open, see https ://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
509+ view . location . href = object_url ;
525510 }
526511 }
527512 filesaver . readyState = filesaver . DONE ;
528513 dispatch_all ( ) ;
529514 revoke ( object_url ) ;
530515 }
531- , abortable = function ( func ) {
532- return function ( ) {
533- if ( filesaver . readyState !== filesaver . DONE ) {
534- return func . apply ( this , arguments ) ;
535- }
536- } ;
537- }
538- , create_if_not_found = { create : true , exclusive : false }
539- , slice
540516 ;
541517 filesaver . readyState = filesaver . INIT ;
542- if ( ! name ) {
543- name = "download" ;
544- }
518+
545519 if ( can_use_save_link ) {
546520 object_url = get_URL ( ) . createObjectURL ( blob ) ;
547521 setTimeout ( function ( ) {
@@ -554,93 +528,27 @@ return /******/ (function(modules) { // webpackBootstrap
554528 } ) ;
555529 return ;
556530 }
557- // Object and web filesystem URLs have a problem saving in Google Chrome when
558- // viewed in a tab, so I force save with application/octet-stream
559- // http://code.google.com/p/chromium/issues/detail?id=91158
560- // Update: Google errantly closed 91158, I submitted it again:
561- // https://code.google.com/p/chromium/issues/detail?id=389642
562- if ( view . chrome && type && type !== force_saveable_type ) {
563- slice = blob . slice || blob . webkitSlice ;
564- blob = slice . call ( blob , 0 , blob . size , force_saveable_type ) ;
565- blob_changed = true ;
566- }
567- // Since I can't be sure that the guessed media type will trigger a download
568- // in WebKit, I append .download to the filename.
569- // https://bugs.webkit.org/show_bug.cgi?id=65440
570- if ( webkit_req_fs && name !== "download" ) {
571- name += ".download" ;
572- }
573- if ( type === force_saveable_type || webkit_req_fs ) {
574- target_view = view ;
575- }
576- if ( ! req_fs ) {
577- fs_error ( ) ;
578- return ;
579- }
580- fs_min_size += blob . size ;
581- req_fs ( view . TEMPORARY , fs_min_size , abortable ( function ( fs ) {
582- fs . root . getDirectory ( "saved" , create_if_not_found , abortable ( function ( dir ) {
583- var save = function ( ) {
584- dir . getFile ( name , create_if_not_found , abortable ( function ( file ) {
585- file . createWriter ( abortable ( function ( writer ) {
586- writer . onwriteend = function ( event ) {
587- target_view . location . href = file . toURL ( ) ;
588- filesaver . readyState = filesaver . DONE ;
589- dispatch ( filesaver , "writeend" , event ) ;
590- revoke ( file ) ;
591- } ;
592- writer . onerror = function ( ) {
593- var error = writer . error ;
594- if ( error . code !== error . ABORT_ERR ) {
595- fs_error ( ) ;
596- }
597- } ;
598- "writestart progress write abort" . split ( " " ) . forEach ( function ( event ) {
599- writer [ "on" + event ] = filesaver [ "on" + event ] ;
600- } ) ;
601- writer . write ( blob ) ;
602- filesaver . abort = function ( ) {
603- writer . abort ( ) ;
604- filesaver . readyState = filesaver . DONE ;
605- } ;
606- filesaver . readyState = filesaver . WRITING ;
607- } ) , fs_error ) ;
608- } ) , fs_error ) ;
609- } ;
610- dir . getFile ( name , { create : false } , abortable ( function ( file ) {
611- // delete file if it already exists
612- file . remove ( ) ;
613- save ( ) ;
614- } ) , abortable ( function ( ex ) {
615- if ( ex . code === ex . NOT_FOUND_ERR ) {
616- save ( ) ;
617- } else {
618- fs_error ( ) ;
619- }
620- } ) ) ;
621- } ) , fs_error ) ;
622- } ) , fs_error ) ;
531+
532+ fs_error ( ) ;
623533 }
624534 , FS_proto = FileSaver . prototype
625535 , saveAs = function ( blob , name , no_auto_bom ) {
626- return new FileSaver ( blob , name , no_auto_bom ) ;
536+ return new FileSaver ( blob , name || blob . name || "download" , no_auto_bom ) ;
627537 }
628538 ;
629539 // IE 10+ (native saveAs)
630540 if ( typeof navigator !== "undefined" && navigator . msSaveOrOpenBlob ) {
631541 return function ( blob , name , no_auto_bom ) {
542+ name = name || blob . name || "download" ;
543+
632544 if ( ! no_auto_bom ) {
633545 blob = auto_bom ( blob ) ;
634546 }
635- return navigator . msSaveOrOpenBlob ( blob , name || "download" ) ;
547+ return navigator . msSaveOrOpenBlob ( blob , name ) ;
636548 } ;
637549 }
638550
639- FS_proto . abort = function ( ) {
640- var filesaver = this ;
641- filesaver . readyState = filesaver . DONE ;
642- dispatch ( filesaver , "abort" ) ;
643- } ;
551+ FS_proto . abort = function ( ) { } ;
644552 FS_proto . readyState = FS_proto . INIT = 0 ;
645553 FS_proto . WRITING = 1 ;
646554 FS_proto . DONE = 2 ;
0 commit comments