CINXE.COM
File API
<!doctype html><html lang="en"> <head> <meta content="text/html; charset=utf-8" http-equiv="Content-Type"> <meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"> <title>File API</title> <meta content="ED" name="w3c-status"> <meta content="Bikeshed version 742f3d674, updated Mon Nov 4 14:56:54 2024 -0800" name="generator"> <link href="https://www.w3.org/TR/FileAPI/" rel="canonical"> <meta content="77b2086a2ffb613dadd5f76c2edd03822b1cd5cb" name="revision"> <meta content="dark light" name="color-scheme"> <style>/* Boilerplate: style-autolinks */ .css.css, .property.property, .descriptor.descriptor { color: var(--a-normal-text); font-size: inherit; font-family: inherit; } .css::before, .property::before, .descriptor::before { content: "‘"; } .css::after, .property::after, .descriptor::after { content: "’"; } .property, .descriptor { /* Don't wrap property and descriptor names */ white-space: nowrap; } .type { /* CSS value <type> */ font-style: italic; } pre .property::before, pre .property::after { content: ""; } [data-link-type="property"]::before, [data-link-type="propdesc"]::before, [data-link-type="descriptor"]::before, [data-link-type="value"]::before, [data-link-type="function"]::before, [data-link-type="at-rule"]::before, [data-link-type="selector"]::before, [data-link-type="maybe"]::before { content: "‘"; } [data-link-type="property"]::after, [data-link-type="propdesc"]::after, [data-link-type="descriptor"]::after, [data-link-type="value"]::after, [data-link-type="function"]::after, [data-link-type="at-rule"]::after, [data-link-type="selector"]::after, [data-link-type="maybe"]::after { content: "’"; } [data-link-type].production::before, [data-link-type].production::after, .prod [data-link-type]::before, .prod [data-link-type]::after { content: ""; } [data-link-type=element], [data-link-type=element-attr] { font-family: Menlo, Consolas, "DejaVu Sans Mono", monospace; font-size: .9em; } [data-link-type=element]::before { content: "<" } [data-link-type=element]::after { content: ">" } [data-link-type=biblio] { white-space: pre; } @media (prefers-color-scheme: dark) { :root { --selflink-text: black; --selflink-bg: silver; --selflink-hover-text: white; } } </style> <style>/* Boilerplate: style-colors */ /* Any --*-text not paired with a --*-bg is assumed to have a transparent bg */ :root { color-scheme: light dark; --text: black; --bg: white; --unofficial-watermark: url(https://www.w3.org/StyleSheets/TR/2016/logos/UD-watermark); --logo-bg: #1a5e9a; --logo-active-bg: #c00; --logo-text: white; --tocnav-normal-text: #707070; --tocnav-normal-bg: var(--bg); --tocnav-hover-text: var(--tocnav-normal-text); --tocnav-hover-bg: #f8f8f8; --tocnav-active-text: #c00; --tocnav-active-bg: var(--tocnav-normal-bg); --tocsidebar-text: var(--text); --tocsidebar-bg: #f7f8f9; --tocsidebar-shadow: rgba(0,0,0,.1); --tocsidebar-heading-text: hsla(203,20%,40%,.7); --toclink-text: var(--text); --toclink-underline: #3980b5; --toclink-visited-text: var(--toclink-text); --toclink-visited-underline: #054572; --heading-text: #005a9c; --hr-text: var(--text); --algo-border: #def; --del-text: red; --del-bg: transparent; --ins-text: #080; --ins-bg: transparent; --a-normal-text: #034575; --a-normal-underline: #bbb; --a-visited-text: var(--a-normal-text); --a-visited-underline: #707070; --a-hover-bg: rgba(75%, 75%, 75%, .25); --a-active-text: #c00; --a-active-underline: #c00; --blockquote-border: silver; --blockquote-bg: transparent; --blockquote-text: currentcolor; --issue-border: #e05252; --issue-bg: #fbe9e9; --issue-text: var(--text); --issueheading-text: #831616; --example-border: #e0cb52; --example-bg: #fcfaee; --example-text: var(--text); --exampleheading-text: #574b0f; --note-border: #52e052; --note-bg: #e9fbe9; --note-text: var(--text); --noteheading-text: hsl(120, 70%, 30%); --notesummary-underline: silver; --assertion-border: #aaa; --assertion-bg: #eee; --assertion-text: black; --advisement-border: orange; --advisement-bg: #fec; --advisement-text: var(--text); --advisementheading-text: #b35f00; --warning-border: red; --warning-bg: hsla(40,100%,50%,0.95); --warning-text: var(--text); --amendment-border: #330099; --amendment-bg: #F5F0FF; --amendment-text: var(--text); --amendmentheading-text: #220066; --def-border: #8ccbf2; --def-bg: #def; --def-text: var(--text); --defrow-border: #bbd7e9; --datacell-border: silver; --indexinfo-text: #707070; --indextable-hover-text: black; --indextable-hover-bg: #f7f8f9; --outdatedspec-bg: rgba(0, 0, 0, .5); --outdatedspec-text: black; --outdated-bg: maroon; --outdated-text: white; --outdated-shadow: red; --editedrec-bg: darkorange; } @media (prefers-color-scheme: dark) { :root { --text: #ddd; --bg: black; --unofficial-watermark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='400' height='400'%3E%3Cg fill='%23100808' transform='translate(200 200) rotate(-45) translate(-200 -200)' stroke='%23100808' stroke-width='3'%3E%3Ctext x='50%25' y='220' style='font: bold 70px sans-serif; text-anchor: middle; letter-spacing: 6px;'%3EUNOFFICIAL%3C/text%3E%3Ctext x='50%25' y='305' style='font: bold 70px sans-serif; text-anchor: middle; letter-spacing: 6px;'%3EDRAFT%3C/text%3E%3C/g%3E%3C/svg%3E"); --logo-bg: #1a5e9a; --logo-active-bg: #c00; --logo-text: white; --tocnav-normal-text: #999; --tocnav-normal-bg: var(--bg); --tocnav-hover-text: var(--tocnav-normal-text); --tocnav-hover-bg: #080808; --tocnav-active-text: #f44; --tocnav-active-bg: var(--tocnav-normal-bg); --tocsidebar-text: var(--text); --tocsidebar-bg: #080808; --tocsidebar-shadow: rgba(255,255,255,.1); --tocsidebar-heading-text: hsla(203,20%,40%,.7); --toclink-text: var(--text); --toclink-underline: #6af; --toclink-visited-text: var(--toclink-text); --toclink-visited-underline: #054572; --heading-text: #8af; --hr-text: var(--text); --algo-border: #456; --del-text: #f44; --del-bg: transparent; --ins-text: #4a4; --ins-bg: transparent; --a-normal-text: #6af; --a-normal-underline: #555; --a-visited-text: var(--a-normal-text); --a-visited-underline: var(--a-normal-underline); --a-hover-bg: rgba(25%, 25%, 25%, .2); --a-active-text: #f44; --a-active-underline: var(--a-active-text); --borderedblock-bg: rgba(255, 255, 255, .05); --blockquote-border: silver; --blockquote-bg: var(--borderedblock-bg); --blockquote-text: currentcolor; --issue-border: #e05252; --issue-bg: var(--borderedblock-bg); --issue-text: var(--text); --issueheading-text: hsl(0deg, 70%, 70%); --example-border: hsl(50deg, 90%, 60%); --example-bg: var(--borderedblock-bg); --example-text: var(--text); --exampleheading-text: hsl(50deg, 70%, 70%); --note-border: hsl(120deg, 100%, 35%); --note-bg: var(--borderedblock-bg); --note-text: var(--text); --noteheading-text: hsl(120, 70%, 70%); --notesummary-underline: silver; --assertion-border: #444; --assertion-bg: var(--borderedblock-bg); --assertion-text: var(--text); --advisement-border: orange; --advisement-bg: #222218; --advisement-text: var(--text); --advisementheading-text: #f84; --warning-border: red; --warning-bg: hsla(40,100%,20%,0.95); --warning-text: var(--text); --amendment-border: #330099; --amendment-bg: #080010; --amendment-text: var(--text); --amendmentheading-text: #cc00ff; --def-border: #8ccbf2; --def-bg: #080818; --def-text: var(--text); --defrow-border: #136; --datacell-border: silver; --indexinfo-text: #aaa; --indextable-hover-text: var(--text); --indextable-hover-bg: #181818; --outdatedspec-bg: rgba(255, 255, 255, .5); --outdatedspec-text: black; --outdated-bg: maroon; --outdated-text: white; --outdated-shadow: red; --editedrec-bg: darkorange; } /* In case a transparent-bg image doesn't expect to be on a dark bg, which is quite common in practice... */ img { background: white; } } </style> <style>/* Boilerplate: style-counters */ body { counter-reset: example figure issue; } .issue { counter-increment: issue; } .issue:not(.no-marker)::before { content: "Issue " counter(issue); } .example { counter-increment: example; } .example:not(.no-marker)::before { content: "Example " counter(example); } .invalid.example:not(.no-marker)::before, .illegal.example:not(.no-marker)::before { content: "Invalid Example" counter(example); } figcaption { counter-increment: figure; } figcaption:not(.no-marker)::before { content: "Figure " counter(figure) " "; } </style> <style>/* Boilerplate: style-dfn-panel */ :root { --dfnpanel-bg: #ddd; --dfnpanel-text: var(--text); --dfnpanel-target-bg: #ffc; --dfnpanel-target-outline: orange; } @media (prefers-color-scheme: dark) { :root { --dfnpanel-bg: #222; --dfnpanel-text: var(--text); --dfnpanel-target-bg: #333; --dfnpanel-target-outline: silver; } } .dfn-panel { position: absolute; z-index: 35; width: 20em; width: 300px; height: auto; max-height: 500px; overflow: auto; padding: 0.5em 0.75em; font: small Helvetica Neue, sans-serif, Droid Sans Fallback; background: var(--dfnpanel-bg); color: var(--dfnpanel-text); border: outset 0.2em; white-space: normal; /* in case it's moved into a pre */ } .dfn-panel:not(.on) { display: none; } .dfn-panel * { margin: 0; padding: 0; text-indent: 0; } .dfn-panel > b { display: block; } .dfn-panel a { color: var(--dfnpanel-text); } .dfn-panel a:not(:hover) { text-decoration: none !important; border-bottom: none !important; } .dfn-panel a:focus { outline: 5px auto Highlight; outline: 5px auto -webkit-focus-ring-color; } .dfn-panel > b + b { margin-top: 0.25em; } .dfn-panel ul { padding: 0 0 0 1em; list-style: none; } .dfn-panel li a { max-width: calc(300px - 1.5em - 1em); overflow: hidden; text-overflow: ellipsis; } .dfn-panel.activated { display: inline-block; position: fixed; left: 8px; bottom: 2em; margin: 0 auto; max-width: calc(100vw - 1.5em - .4em - .5em); max-height: 30vh; transition: left 1s ease-out, bottom 1s ease-out; } .dfn-panel .link-item:hover { text-decoration: underline; } .dfn-panel .link-item .copy-icon { opacity: 0; } .dfn-panel .link-item:hover .copy-icon, .dfn-panel .link-item .copy-icon:focus { opacity: 1; } .dfn-panel .copy-icon { display: inline-block; margin-right: 0.5em; width: 0.85em; height: 1em; border-radius: 3px; background-color: #ccc; cursor: pointer; } .dfn-panel .copy-icon .icon { width: 100%; height: 100%; background-color: #fff; display: flex; justify-content: center; align-items: center; position: relative; } .dfn-panel .copy-icon .icon::before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 1px solid black; background-color: #ccc; opacity: 0.25; transform: translate(3px, -3px); } .dfn-panel .copy-icon:active .icon::before { opacity: 1; } .dfn-paneled[role="button"] { cursor: help; } .highlighted { animation: target-fade 3s; } @keyframes target-fade { from { background-color: var(--dfnpanel-target-bg); outline: 5px solid var(--dfnpanel-target-outline); } to { color: var(--a-normal-text); background-color: transparent; outline: transparent; } } </style> <style>/* Boilerplate: style-idl-highlighting */ pre.idl.highlight { background: var(--borderedblock-bg, var(--def-bg)); } </style> <style>/* Boilerplate: style-issues */ a[href].issue-return { float: right; float: inline-end; color: var(--issueheading-text); font-weight: bold; text-decoration: none; } </style> <style>/* Boilerplate: style-md-lists */ /* This is a weird hack for me not yet following the commonmark spec regarding paragraph and lists. */ [data-md] > :first-child { margin-top: 0; } [data-md] > :last-child { margin-bottom: 0; } </style> <style>/* Boilerplate: style-mdn-anno */ :root { --mdn-bg: #EEE; --mdn-shadow: #999; --mdn-nosupport-text: #ccc; --mdn-pass: green; --mdn-fail: red; } @media (prefers-color-scheme: dark) { :root { --mdn-bg: #222; --mdn-shadow: #444; --mdn-nosupport-text: #666; --mdn-pass: #690; --mdn-fail: #d22; } } .mdn-anno { background: var(--mdn-bg, #EEE); border-radius: .25em; box-shadow: 0 0 3px var(--mdn-shadow, #999); color: var(--text, black); font: 1em sans-serif; hyphens: none; max-width: min-content; overflow: hidden; padding: 0.2em; position: absolute; right: 0.3em; top: auto; white-space: nowrap; word-wrap: normal; z-index: 8; } .mdn-anno.unpositioned { display: none; } .mdn-anno.overlapping-main { opacity: .2; transition: opacity .1s; } .mdn-anno[open] { opacity: 1; z-index: 9; min-width: 9em; } .mdn-anno:hover { opacity: 1; outline: var(--text, black) 1px solid; } .mdn-anno > summary { font-weight: normal; text-align: right; cursor: pointer; display: block; } .mdn-anno > summary > .less-than-two-engines-flag { color: var(--mdn-fail); padding-right: 2px; } .mdn-anno > summary > .all-engines-flag { color: var(--mdn-pass); padding-right: 2px; } .mdn-anno > summary > span { color: #fff; background-color: #000; font-weight: normal; font-family: zillaslab, Palatino, "Palatino Linotype", serif; padding: 2px 3px 0px 3px; line-height: 1.3em; vertical-align: top; } .mdn-anno > .feature { margin-top: 20px; } .mdn-anno > .feature:not(:first-of-type) { border-top: 1px solid #999; margin-top: 6px; padding-top: 2px; } .mdn-anno > .feature > .less-than-two-engines-text { color: var(--mdn-fail); } .mdn-anno > .feature > .all-engines-text { color: var(--mdn-pass); } .mdn-anno > .feature > p { font-size: .75em; margin-top: 6px; margin-bottom: 0; } .mdn-anno > .feature > p + p { margin-top: 3px; } .mdn-anno > .feature > .support { display: block; font-size: 0.6em; margin: 0; padding: 0; margin-top: 2px; } .mdn-anno > .feature > .support + div { padding-top: 0.5em; } .mdn-anno > .feature > .support > hr { display: block; border: none; border-top: 1px dotted #999; padding: 3px 0px 0px 0px; margin: 2px 3px 0px 3px; } .mdn-anno > .feature > .support > hr::before { content: ""; } .mdn-anno > .feature > .support > span { padding: 0.2em 0; display: block; display: table; } .mdn-anno > .feature > .support > span.no { color: var(--mdn-nosupport-text); filter: grayscale(100%); } .mdn-anno > .feature > .support > span.no::before { opacity: 0.5; } .mdn-anno > .feature > .support > span:first-of-type { padding-top: 0.5em; } .mdn-anno > .feature > .support > span > span { padding: 0 0.5em; display: table-cell; } .mdn-anno > .feature > .support > span > span:first-child { width: 100%; } .mdn-anno > .feature > .support > span > span:last-child { width: 100%; white-space: pre; padding: 0; } .mdn-anno > .feature > .support > span::before { content: ' '; display: table-cell; min-width: 1.5em; height: 1.5em; background: no-repeat center center; background-size: contain; text-align: right; font-size: 0.75em; font-weight: bold; } .mdn-anno > .feature > .support > .chrome_android::before { background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg); } .mdn-anno > .feature > .support > .firefox_android::before { background-image: url(https://resources.whatwg.org/browser-logos/firefox.png); } .mdn-anno > .feature > .support > .chrome::before { background-image: url(https://resources.whatwg.org/browser-logos/chrome.svg); } .mdn-anno > .feature > .support > .edge_blink::before { background-image: url(https://resources.whatwg.org/browser-logos/edge.svg); } .mdn-anno > .feature > .support > .edge::before { background-image: url(https://resources.whatwg.org/browser-logos/edge_legacy.svg); } .mdn-anno > .feature > .support > .firefox::before { background-image: url(https://resources.whatwg.org/browser-logos/firefox.png); } .mdn-anno > .feature > .support > .ie::before { background-image: url(https://resources.whatwg.org/browser-logos/ie.png); } .mdn-anno > .feature > .support > .safari_ios::before { background-image: url(https://resources.whatwg.org/browser-logos/safari-ios.svg); } .mdn-anno > .feature > .support > .nodejs::before { background-image: url(https://nodejs.org/static/images/favicons/favicon.ico); } .mdn-anno > .feature > .support > .opera_android::before { background-image: url(https://resources.whatwg.org/browser-logos/opera.svg); } .mdn-anno > .feature > .support > .opera::before { background-image: url(https://resources.whatwg.org/browser-logos/opera.svg); } .mdn-anno > .feature > .support > .safari::before { background-image: url(https://resources.whatwg.org/browser-logos/safari.png); } .mdn-anno > .feature > .support > .samsunginternet_android::before { background-image: url(https://resources.whatwg.org/browser-logos/samsung.svg); } .mdn-anno > .feature > .support > .webview_android::before { background-image: url(https://resources.whatwg.org/browser-logos/android-webview.png); } .name-slug-mismatch { color: red; } .caniuse-status:hover { z-index: 9; } /* dt, li, .issue, .note, and .example are "position: relative", so to put annotation at right margin, must move to right of containing block */; .h-entry:not(.status-LS) dt > .mdn-anno, .h-entry:not(.status-LS) li > .mdn-anno, .h-entry:not(.status-LS) .issue > .mdn-anno, .h-entry:not(.status-LS) .note > .mdn-anno, .h-entry:not(.status-LS) .example > .mdn-anno { right: -6.7em; } .h-entry p + .mdn-anno { margin-top: 0; } h2 + .mdn-anno.after { margin: -48px 0 0 0; } h3 + .mdn-anno.after { margin: -46px 0 0 0; } h4 + .mdn-anno.after { margin: -42px 0 0 0; } h5 + .mdn-anno.after { margin: -40px 0 0 0; } h6 + .mdn-anno.after { margin: -40px 0 0 0; } </style> <style>/* Boilerplate: style-ref-hints */ :root { --ref-hint-bg: #ddd; --ref-hint-text: var(--text); } @media (prefers-color-scheme: dark) { :root { --ref-hint-bg: #222; --ref-hint-text: var(--text); } } .ref-hint { display: inline-block; position: absolute; z-index: 35; width: 20em; width: 300px; height: auto; max-height: 500px; overflow: auto; padding: 0.5em 0.5em; font: small Helvetica Neue, sans-serif, Droid Sans Fallback; background: var(--ref-hint-bg); color: var(--ref-hint-text); border: outset 0.2em; white-space: normal; /* in case it's moved into a pre */ } .ref-hint * { margin: 0; padding: 0; text-indent: 0; } .ref-hint ul { padding: 0 0 0 1em; list-style: none; } </style> <style>/* Boilerplate: style-selflinks */ :root { --selflink-text: white; --selflink-bg: gray; --selflink-hover-text: black; } .heading, .issue, .note, .example, li, dt { position: relative; } a.self-link { position: absolute; top: 0; left: calc(-1 * (3.5rem - 26px)); width: calc(3.5rem - 26px); height: 2em; text-align: center; border: none; transition: opacity .2s; opacity: .5; } a.self-link:hover { opacity: 1; } .heading > a.self-link { font-size: 83%; } .example > a.self-link, .note > a.self-link, .issue > a.self-link { /* These blocks are overflow:auto, so positioning outside doesn't work. */ left: auto; right: 0; } li > a.self-link { left: calc(-1 * (3.5rem - 26px) - 2em); } dfn > a.self-link { top: auto; left: auto; opacity: 0; width: 1.5em; height: 1.5em; background: var(--selflink-bg); color: var(--selflink-text); font-style: normal; transition: opacity .2s, background-color .2s, color .2s; } dfn:hover > a.self-link { opacity: 1; } dfn > a.self-link:hover { color: var(--selflink-hover-text); } a.self-link::before { content: "¶"; } .heading > a.self-link::before { content: "§"; } dfn > a.self-link::before { content: "#"; } </style> <style>/* Boilerplate: style-syntax-highlighting */ code.highlight { padding: .1em; border-radius: .3em; } pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; } .highlight:not(.idl) { background: rgba(0, 0, 0, .03); } c-[a] { color: #990055 } /* Keyword.Declaration */ c-[b] { color: #990055 } /* Keyword.Type */ c-[c] { color: #708090 } /* Comment */ c-[d] { color: #708090 } /* Comment.Multiline */ c-[e] { color: #0077aa } /* Name.Attribute */ c-[f] { color: #669900 } /* Name.Tag */ c-[g] { color: #222222 } /* Name.Variable */ c-[k] { color: #990055 } /* Keyword */ c-[l] { color: #000000 } /* Literal */ c-[m] { color: #000000 } /* Literal.Number */ c-[n] { color: #0077aa } /* Name */ c-[o] { color: #999999 } /* Operator */ c-[p] { color: #999999 } /* Punctuation */ c-[s] { color: #a67f59 } /* Literal.String */ c-[t] { color: #a67f59 } /* Literal.String.Single */ c-[u] { color: #a67f59 } /* Literal.String.Double */ c-[cp] { color: #708090 } /* Comment.Preproc */ c-[c1] { color: #708090 } /* Comment.Single */ c-[cs] { color: #708090 } /* Comment.Special */ c-[kc] { color: #990055 } /* Keyword.Constant */ c-[kn] { color: #990055 } /* Keyword.Namespace */ c-[kp] { color: #990055 } /* Keyword.Pseudo */ c-[kr] { color: #990055 } /* Keyword.Reserved */ c-[ld] { color: #000000 } /* Literal.Date */ c-[nc] { color: #0077aa } /* Name.Class */ c-[no] { color: #0077aa } /* Name.Constant */ c-[nd] { color: #0077aa } /* Name.Decorator */ c-[ni] { color: #0077aa } /* Name.Entity */ c-[ne] { color: #0077aa } /* Name.Exception */ c-[nf] { color: #0077aa } /* Name.Function */ c-[nl] { color: #0077aa } /* Name.Label */ c-[nn] { color: #0077aa } /* Name.Namespace */ c-[py] { color: #0077aa } /* Name.Property */ c-[ow] { color: #999999 } /* Operator.Word */ c-[mb] { color: #000000 } /* Literal.Number.Bin */ c-[mf] { color: #000000 } /* Literal.Number.Float */ c-[mh] { color: #000000 } /* Literal.Number.Hex */ c-[mi] { color: #000000 } /* Literal.Number.Integer */ c-[mo] { color: #000000 } /* Literal.Number.Oct */ c-[sb] { color: #a67f59 } /* Literal.String.Backtick */ c-[sc] { color: #a67f59 } /* Literal.String.Char */ c-[sd] { color: #a67f59 } /* Literal.String.Doc */ c-[se] { color: #a67f59 } /* Literal.String.Escape */ c-[sh] { color: #a67f59 } /* Literal.String.Heredoc */ c-[si] { color: #a67f59 } /* Literal.String.Interpol */ c-[sx] { color: #a67f59 } /* Literal.String.Other */ c-[sr] { color: #a67f59 } /* Literal.String.Regex */ c-[ss] { color: #a67f59 } /* Literal.String.Symbol */ c-[vc] { color: #0077aa } /* Name.Variable.Class */ c-[vg] { color: #0077aa } /* Name.Variable.Global */ c-[vi] { color: #0077aa } /* Name.Variable.Instance */ c-[il] { color: #000000 } /* Literal.Number.Integer.Long */ @media (prefers-color-scheme: dark) { .highlight:not(.idl) { background: rgba(255, 255, 255, .05); } c-[a] { color: #d33682 } /* Keyword.Declaration */ c-[b] { color: #d33682 } /* Keyword.Type */ c-[c] { color: #2aa198 } /* Comment */ c-[d] { color: #2aa198 } /* Comment.Multiline */ c-[e] { color: #268bd2 } /* Name.Attribute */ c-[f] { color: #b58900 } /* Name.Tag */ c-[g] { color: #cb4b16 } /* Name.Variable */ c-[k] { color: #d33682 } /* Keyword */ c-[l] { color: #657b83 } /* Literal */ c-[m] { color: #657b83 } /* Literal.Number */ c-[n] { color: #268bd2 } /* Name */ c-[o] { color: #657b83 } /* Operator */ c-[p] { color: #657b83 } /* Punctuation */ c-[s] { color: #6c71c4 } /* Literal.String */ c-[t] { color: #6c71c4 } /* Literal.String.Single */ c-[u] { color: #6c71c4 } /* Literal.String.Double */ c-[ch] { color: #2aa198 } /* Comment.Hashbang */ c-[cp] { color: #2aa198 } /* Comment.Preproc */ c-[cpf] { color: #2aa198 } /* Comment.PreprocFile */ c-[c1] { color: #2aa198 } /* Comment.Single */ c-[cs] { color: #2aa198 } /* Comment.Special */ c-[kc] { color: #d33682 } /* Keyword.Constant */ c-[kn] { color: #d33682 } /* Keyword.Namespace */ c-[kp] { color: #d33682 } /* Keyword.Pseudo */ c-[kr] { color: #d33682 } /* Keyword.Reserved */ c-[ld] { color: #657b83 } /* Literal.Date */ c-[nc] { color: #268bd2 } /* Name.Class */ c-[no] { color: #268bd2 } /* Name.Constant */ c-[nd] { color: #268bd2 } /* Name.Decorator */ c-[ni] { color: #268bd2 } /* Name.Entity */ c-[ne] { color: #268bd2 } /* Name.Exception */ c-[nf] { color: #268bd2 } /* Name.Function */ c-[nl] { color: #268bd2 } /* Name.Label */ c-[nn] { color: #268bd2 } /* Name.Namespace */ c-[py] { color: #268bd2 } /* Name.Property */ c-[ow] { color: #657b83 } /* Operator.Word */ c-[mb] { color: #657b83 } /* Literal.Number.Bin */ c-[mf] { color: #657b83 } /* Literal.Number.Float */ c-[mh] { color: #657b83 } /* Literal.Number.Hex */ c-[mi] { color: #657b83 } /* Literal.Number.Integer */ c-[mo] { color: #657b83 } /* Literal.Number.Oct */ c-[sa] { color: #6c71c4 } /* Literal.String.Affix */ c-[sb] { color: #6c71c4 } /* Literal.String.Backtick */ c-[sc] { color: #6c71c4 } /* Literal.String.Char */ c-[dl] { color: #6c71c4 } /* Literal.String.Delimiter */ c-[sd] { color: #6c71c4 } /* Literal.String.Doc */ c-[se] { color: #6c71c4 } /* Literal.String.Escape */ c-[sh] { color: #6c71c4 } /* Literal.String.Heredoc */ c-[si] { color: #6c71c4 } /* Literal.String.Interpol */ c-[sx] { color: #6c71c4 } /* Literal.String.Other */ c-[sr] { color: #6c71c4 } /* Literal.String.Regex */ c-[ss] { color: #6c71c4 } /* Literal.String.Symbol */ c-[fm] { color: #268bd2 } /* Name.Function.Magic */ c-[vc] { color: #cb4b16 } /* Name.Variable.Class */ c-[vg] { color: #cb4b16 } /* Name.Variable.Global */ c-[vi] { color: #cb4b16 } /* Name.Variable.Instance */ c-[vm] { color: #cb4b16 } /* Name.Variable.Magic */ c-[il] { color: #657b83 } /* Literal.Number.Integer.Long */ } </style> <style>/* Boilerplate: style-var-click-highlighting */ /* Colors were chosen in Lab using https://nixsensor.com/free-color-converter/ D50 2deg illuminant, L in [0,100], a and b in [-128, 128] 0 = lab(85,0,85) 1 = lab(85,80,30) 2 = lab(85,-40,40) 3 = lab(85,-50,0) 4 = lab(85,5,15) 5 = lab(85,-10,-50) 6 = lab(85,35,-15) For darkmode: 0 = oklab(50% 0% 108%) 1 = oklab(50% -51% 51%) 2 = oklab(50% -64% -20%) 3 = oklab(50% 6% 19%) 4 = oklab(50% -12% -64%) 5 = oklab(50% 44% -19%) 6 = oklab(50% 102% 38%) */ [data-algorithm] var { cursor: pointer; } var[data-var-color] { background-color: var(--var-bg); box-shadow: 0 0 0 2px var(--var-bg); } var[data-var-color] { --var-bg: #F4D200; } var[data-var-color="1"] { --var-bg: #FF87A2; } var[data-var-color="2"] { --var-bg: #96E885; } var[data-var-color="3"] { --var-bg: #3EEED2; } var[data-var-color="4"] { --var-bg: #EACFB6; } var[data-var-color="5"] { --var-bg: #82DDFF; } var[data-var-color="6"] { --var-vg: #FFBCF2; } @media (prefers-color-scheme: dark) { var[data-var-color] { --var-bg: #bc1a00; } var[data-var-color="1"] { --var-bg: #007f00; } var[data-var-color="2"] { --var-bg: #008698; } var[data-var-color="3"] { --var-bg: #7f5b2b; } var[data-var-color="4"] { --var-bg: #004df3; } var[data-var-color="5"] { --var-bg: #a1248a; } var[data-var-color="6"] { --var-vg: #ff0000; } } </style> <link href="https://www.w3.org/StyleSheets/TR/2021/W3C-ED" rel="stylesheet"> <link href="https://www.w3.org/StyleSheets/TR/2021/dark.css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css"> <body class="h-entry"> <div class="head"> <p data-fill-with="logo"><a class="logo" href="https://www.w3.org/"> <img alt="W3C" height="48" src="https://www.w3.org/StyleSheets/TR/2021/logos/W3C" width="72"> </a> </p> <h1 class="p-name no-ref" id="title">File API</h1> <p id="w3c-state"><a href="https://www.w3.org/standards/types/#ED">Editor’s Draft</a>, <time class="dt-updated" datetime="2024-12-04">4 December 2024</time></p> <details open> <summary>More details about this document</summary> <div data-fill-with="spec-metadata"> <dl> <dt>This version: <dd><a class="u-url" href="https://w3c.github.io/FileAPI/">https://w3c.github.io/FileAPI/</a> <dt>Latest published version: <dd><a href="https://www.w3.org/TR/FileAPI/">https://www.w3.org/TR/FileAPI/</a> <dt>Feedback: <dd><a href="https://github.com/w3c/FileAPI/issues/">GitHub</a> <dd><a href="#issues-index">Inline In Spec</a> <dt class="editor">Editor: <dd class="editor p-author h-card vcard" data-editor-id="72440"><a class="p-name fn u-email email" href="mailto:mek@chromium.org">Marijn Kruisselbrink</a> (<span class="p-org org">Google</span>) <dt class="editor">Former Editor: <dd class="editor p-author h-card vcard" data-editor-id="37240"><a class="p-name fn u-url url" href="http://arunranga.com/">Arun Ranganathan</a> (<span class="p-org org">Mozilla Corporation</span>) <a class="u-email email" href="mailto:arun@mozilla.com">arun@mozilla.com</a> <dt>Tests: <dd><a href="https://github.com/web-platform-tests/wpt/tree/master/FileAPI">web-platform-tests FileAPI/</a> (<a href="https://github.com/web-platform-tests/wpt/labels/FileAPI">ongoing work</a>) </dl> </div> </details> <div data-fill-with="warning"></div> <p class="copyright" data-fill-with="copyright"><a href="https://www.w3.org/policies/#copyright">Copyright</a> © 2024 <a href="https://www.w3.org/">World Wide Web Consortium</a>. <abbr title="World Wide Web Consortium">W3C</abbr><sup>®</sup> <a href="https://www.w3.org/policies/#Legal_Disclaimer">liability</a>, <a href="https://www.w3.org/policies/#W3C_Trademarks">trademark</a> and <a href="https://www.w3.org/copyright/software-license/" rel="license" title="W3C Software and Document License">permissive document license</a> rules apply. </p> <hr title="Separator for header"> </div> <div class="p-summary" data-fill-with="abstract"> <h2 class="no-num no-toc no-ref heading settled" id="abstract"><span class="content">Abstract</span></h2> <p>This specification provides an API for representing file objects in web applications, as well as programmatically selecting them and accessing their data. This includes:</p> <ul> <li data-md> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist">FileList</a></code> interface, which represents an array of individually selected files from the underlying system. The user interface for selection can be invoked via <code><input type="file"></code>, i.e. when the input element is in the <code>File Upload</code> state <a data-link-type="biblio" href="#biblio-html" title="HTML Standard">[HTML]</a>.</p> <li data-md> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob">Blob</a></code> interface, which represents immutable raw binary data, and allows access to ranges of bytes within the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①">Blob</a></code> object as a separate <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②">Blob</a></code>.</p> <li data-md> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file">File</a></code> interface, which includes readonly informational attributes about a file such as its name and the date of the last modification (on disk) of the file.</p> <li data-md> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader">FileReader</a></code> interface, which provides methods to read a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①">File</a></code> or a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③">Blob</a></code>, and an event model to obtain the results of these reads.</p> <li data-md> <p>A <a href="#url">URL scheme</a> for use with binary data such as files, so that they can be referenced within web applications.</p> </ul> <p>Additionally, this specification defines objects to be used within threaded web applications for the synchronous reading of files.</p> <p><a href="#requirements">§ 10 Requirements and Use Cases</a> covers the motivation behind this specification.</p> <p>This API is designed to be used in conjunction with other APIs and elements on the web platform, notably: <code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#xmlhttprequest" id="ref-for-xmlhttprequest">XMLHttpRequest</a></code> (e.g. with an overloaded <code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send" id="ref-for-dom-xmlhttprequest-send">send()</a></code> method for <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob④">Blob</a></code> arguments), <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/workers.html#dom-worker-postmessage-options" id="ref-for-dom-worker-postmessage-options">postMessage()</a></code>, <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/dnd.html#datatransfer" id="ref-for-datatransfer">DataTransfer</a></code> (part of the drag and drop API defined in <a data-link-type="biblio" href="#biblio-html" title="HTML Standard">[HTML]</a>) and Web Workers. Additionally, it should be possible to programmatically obtain a list of files from the <code><a data-link-type="element" href="https://html.spec.whatwg.org/multipage/input.html#the-input-element" id="ref-for-the-input-element">input</a></code> element when it is in the <code>File Upload</code> state <a data-link-type="biblio" href="#biblio-html" title="HTML Standard">[HTML]</a>. These kinds of behaviors are defined in the appropriate affiliated specifications.</p> </div> <h2 class="no-num no-toc no-ref heading settled" id="sotd"><span class="content">Status of this document</span></h2> <div data-fill-with="status"> <p> <em>This section describes the status of this document at the time of its publication. A list of current <abbr title="World Wide Web Consortium">W3C</abbr> publications and the latest revision of this technical report can be found in the <a href="https://www.w3.org/TR/"><abbr title="World Wide Web Consortium">W3C</abbr> technical reports index</a> at https://www.w3.org/TR/.</em> </p> <p> This document was published by the <a href="https://www.w3.org/groups/wg/webapps">Web Applications Working Group</a> as an Editors Draft. This document is intended to become a W3C Recommendation. </p> <p></p> <p>Previous discussion of this specification has taken place on two other mailing lists: <a href="mailto:public-webapps@w3.org">public-webapps@w3.org</a> (<a href="https://lists.w3.org/Archives/Public/public-webapps/">archive</a>) and <a href="mailto:public-webapi@w3.org">public-webapi@w3.org</a> (<a href="https://lists.w3.org/Archives/Public/public-webapi/">archive</a>). Ongoing discussion will be on the <a href="mailto:public-webapps@w3.org">public-webapps@w3.org</a> mailing list.</p> <p>This draft consists of changes made to the previous Last Call Working Draft. Please send comments to the <a href="mailto:public-webapi@w3.org">public-webapi@w3.org</a> as described above. You can see Last Call Feedback on the W3C Wiki: <a href="https://www.w3.org/wiki/Webapps/LCWD-FileAPI-20130912">https://www.w3.org/wiki/Webapps/LCWD-FileAPI-20130912</a></p> <p>An <a href="https://wpt.fyi/results/FileAPI">implementation report</a> is automatically generated from the test suite.</p> <p></p> <p> This document was published by the <a href="https://www.w3.org/groups/wg/webapps">Web Applications Working Group</a> as a Working Draft. Feedback and comments on this specification are welcome. Please use <a href="https://github.com/w3c/FileAPI/issues">GitHub issues</a> Historical discussions can be found in the <a href="https://lists.w3.org/Archives/Public/public-webapps/">public-webapps@w3.org archives</a>. </p> <p> Publication as an Editors Draft does not imply endorsement by <abbr title="World Wide Web Consortium">W3C</abbr> and its Members. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress. </p> <p> This document was produced by a group operating under the <a href="https://www.w3.org/policies/patent-policy/20200915/"><abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>. <abbr title="World Wide Web Consortium">W3C</abbr> maintains a <a href="https://www.w3.org/2004/01/pp-impl/114929/status" rel="disclosure">public list of any patent disclosures</a> made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains <a href="https://www.w3.org/policies/patent-policy/20200915/#def-essential">Essential Claim(s)</a> must disclose the information in accordance with <a href="https://www.w3.org/policies/patent-policy/20200915/#sec-Disclosure">section 6 of the <abbr title="World Wide Web Consortium">W3C</abbr> Patent Policy</a>. </p> <p>This document is governed by the <a href="https://www.w3.org/policies/process/20231103/" id="w3c_process_revision">03 November 2023 W3C Process Document</a>. </p> </div> <div data-fill-with="at-risk"></div> <nav data-fill-with="table-of-contents" id="toc"> <h2 class="no-num no-toc no-ref" id="contents">Table of Contents</h2> <ol class="toc" role="directory"> <li><a href="#intro"><span class="secno">1</span> <span class="content">Introduction</span></a> <li><a href="#terminology"><span class="secno">2</span> <span class="content">Terminology and Algorithms</span></a> <li> <a href="#blob-section"><span class="secno">3</span> <span class="content">The Blob Interface and Binary Data</span></a> <ol class="toc"> <li> <a href="#constructorBlob"><span class="secno">3.1</span> <span class="content">Constructors</span></a> <ol class="toc"> <li><a href="#constructorParams"><span class="secno">3.1.1</span> <span class="content">Constructor Parameters</span></a> </ol> <li><a href="#attributes-blob"><span class="secno">3.2</span> <span class="content">Attributes</span></a> <li> <a href="#methodsandparams-blob"><span class="secno">3.3</span> <span class="content">Methods and Parameters</span></a> <ol class="toc"> <li><a href="#slice-method-algo"><span class="secno">3.3.1</span> <span class="content">The <code class="idl"><span>slice()</span></code> method</span></a> <li><a href="#stream-method-algo"><span class="secno">3.3.2</span> <span class="content">The <code class="idl"><span>stream()</span></code> method</span></a> <li><a href="#text-method-algo"><span class="secno">3.3.3</span> <span class="content">The <code class="idl"><span>text()</span></code> method</span></a> <li><a href="#arraybuffer-method-algo"><span class="secno">3.3.4</span> <span class="content">The <code class="idl"><span>arrayBuffer()</span></code> method</span></a> <li><a href="#bytes-method-algo"><span class="secno">3.3.5</span> <span class="content">The <code class="idl"><span>bytes()</span></code> method</span></a> </ol> </ol> <li> <a href="#file-section"><span class="secno">4</span> <span class="content">The File Interface</span></a> <ol class="toc"> <li> <a href="#file-constructor"><span class="secno">4.1</span> <span class="content">Constructor</span></a> <ol class="toc"> <li><a href="#file-constructor-params"><span class="secno">4.1.1</span> <span class="content">Constructor Parameters</span></a> </ol> <li><a href="#file-attrs"><span class="secno">4.2</span> <span class="content">Attributes</span></a> </ol> <li> <a href="#filelist-section"><span class="secno">5</span> <span class="content">The FileList Interface</span></a> <ol class="toc"> <li><a href="#attributes-filelist"><span class="secno">5.1</span> <span class="content">Attributes</span></a> <li><a href="#filelist-methods-params"><span class="secno">5.2</span> <span class="content">Methods and Parameters</span></a> </ol> <li> <a href="#reading-data-section"><span class="secno">6</span> <span class="content">Reading Data</span></a> <ol class="toc"> <li><a href="#blobreader-task-source"><span class="secno">6.1</span> <span class="content">The File Reading Task Source</span></a> <li> <a href="#APIASynch"><span class="secno">6.2</span> <span class="content">The <code class="idl"><span>FileReader</span></code> API</span></a> <ol class="toc"> <li><a href="#event-handler-attributes-section"><span class="secno">6.2.1</span> <span class="content">Event Handler Content Attributes</span></a> <li><a href="#blobreader-state"><span class="secno">6.2.2</span> <span class="content">FileReader States</span></a> <li> <a href="#reading-a-file"><span class="secno">6.2.3</span> <span class="content">Reading a File or Blob</span></a> <ol class="toc"> <li><a href="#readAsDataURL"><span class="secno">6.2.3.1</span> <span class="content">The <code class="idl"><span>readAsDataURL()</span></code> method</span></a> <li><a href="#readAsDataText"><span class="secno">6.2.3.2</span> <span class="content">The <code class="idl"><span>readAsText()</span></code> method</span></a> <li><a href="#readAsArrayBuffer"><span class="secno">6.2.3.3</span> <span class="content">The <code class="idl"><span>readAsArrayBuffer()</span></code></span></a> <li><a href="#readAsBinaryString"><span class="secno">6.2.3.4</span> <span class="content">The <code class="idl"><span>readAsBinaryString()</span></code> method</span></a> <li><a href="#abort"><span class="secno">6.2.3.5</span> <span class="content">The <code class="idl"><span>abort()</span></code> method</span></a> </ol> </ol> <li><a href="#packaging-data"><span class="secno">6.3</span> <span class="content">Packaging data</span></a> <li> <a href="#events"><span class="secno">6.4</span> <span class="content">Events</span></a> <ol class="toc"> <li><a href="#event-summary"><span class="secno">6.4.1</span> <span class="content">Event Summary</span></a> <li><a href="#eventInvariants"><span class="secno">6.4.2</span> <span class="content">Summary of Event Invariants</span></a> </ol> <li> <a href="#readingOnThreads"><span class="secno">6.5</span> <span class="content">Reading on Threads</span></a> <ol class="toc"> <li> <a href="#FileReaderSync"><span class="secno">6.5.1</span> <span class="content">The <code class="idl"><span>FileReaderSync</span></code> API</span></a> <ol class="toc"> <li><a href="#filereadersyncConstrctr"><span class="secno">6.5.1.1</span> <span class="content">Constructors</span></a> <li><a href="#readAsTextSync"><span class="secno">6.5.1.2</span> <span class="content">The <code class="idl"><span>readAsText()</span></code></span></a> <li><a href="#readAsDataURLSync-section"><span class="secno">6.5.1.3</span> <span class="content">The <code class="idl"><span>readAsDataURL()</span></code> method</span></a> <li><a href="#readAsArrayBufferSyncSection"><span class="secno">6.5.1.4</span> <span class="content">The <code class="idl"><span>readAsArrayBuffer()</span></code> method</span></a> <li><a href="#readAsBinaryStringSyncSection"><span class="secno">6.5.1.5</span> <span class="content">The <code class="idl"><span>readAsBinaryString()</span></code> method</span></a> </ol> </ol> </ol> <li> <a href="#ErrorAndException"><span class="secno">7</span> <span class="content">Errors and Exceptions</span></a> <ol class="toc"> <li><a href="#dfn-error-codes"><span class="secno">7.1</span> <span class="content">Throwing an Exception or Returning an Error</span></a> </ol> <li> <a href="#url"><span class="secno">8</span> <span class="content">A URL for Blob and MediaSource reference</span></a> <ol class="toc"> <li><a href="#url-intro"><span class="secno">8.1</span> <span class="content">Introduction</span></a> <li><a href="#url-model"><span class="secno">8.2</span> <span class="content">Model</span></a> <li> <a href="#requestResponseModel"><span class="secno">8.3</span> <span class="content">Dereferencing Model for blob URLs</span></a> <ol class="toc"> <li><a href="#originOfBlobURL"><span class="secno">8.3.1</span> <span class="content">Origin of blob URLs</span></a> <li><a href="#partitioningOfBlobUrls"><span class="secno">8.3.2</span> <span class="content">Access restrictions on blob URLs</span></a> <li><a href="#lifeTime"><span class="secno">8.3.3</span> <span class="content">Lifetime of blob URLs</span></a> </ol> <li> <a href="#creating-revoking"><span class="secno">8.4</span> <span class="content">Creating and Revoking a blob URL</span></a> <ol class="toc"> <li><a href="#examplesOfCreationRevocation"><span class="secno">8.4.1</span> <span class="content">Examples of blob URL Creation and Revocation</span></a> </ol> </ol> <li><a href="#security-discussion"><span class="secno">9</span> <span class="content">Security and Privacy Considerations</span></a> <li><a href="#requirements"><span class="secno">10</span> <span class="content">Requirements and Use Cases</span></a> <li><a href="#acknowledgements-section"><span class="secno"></span> <span class="content"> Acknowledgements</span></a> <li> <a href="#w3c-conformance"><span class="secno"></span> <span class="content">Conformance</span></a> <ol class="toc"> <li><a href="#w3c-conventions"><span class="secno"></span> <span class="content">Document conventions</span></a> <li><a href="#w3c-conformant-algorithms"><span class="secno"></span> <span class="content">Conformant Algorithms</span></a> </ol> <li> <a href="#index"><span class="secno"></span> <span class="content">Index</span></a> <ol class="toc"> <li><a href="#index-defined-here"><span class="secno"></span> <span class="content">Terms defined by this specification</span></a> <li><a href="#index-defined-elsewhere"><span class="secno"></span> <span class="content">Terms defined by reference</span></a> </ol> <li> <a href="#references"><span class="secno"></span> <span class="content">References</span></a> <ol class="toc"> <li><a href="#normative"><span class="secno"></span> <span class="content">Normative References</span></a> <li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a> </ol> <li><a href="#idl-index"><span class="secno"></span> <span class="content">IDL Index</span></a> <li><a href="#issues-index"><span class="secno"></span> <span class="content">Issues Index</span></a> </ol> </nav> <main> <h2 class="heading settled" data-level="1" id="intro"><span class="secno">1. </span><span class="content">Introduction</span><a class="self-link" href="#intro"></a></h2> <p><em>This section is informative.</em></p> <p>Web applications should have the ability to manipulate as wide as possible a range of user input, including files that a user may wish to upload to a remote server or manipulate inside a rich web application. This specification defines the basic representations for files, lists of files, errors raised by access to files, and programmatic ways to read files. Additionally, this specification also defines an interface that represents "raw data" which can be asynchronously processed on the main thread of conforming user agents. The interfaces and API defined in this specification can be used with other interfaces and APIs exposed to the web platform.</p> <p>The <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③">File</a></code> interface represents file data typically obtained from the underlying file system, and the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤">Blob</a></code> interface ("Binary Large Object" - a name originally introduced to web APIs in <a href="https://developers.google.com/gears/?csw=1">Google Gears</a>) represents immutable raw data. <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file④">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥">Blob</a></code> reads should happen asynchronously on the main thread, with an optional synchronous API used within threaded web applications. An asynchronous API for reading files prevents blocking and UI "freezing" on a user agent’s main thread. This specification defines an asynchronous API based on an <em>event model</em> to read and access a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file⑤">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑦">Blob</a></code>’s data. A <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①">FileReader</a></code> object provides asynchronous read methods to access that file’s data through event handler content attributes and the firing of events. The use of events and event handlers allows separate code blocks the ability to monitor the <em>progress of the read</em> (which is particularly useful for remote drives or mounted drives, where file access performance may vary from local drives) and error conditions that may arise during reading of a file. An example will be illustrative.</p> <div class="example" id="example-db2fd131"> <a class="self-link" href="#example-db2fd131"></a> In the example below, different code blocks handle progress, error, and success conditions. <pre class="highlight"><c- a>function</c-> startRead<c- p>()</c-> <c- p>{</c-> <c- c1>// obtain input element through DOM</c-> <c- a>var</c-> file <c- o>=</c-> document<c- p>.</c->getElementById<c- p>(</c-><c- t>'file'</c-><c- p>).</c->files<c- p>[</c-><c- mf>0</c-><c- p>];</c-> <c- k>if</c-><c- p>(</c->file<c- p>){</c-> getAsText<c- p>(</c->file<c- p>);</c-> <c- p>}</c-> <c- p>}</c-> <c- a>function</c-> getAsText<c- p>(</c->readFile<c- p>)</c-> <c- p>{</c-> <c- a>var</c-> reader <c- o>=</c-> <c- ow>new</c-> FileReader<c- p>();</c-> <c- c1>// Read file into memory as UTF-16</c-> reader<c- p>.</c->readAsText<c- p>(</c->readFile<c- p>,</c-> <c- u>"UTF-16"</c-><c- p>);</c-> <c- c1>// Handle progress, success, and errors</c-> reader<c- p>.</c->onprogress <c- o>=</c-> updateProgress<c- p>;</c-> reader<c- p>.</c->onload <c- o>=</c-> loaded<c- p>;</c-> reader<c- p>.</c->onerror <c- o>=</c-> errorHandler<c- p>;</c-> <c- p>}</c-> <c- a>function</c-> updateProgress<c- p>(</c->evt<c- p>)</c-> <c- p>{</c-> <c- k>if</c-> <c- p>(</c->evt<c- p>.</c->lengthComputable<c- p>)</c-> <c- p>{</c-> <c- c1>// evt.loaded and evt.total are ProgressEvent properties</c-> <c- a>var</c-> loaded <c- o>=</c-> <c- p>(</c->evt<c- p>.</c->loaded <c- o>/</c-> evt<c- p>.</c->total<c- p>);</c-> <c- k>if</c-> <c- p>(</c->loaded <c- o><</c-> <c- mf>1</c-><c- p>)</c-> <c- p>{</c-> <c- c1>// Increase the prog bar length</c-> <c- c1>// style.width = (loaded * 200) + "px";</c-> <c- p>}</c-> <c- p>}</c-> <c- p>}</c-> <c- a>function</c-> loaded<c- p>(</c->evt<c- p>)</c-> <c- p>{</c-> <c- c1>// Obtain the read file data</c-> <c- a>var</c-> fileString <c- o>=</c-> evt<c- p>.</c->target<c- p>.</c->result<c- p>;</c-> <c- c1>// Handle UTF-16 file dump</c-> <c- k>if</c-><c- p>(</c->utils<c- p>.</c->regexp<c- p>.</c->isChinese<c- p>(</c->fileString<c- p>))</c-> <c- p>{</c-> <c- c1>//Chinese Characters + Name validation</c-> <c- p>}</c-> <c- k>else</c-> <c- p>{</c-> <c- c1>// run other charset test</c-> <c- p>}</c-> <c- c1>// xhr.send(fileString)</c-> <c- p>}</c-> <c- a>function</c-> errorHandler<c- p>(</c->evt<c- p>)</c-> <c- p>{</c-> <c- k>if</c-><c- p>(</c->evt<c- p>.</c->target<c- p>.</c->error<c- p>.</c->name <c- o>==</c-> <c- u>"NotReadableError"</c-><c- p>)</c-> <c- p>{</c-> <c- c1>// The file could not be read</c-> <c- p>}</c-> <c- p>}</c-> </pre> </div> <h2 class="heading settled" data-level="2" id="terminology"><span class="secno">2. </span><span class="content">Terminology and Algorithms</span><a class="self-link" href="#terminology"></a></h2> <p>When this specification says to <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="terminate an algorithm|terminate this algorithm" data-noexport id="terminate-an-algorithm">terminate an algorithm</dfn> the user agent must terminate the algorithm after finishing the step it is on. Asynchronous <a data-link-type="dfn" href="#read-method" id="ref-for-read-method">read methods</a> defined in this specification may return before the algorithm in question is terminated, and can be terminated by an <code class="idl"><a data-link-type="idl" href="#dfn-abort" id="ref-for-dfn-abort">abort()</a></code> call.</p> <p>The algorithms and steps in this specification use the following mathematical operations:</p> <ul> <li data-md> <p>max(a,b) returns the maximum of a and b, and is always performed on integers as they are defined in WebIDL <a data-link-type="biblio" href="#biblio-webidl" title="Web IDL Standard">[WebIDL]</a>; in the case of max(6,4) the result is 6. This operation is also defined in ECMAScript <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>.</p> <li data-md> <p>min(a,b) returns the minimum of a and b, and is always performed on integers as they are defined in WebIDL <a data-link-type="biblio" href="#biblio-webidl" title="Web IDL Standard">[WebIDL]</a>; in the case of min(6,4) the result is 4. This operation is also defined in ECMAScript <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>.</p> <li data-md> <p>Mathematical comparisons such as < (less than), ≤ (less than or equal to), and > (greater than) are as in ECMAScript <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>.</p> </ul> <p>The term <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="UnixEpoch">Unix Epoch</dfn> is used in this specification to refer to the time 00:00:00 UTC on January 1 1970 (or 1970-01-01T00:00:00Z ISO 8601); this is the same time that is conceptually "<code>0</code>" in ECMA-262 <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>.</p> <div class="algorithm" data-algorithm="slice blob"> The <dfn class="dfn-paneled" data-dfn-type="dfn" data-export id="slice-blob">slice blob</dfn> algorithm given a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑧">Blob</a></code> <var>blob</var>, <var>start</var>, <var>end</var>, and <var>contentType</var> is used to refer to the following steps and returns a new <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑨">Blob</a></code> containing the bytes ranging from the <var>start</var> parameter up to but not including the <var>end</var> parameter. It must act as follows: <ol> <li data-md> <p>Let <var>originalSize</var> be <var>blob</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-size" id="ref-for-dfn-size">size</a></code>.</p> <li data-md> <p>The <var>start</var> parameter, if non-null, is a value for the start point of a <a data-link-type="dfn" href="#slice-blob" id="ref-for-slice-blob">slice blob</a> call, and must be treated as a byte-order position, with the zeroth position representing the first byte. User agents must normalize <var>start</var> according to the following:</p> <ol type="a"> <li>If <var>start</var> is null, let <var>relativeStart</var> be 0. <li>If <var>start</var> is negative, let <var>relativeStart</var> be <code>max((<var>originalSize</var> + <var>start</var>), 0)</code>. <li>Otherwise, let <var>relativeStart</var> be <code>min(<var>start</var>, <var>originalSize</var>)</code>. </ol> <li data-md> <p>The <var>end</var> parameter, if non-null. is a value for the end point of a <a data-link-type="dfn" href="#slice-blob" id="ref-for-slice-blob①">slice blob</a> call. User agents must normalize <var>end</var> according to the following:</p> <ol type="a"> <li>If <var>end</var> is null, let <var>relativeEnd</var> be <var>originalSize</var>. <li>If <var>end</var> is negative, let <var>relativeEnd</var> be <code>max((<var>originalSize</var> + <var>end</var>), 0)</code>. <li>Otherwise, let <var>relativeEnd</var> be <code>min(<var>end</var>, <var>originalSize</var>)</code>. </ol> <li data-md> <p>The <var>contentType</var> parameter, if non-null, is used to set the ASCII-encoded string in lower case representing the media type of the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①⓪">Blob</a></code>. User agents must normalize <var>contentType</var> according to the following:</p> <ol type="a"> <li>If <var>contentType</var> is null, let <var>relativeContentType</var> be set to the empty string. <li> Otherwise, let <var>relativeContentType</var> be set to <var>contentType</var> and run the substeps below: <ol> <li data-md> <p>If <var>relativeContentType</var> contains any characters outside the range of U+0020 to U+007E, then set <var>relativeContentType</var> to the empty string and return from these substeps.</p> <li data-md> <p>Convert every character in <var>relativeContentType</var> to <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#ascii-lowercase" id="ref-for-ascii-lowercase">ASCII lowercase</a>.</p> </ol> </ol> <li data-md> <p>Let <var>span</var> be <code>max((<var>relativeEnd</var> - <var>relativeStart</var>), 0)</code>.</p> <li data-md> <p>Return a new <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①①">Blob</a></code> object <var>S</var> with the following characteristics:</p> <ol type="a"> <li><var>S</var> refers to <var>span</var> consecutive <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte">byte</a>s from <var>blob</var>’s associated <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte①">byte</a> sequence, beginning with the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte②">byte</a> at byte-order position <var>relativeStart</var>. <li><var>S</var>.<code class="idl"><a data-link-type="idl" href="#dfn-size" id="ref-for-dfn-size①">size</a></code> = <var>span</var>. <li><var>S</var>.<code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type">type</a></code> = <var>relativeContentType</var>. </ol> </ol> </div> <h2 class="heading settled" data-level="3" id="blob-section"><span class="secno">3. </span><span class="content">The Blob Interface and Binary Data</span><a class="self-link" href="#blob-section"></a></h2> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①②">Blob</a></code> object refers to a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte③">byte</a> sequence, and has a <code class="idl"><a data-link-type="idl" href="#dfn-size" id="ref-for-dfn-size②">size</a></code> attribute which is the total number of bytes in the byte sequence, and a <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①">type</a></code> attribute, which is an ASCII-encoded string in lower case representing the media type of the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte④">byte</a> sequence.</p> <p>Each <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①③">Blob</a></code> must have an internal <dfn class="dfn-paneled" data-dfn-for="Blob" data-dfn-type="dfn" data-noexport id="snapshot-state">snapshot state</dfn>, which must be initially set to the state of the underlying storage, if any such underlying storage exists. Further normative definition of <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state">snapshot state</a> can be found for <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file⑥">File</a></code>s.</p> <pre class="idl highlight def">[<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed" id="ref-for-Exposed"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->), <a class="idl-code" data-link-type="extended-attribute" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable" id="ref-for-serializable"><c- g>Serializable</c-></a>] <c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="dfn-Blob"><code><c- g>Blob</c-></code></dfn> { <dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="constructor" data-export data-lt="Blob(blobParts, options)|constructor(blobParts, options)|Blob(blobParts)|constructor(blobParts)|Blob()|constructor()" id="dom-blob-blob"><code><c- g>constructor</c-></code></dfn>(<c- b>optional</c-> <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#idl-sequence" id="ref-for-idl-sequence"><c- b>sequence</c-></a><<a data-link-type="idl-name" href="#typedefdef-blobpart" id="ref-for-typedefdef-blobpart"><c- n>BlobPart</c-></a>> <a class="idl-code" data-link-type="argument" href="#dfn-blobParts" id="ref-for-dfn-blobParts"><c- g>blobParts</c-></a>, <c- b>optional</c-> <a data-link-type="idl-name" href="#dfn-BlobPropertyBag" id="ref-for-dfn-BlobPropertyBag"><c- n>BlobPropertyBag</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="Blob/Blob(blobParts, options), Blob/constructor(blobParts, options), Blob/Blob(blobParts), Blob/constructor(blobParts), Blob/Blob(), Blob/constructor()" data-dfn-type="argument" data-export id="dom-blob-blob-blobparts-options-options"><code><c- g>options</c-></code></dfn> = {}); <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned long long" href="#dfn-size" id="ref-for-dfn-size③"><c- g>size</c-></a>; <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="DOMString" href="#dfn-type" id="ref-for-dfn-type②"><c- g>type</c-></a>; // slice Blob into byte-ranged chunks <a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob①④"><c- n>Blob</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-slice" id="ref-for-dfn-slice"><c- g>slice</c-></a>(<c- b>optional</c-> [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Clamp" id="ref-for-Clamp"><c- g>Clamp</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long" id="ref-for-idl-long-long"><c- b>long</c-> <c- b>long</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="Blob/slice(start, end, contentType), Blob/slice(start, end), Blob/slice(start), Blob/slice()" data-dfn-type="argument" data-export id="dom-blob-slice-start-end-contenttype-start"><code><c- g>start</c-></code></dfn>, <c- b>optional</c-> [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Clamp" id="ref-for-Clamp①"><c- g>Clamp</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long" id="ref-for-idl-long-long①"><c- b>long</c-> <c- b>long</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="Blob/slice(start, end, contentType), Blob/slice(start, end), Blob/slice(start), Blob/slice()" data-dfn-type="argument" data-export id="dom-blob-slice-start-end-contenttype-end"><code><c- g>end</c-></code></dfn>, <c- b>optional</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString①"><c- b>DOMString</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="Blob/slice(start, end, contentType), Blob/slice(start, end), Blob/slice(start), Blob/slice()" data-dfn-type="argument" data-export id="dom-blob-slice-start-end-contenttype-contenttype"><code><c- g>contentType</c-></code></dfn>); // read from the Blob. [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject" id="ref-for-NewObject"><c- g>NewObject</c-></a>] <a data-link-type="idl-name" href="https://streams.spec.whatwg.org/#readablestream" id="ref-for-readablestream"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-blob-stream" id="ref-for-dom-blob-stream"><c- g>stream</c-></a>(); [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject" id="ref-for-NewObject①"><c- g>NewObject</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-promise" id="ref-for-idl-promise"><c- b>Promise</c-></a><<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString"><c- b>USVString</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-blob-text" id="ref-for-dom-blob-text"><c- g>text</c-></a>(); [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject" id="ref-for-NewObject②"><c- g>NewObject</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-promise" id="ref-for-idl-promise①"><c- b>Promise</c-></a><<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer"><c- b>ArrayBuffer</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-blob-arraybuffer" id="ref-for-dom-blob-arraybuffer"><c- g>arrayBuffer</c-></a>(); [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject" id="ref-for-NewObject③"><c- g>NewObject</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-promise" id="ref-for-idl-promise②"><c- b>Promise</c-></a><<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-Uint8Array" id="ref-for-idl-Uint8Array"><c- b>Uint8Array</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-blob-bytes" id="ref-for-dom-blob-bytes"><c- g>bytes</c-></a>(); }; <c- b>enum</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="enum" data-export id="enumdef-endingtype"><code><c- g>EndingType</c-></code></dfn> { <dfn class="dfn-paneled idl-code" data-dfn-for="EndingType" data-dfn-type="enum-value" data-export id="dom-endingtype-transparent"><code><c- s>"transparent"</c-></code></dfn>, <dfn class="dfn-paneled idl-code" data-dfn-for="EndingType" data-dfn-type="enum-value" data-export id="dom-endingtype-native"><code><c- s>"native"</c-></code></dfn> }; <c- b>dictionary</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dfn-BlobPropertyBag"><code><c- g>BlobPropertyBag</c-></code></dfn> { <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString②"><c- b>DOMString</c-></a> <a class="idl-code" data-default="""" data-link-type="dict-member" data-type="DOMString" href="#dfn-BPtype" id="ref-for-dfn-BPtype"><c- g>type</c-></a> = ""; <a data-link-type="idl-name" href="#enumdef-endingtype" id="ref-for-enumdef-endingtype"><c- n>EndingType</c-></a> <a class="idl-code" data-default=""transparent"" data-link-type="dict-member" data-type="EndingType" href="#dom-blobpropertybag-endings" id="ref-for-dom-blobpropertybag-endings"><c- g>endings</c-></a> = "transparent"; }; <c- b>typedef</c-> (<a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#BufferSource" id="ref-for-BufferSource"><c- n>BufferSource</c-></a> <c- b>or</c-> <a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob①⑤"><c- n>Blob</c-></a> <c- b>or</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString①"><c- b>USVString</c-></a>) <dfn class="dfn-paneled idl-code" data-dfn-type="typedef" data-export id="typedefdef-blobpart"><code><c- g>BlobPart</c-></code></dfn>; </pre> <p><code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①⑥">Blob</a></code> objects are <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects" id="ref-for-serializable-objects">serializable objects</a>. Their <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps" id="ref-for-serialization-steps">serialization steps</a>, given <var>value</var> and <var>serialized</var>, are:</p> <ol> <li data-md> <p>Set <var>serialized</var>.[[SnapshotState]] to <var>value</var>’s <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state①">snapshot state</a>.</p> <li data-md> <p>Set <var>serialized</var>.[[ByteSequence]] to <var>value</var>’s underlying byte sequence.</p> </ol> <p>Their <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps" id="ref-for-deserialization-steps">deserialization step</a>, given <var>serialized</var> and <var>value</var>, are:</p> <ol> <li data-md> <p>Set <var>value</var>’s <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state②">snapshot state</a> to <var>serialized</var>.[[SnapshotState]].</p> <li data-md> <p>Set <var>value</var>’s underlying byte sequence to <var>serialized</var>.[[ByteSequence]].</p> </ol> <div class="algorithm" data-algorithm="get stream"> A <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①⑦">Blob</a></code> <var>blob</var> has an associated <dfn class="dfn-paneled" data-dfn-for="Blob" data-dfn-type="dfn" data-export id="blob-get-stream">get stream</dfn> algorithm, which runs these steps: <ol> <li data-md> <p>Let <var>stream</var> be a <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#new" id="ref-for-new">new</a> <code class="idl"><a data-link-type="idl" href="https://streams.spec.whatwg.org/#readablestream" id="ref-for-readablestream①">ReadableStream</a></code> created in <var>blob</var>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-realm" id="ref-for-concept-relevant-realm">relevant Realm</a>.</p> <li data-md> <p><a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-set-up-with-byte-reading-support" id="ref-for-readablestream-set-up-with-byte-reading-support">Set up</a> <var>stream</var> with byte reading support.</p> <li data-md> <p>Run the following steps <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel" id="ref-for-in-parallel">in parallel</a>:</p> <ol> <li data-md> <p>While not all bytes of <var>blob</var> have been read:</p> <ol> <li data-md> <p>Let <var>bytes</var> be the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte-sequence" id="ref-for-byte-sequence">byte sequence</a> that results from reading a <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#chunk" id="ref-for-chunk">chunk</a> from <var>blob</var>, or failure if a chunk cannot be read.</p> <li data-md> <p><a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-global-task" id="ref-for-queue-a-global-task">Queue a global task</a> on the <a data-link-type="dfn" href="#fileReadingTaskSource" id="ref-for-fileReadingTaskSource">file reading task source</a> given <var>blob</var>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-global" id="ref-for-concept-relevant-global">relevant global object</a> to perform the following steps:</p> <ol> <li data-md> <p>If <var>bytes</var> is failure, then <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-error" id="ref-for-readablestream-error">error</a> <var>stream</var> with a <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason">failure reason</a> and abort these steps.</p> <li data-md> <p>Let <var>chunk</var> be a new <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-Uint8Array" id="ref-for-idl-Uint8Array①">Uint8Array</a></code> wrapping an <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer①">ArrayBuffer</a></code> containing <var>bytes</var>. If creating the <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer②">ArrayBuffer</a></code> throws an exception, then <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-error" id="ref-for-readablestream-error①">error</a> <var>stream</var> with that exception and abort these steps.</p> <li data-md> <p><a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-enqueue" id="ref-for-readablestream-enqueue">Enqueue</a> <var>chunk</var> in <var>stream</var>.</p> </ol> </ol> <p class="issue" id="issue-27e70e89"><a class="self-link" href="#issue-27e70e89"></a> We need to specify more concretely what reading from a Blob actually does, what possible errors can happen, perhaps something about chunk sizes, etc.</p> </ol> <li data-md> <p>Return <var>stream</var>.</p> </ol> </div> <h3 class="heading settled" data-level="3.1" id="constructorBlob"><span class="secno">3.1. </span><span class="content">Constructors</span><a class="self-link" href="#constructorBlob"></a></h3> <div class="algorithm" data-algorithm="blob-constructor"> The <code class="idl"><a data-link-type="idl" href="#dom-blob-blob" id="ref-for-dom-blob-blob">Blob()</a></code> constructor can be invoked with zero or more parameters. When the <code class="idl"><a data-link-type="idl" href="#dom-blob-blob" id="ref-for-dom-blob-blob①">Blob()</a></code> constructor is invoked, user agents must run the following steps: <ol> <li data-md> <p>If invoked with zero parameters, return a new <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①⑧">Blob</a></code> object consisting of 0 bytes, with <code class="idl"><a data-link-type="idl" href="#dfn-size" id="ref-for-dfn-size④">size</a></code> set to 0, and with <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type③">type</a></code> set to the empty string.</p> <li data-md> <p>Let <var>bytes</var> be the result of <a data-link-type="dfn" href="#process-blob-parts" id="ref-for-process-blob-parts">processing blob parts</a> given <code class="idl"><a data-link-type="idl" href="#dfn-blobParts" id="ref-for-dfn-blobParts①">blobParts</a></code> and <code class="idl"><a data-link-type="idl" href="#dom-blob-blob-blobparts-options-options" id="ref-for-dom-blob-blob-blobparts-options-options">options</a></code>.</p> <li data-md> <p>If the <code class="idl"><a data-link-type="idl" href="#dfn-BPtype" id="ref-for-dfn-BPtype①">type</a></code> member of the <code class="idl"><a data-link-type="idl" href="#dom-blob-blob-blobparts-options-options" id="ref-for-dom-blob-blob-blobparts-options-options①">options</a></code> argument is not the empty string, run the following sub-steps:</p> <ol> <li data-md> <p>Let <var>t</var> be the <code class="idl"><a data-link-type="idl" href="#dfn-BPtype" id="ref-for-dfn-BPtype②">type</a></code> dictionary member. If <var>t</var> contains any characters outside the range U+0020 to U+007E, then set <var>t</var> to the empty string and return from these substeps.</p> <li data-md> <p>Convert every character in <var>t</var> to <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#ascii-lowercase" id="ref-for-ascii-lowercase①">ASCII lowercase</a>.</p> </ol> <li data-md> <p>Return a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob①⑨">Blob</a></code> object referring to <var>bytes</var> as its associated <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte⑤">byte</a> sequence, with its <code class="idl"><a data-link-type="idl" href="#dfn-size" id="ref-for-dfn-size⑤">size</a></code> set to the length of <var>bytes</var>, and its <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type④">type</a></code> set to the value of <var>t</var> from the substeps above.</p> </ol> </div> <h4 class="heading settled" data-level="3.1.1" id="constructorParams"><span class="secno">3.1.1. </span><span class="content">Constructor Parameters</span><a class="self-link" href="#constructorParams"></a></h4> <p>The <code class="idl"><a data-link-type="idl" href="#dom-blob-blob" id="ref-for-dom-blob-blob②">Blob()</a></code> constructor can be invoked with the parameters below:</p> <dl> <dt>A <dfn class="dfn-paneled idl-code" data-dfn-for="Blob/Blob(blobParts, options)" data-dfn-type="argument" data-export id="dfn-blobParts"><code>blobParts</code></dfn> <code>sequence</code> <dd> which takes any number of the following types of elements, and in any order: <ul> <li data-md> <p><code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#BufferSource" id="ref-for-BufferSource①">BufferSource</a></code> elements.</p> <li data-md> <p><code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②⓪">Blob</a></code> elements.</p> <li data-md> <p><code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString②">USVString</a></code> elements.</p> </ul> <dt id="dfn-BlobPropertyBagMembers"><a class="self-link" href="#dfn-BlobPropertyBagMembers"></a>An <em>optional</em> <code class="idl"><a data-link-type="idl" href="#dfn-BlobPropertyBag" id="ref-for-dfn-BlobPropertyBag①">BlobPropertyBag</a></code> <dd> which takes these optional members: <ul> <li data-md> <p><dfn class="dfn-paneled idl-code" data-dfn-for="BlobPropertyBag" data-dfn-type="dict-member" data-export id="dfn-BPtype"><code>type</code></dfn>, the ASCII-encoded string in lower case representing the media type of the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②①">Blob</a></code>. Normative conditions for this member are provided in the <a href="#constructorBlob">§ 3.1 Constructors</a>.</p> <li data-md> <p><dfn class="dfn-paneled idl-code" data-dfn-for="BlobPropertyBag" data-dfn-type="dict-member" data-export id="dom-blobpropertybag-endings"><code>endings</code></dfn>, an enum which can take the values <code class="idl"><a data-link-type="idl" href="#dom-endingtype-transparent" id="ref-for-dom-endingtype-transparent">"transparent"</a></code> or <code class="idl"><a data-link-type="idl" href="#dom-endingtype-native" id="ref-for-dom-endingtype-native">"native"</a></code>. By default this is set to <code class="idl"><a data-link-type="idl" href="#dom-endingtype-transparent" id="ref-for-dom-endingtype-transparent①">"transparent"</a></code>. If set to <code class="idl"><a data-link-type="idl" href="#dom-endingtype-native" id="ref-for-dom-endingtype-native①">"native"</a></code>, <a data-link-type="dfn" href="#convert-line-endings-to-native" id="ref-for-convert-line-endings-to-native">line endings will be converted to native</a> in any <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString③">USVString</a></code> elements in <code class="idl"><a data-link-type="idl" href="#dfn-blobParts" id="ref-for-dfn-blobParts②">blobParts</a></code>.</p> </ul> </dl> <div class="algorithm" data-algorithm="process-blob-parts"> To <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="process blob parts|processing blob parts" data-noexport id="process-blob-parts">process blob parts</dfn> given a sequence of <code class="idl"><a data-link-type="idl" href="#typedefdef-blobpart" id="ref-for-typedefdef-blobpart①">BlobPart</a></code>'s <var>parts</var> and <code class="idl"><a data-link-type="idl" href="#dfn-BlobPropertyBag" id="ref-for-dfn-BlobPropertyBag②">BlobPropertyBag</a></code> <var>options</var>, run the following steps: <ol> <li data-md> <p>Let <var>bytes</var> be an empty sequence of bytes.</p> <li data-md> <p>For each <var>element</var> in <var>parts</var>:</p> <ol> <li data-md> <p>If <var>element</var> is a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString④">USVString</a></code>, run the following substeps:</p> <ol> <li data-md> <p>Let <var>s</var> be <var>element</var>.</p> <li data-md> <p>If the <code class="idl"><a data-link-type="idl" href="#dom-blobpropertybag-endings" id="ref-for-dom-blobpropertybag-endings①">endings</a></code> member of <var>options</var> is <code class="idl"><a data-link-type="idl" href="#dom-endingtype-native" id="ref-for-dom-endingtype-native②">"native"</a></code>, set <var>s</var> to the result of <a data-link-type="dfn" href="#convert-line-endings-to-native" id="ref-for-convert-line-endings-to-native①">converting line endings to native</a> of <var>element</var>.</p> <li data-md> <p>Append the result of <a data-link-type="dfn" href="https://encoding.spec.whatwg.org/#utf-8-encode" id="ref-for-utf-8-encode">UTF-8 encoding</a> <var>s</var> to <var>bytes</var>.</p> <p class="note" role="note"><span class="marker">Note:</span> The algorithm from WebIDL <a data-link-type="biblio" href="#biblio-webidl" title="Web IDL Standard">[WebIDL]</a> replaces unmatched surrogates in an invalid utf-16 string with U+FFFD replacement characters. Scenarios exist when the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②②">Blob</a></code> constructor may result in some data loss due to lost or scrambled character sequences.</p> </ol> <li data-md> <p>If <var>element</var> is a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#BufferSource" id="ref-for-BufferSource②">BufferSource</a></code>, <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy" id="ref-for-dfn-get-buffer-source-copy">get a copy of the bytes held by the buffer source</a>, and append those bytes to <var>bytes</var>.</p> <li data-md> <p>If <var>element</var> is a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②③">Blob</a></code>, append the bytes it represents to <var>bytes</var>.</p> <p class="note" role="note"><span class="marker">Note:</span> The <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type⑤">type</a></code> of the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②④">Blob</a></code> array element is ignored and will not affect <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type⑥">type</a></code> of returned <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②⑤">Blob</a></code> object.</p> </ol> <li data-md> <p>Return <var>bytes</var>.</p> </ol> </div> <div class="algorithm" data-algorithm="convert-line-endings-to-native"> To <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="convert line endings to native|converting line endings to native" data-noexport id="convert-line-endings-to-native"> convert line endings to native</dfn> in a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#string" id="ref-for-string">string</a> <var>s</var>, run the following steps: <ol> <li data-md> <p>Let <var>native line ending</var> be the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#code-point" id="ref-for-code-point">code point</a> U+000A LF.</p> <li data-md> <p>If the underlying platform’s conventions are to represent newlines as a carriage return and line feed sequence, set <var>native line ending</var> to the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#code-point" id="ref-for-code-point①">code point</a> U+000D CR followed by the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#code-point" id="ref-for-code-point②">code point</a> U+000A LF.</p> <li data-md> <p>Set <var>result</var> to the empty <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#string" id="ref-for-string①">string</a>.</p> <li data-md> <p>Let <var>position</var> be a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#string-position-variable" id="ref-for-string-position-variable">position variable</a> for <var>s</var>, initially pointing at the start of <var>s</var>.</p> <li data-md> <p>Let <var>token</var> be the result of <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points" id="ref-for-collect-a-sequence-of-code-points">collecting a sequence of code points</a> that are not equal to U+000A LF or U+000D CR from <var>s</var> given <var>position</var>.</p> <li data-md> <p>Append <var>token</var> to <var>result</var>.</p> <li data-md> <p>While <var>position</var> is not past the end of <var>s</var>:</p> <ol> <li data-md> <p>If the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#code-point" id="ref-for-code-point③">code point</a> at <var>position</var> within <var>s</var> equals U+000D CR:</p> <ol> <li data-md> <p>Append <var>native line ending</var> to <var>result</var>.</p> <li data-md> <p>Advance <var>position</var> by 1.</p> <li data-md> <p>If <var>position</var> is not past the end of <var>s</var> and the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#code-point" id="ref-for-code-point④">code point</a> at <var>position</var> within <var>s</var> equals U+000A LF advance <var>position</var> by 1.</p> </ol> <li data-md> <p>Otherwise if the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#code-point" id="ref-for-code-point⑤">code point</a> at <var>position</var> within <var>s</var> equals U+000A LF, advance <var>position</var> by 1 and append <var>native line ending</var> to <var>result</var>.</p> <li data-md> <p>Let <var>token</var> be the result of <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points" id="ref-for-collect-a-sequence-of-code-points①">collecting a sequence of code points</a> that are not equal to U+000A LF or U+000D CR from <var>s</var> given <var>position</var>.</p> <li data-md> <p>Append <var>token</var> to <var>result</var>.</p> </ol> <li data-md> <p>Return <var>result</var>.</p> </ol> </div> <div class="example" id="example-74beb70c"> <a class="self-link" href="#example-74beb70c"></a> Examples of constructor usage follow. <pre class="lang-javascript highlight"><c- c1>// Create a new Blob object</c-> <c- a>var</c-> a <c- o>=</c-> <c- ow>new</c-> Blob<c- p>();</c-> <c- c1>// Create a 1024-byte ArrayBuffer</c-> <c- c1>// buffer could also come from reading a File</c-> <c- a>var</c-> buffer <c- o>=</c-> <c- ow>new</c-> ArrayBuffer<c- p>(</c-><c- mf>1024</c-><c- p>);</c-> <c- c1>// Create ArrayBufferView objects based on buffer</c-> <c- a>var</c-> shorts <c- o>=</c-> <c- ow>new</c-> Uint16Array<c- p>(</c->buffer<c- p>,</c-> <c- mf>512</c-><c- p>,</c-> <c- mf>128</c-><c- p>);</c-> <c- a>var</c-> bytes <c- o>=</c-> <c- ow>new</c-> Uint8Array<c- p>(</c->buffer<c- p>,</c-> shorts<c- p>.</c->byteOffset <c- o>+</c-> shorts<c- p>.</c->byteLength<c- p>);</c-> <c- a>var</c-> b <c- o>=</c-> <c- ow>new</c-> Blob<c- p>([</c-><c- u>"foobarbazetcetc"</c-> <c- o>+</c-> <c- u>"birdiebirdieboo"</c-><c- p>],</c-> <c- p>{</c->type<c- o>:</c-> <c- u>"text/plain;charset=utf-8"</c-><c- p>});</c-> <c- a>var</c-> c <c- o>=</c-> <c- ow>new</c-> Blob<c- p>([</c->b<c- p>,</c-> shorts<c- p>]);</c-> <c- a>var</c-> a <c- o>=</c-> <c- ow>new</c-> Blob<c- p>([</c->b<c- p>,</c-> c<c- p>,</c-> bytes<c- p>]);</c-> <c- a>var</c-> d <c- o>=</c-> <c- ow>new</c-> Blob<c- p>([</c->buffer<c- p>,</c-> b<c- p>,</c-> c<c- p>,</c-> bytes<c- p>]);</c-> </pre> </div> <h3 class="heading settled" data-level="3.2" id="attributes-blob"><span class="secno">3.2. </span><span class="content">Attributes</span><a class="self-link" href="#attributes-blob"></a></h3> <dl> <dt><dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="attribute" data-export id="dfn-size"><code>size</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#idl-unsigned-long-long" id="ref-for-idl-unsigned-long-long①">unsigned long long</a>, readonly</span> <dd>Returns the size of the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte⑥">byte</a> sequence in number of bytes. On getting, conforming user agents must return the total number of bytes that can be read by a <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader②">FileReader</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-FileReaderSync" id="ref-for-dfn-FileReaderSync">FileReaderSync</a></code> object, or 0 if the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②⑥">Blob</a></code> has no bytes to be read. <dt><dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="attribute" data-export id="dfn-type"><code>type</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString③">DOMString</a>, readonly</span> <dd> The ASCII-encoded string in lower case representing the media type of the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②⑦">Blob</a></code>. On getting, user agents must return the type of a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②⑧">Blob</a></code> as an ASCII-encoded string in lower case, such that when it is converted to a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte⑦">byte</a> sequence, it is a <a data-link-type="dfn" href="https://mimesniff.spec.whatwg.org/#parsable-mime-type" id="ref-for-parsable-mime-type">parsable MIME type</a>, or the empty string – 0 bytes – if the type cannot be determined. <p>The <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type⑦">type</a></code> attribute can be set by the web application itself through constructor invocation and through the <code class="idl"><a data-link-type="idl" href="#dfn-slice" id="ref-for-dfn-slice①">slice()</a></code> call; in these cases, further normative conditions for this attribute are in <a href="#constructorBlob">§ 3.1 Constructors</a>, <a href="#file-constructor">§ 4.1 Constructor</a>, and <a href="#slice-method-algo">§ 3.3.1 The slice() method</a> respectively. User agents can also determine the <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type⑧">type</a></code> of a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob②⑨">Blob</a></code>, especially if the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte⑧">byte</a> sequence is from an on-disk file; in this case, further normative conditions are in the <a data-link-type="dfn" href="#file-type-guidelines" id="ref-for-file-type-guidelines">file type guidelines</a>.</p> <p class="note" role="note"><span class="marker">Note:</span> The type <var>t</var> of a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③⓪">Blob</a></code> is considered a <a data-link-type="dfn" href="https://mimesniff.spec.whatwg.org/#parsable-mime-type" id="ref-for-parsable-mime-type①">parsable MIME type</a>, if performing the <a data-link-type="dfn" href="https://mimesniff.spec.whatwg.org/#parse-a-mime-type" id="ref-for-parse-a-mime-type">parse a MIME type</a> algorithm to a byte sequence converted from the ASCII-encoded string representing the Blob object’s type does not return failure.</p> <p class="note" role="note"><span class="marker">Note:</span> Use of the <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type⑨">type</a></code> attribute informs the <a data-link-type="dfn" href="#blob-package-data" id="ref-for-blob-package-data">package data</a> algorithm and determines the <code>Content-Type</code> header when <a data-link-type="dfn" href="https://fetch.spec.whatwg.org/#concept-fetch" id="ref-for-concept-fetch">fetching</a> <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url">blob URLs</a>.</p> </dl> <h3 class="heading settled" data-level="3.3" id="methodsandparams-blob"><span class="secno">3.3. </span><span class="content">Methods and Parameters</span><a class="self-link" href="#methodsandparams-blob"></a></h3> <h4 class="heading settled" data-level="3.3.1" id="slice-method-algo"><span class="secno">3.3.1. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-slice" id="ref-for-dfn-slice②">slice()</a></code> method</span><a class="self-link" href="#slice-method-algo"></a></h4> <div class="algorithm" data-algorithm="slice(start, end, contentType), slice(start, end), slice(start), slice()" data-algorithm-for="Blob"> The <dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="method" data-export data-lt="slice(start, end, contentType)|slice(start, end)|slice(start)|slice()|slice(start, end, contentType), slice(start, end), slice(start), slice()" id="dfn-slice"><code>slice()</code></dfn> method returns a new <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③①">Blob</a></code> object with bytes ranging from the optional <var>start</var> parameter up to but not including the optional <var>end</var> parameter, and with a <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①⓪">type</a></code> attribute that is the value of the optional <var>contentType</var> parameter. It must act as follows: <ol> <li data-md> <p>Let <var>sliceStart</var>, <var>sliceEnd</var>, and <var>sliceContentType</var> be null.</p> <li data-md> <p>If <var>start</var> is given, set <var>sliceStart</var> to <var>start</var>.</p> <li data-md> <p>If <var>end</var> is given, set <var>sliceEnd</var> to <var>end</var>.</p> <li data-md> <p>If <var>contentType</var> is given, set <var>sliceContentType</var> to <var>contentType</var>.</p> <li data-md> <p>Return the result of <a data-link-type="dfn" href="#slice-blob" id="ref-for-slice-blob②">slice blob</a> given <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this">this</a>, <var>sliceStart</var>, <var>sliceEnd</var>, and <var>sliceContentType</var>.</p> </ol> <div class="example" id="example-0ffe45c5"> <a class="self-link" href="#example-0ffe45c5"></a> The examples below illustrate the different types of <code class="idl"><a data-link-type="idl" href="#dfn-slice" id="ref-for-dfn-slice③">slice()</a></code> calls possible. Since the <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file⑦">File</a></code> interface inherits from the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③②">Blob</a></code> interface, examples are based on the use of the <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file⑧">File</a></code> interface. <pre class="lang-javascript highlight"><c- c1>// obtain input element through DOM</c-> <c- a>var</c-> file <c- o>=</c-> document<c- p>.</c->getElementById<c- p>(</c-><c- t>'file'</c-><c- p>).</c->files<c- p>[</c-><c- mf>0</c-><c- p>];</c-> <c- k>if</c-><c- p>(</c->file<c- p>)</c-> <c- p>{</c-> <c- c1>// create an identical copy of file</c-> <c- c1>// the two calls below are equivalent</c-> <c- a>var</c-> fileClone <c- o>=</c-> file<c- p>.</c->slice<c- p>();</c-> <c- a>var</c-> fileClone2 <c- o>=</c-> file<c- p>.</c->slice<c- p>(</c-><c- mf>0</c-><c- p>,</c-> file<c- p>.</c->size<c- p>);</c-> <c- c1>// slice file into 1/2 chunk starting at middle of file</c-> <c- c1>// Note the use of negative number</c-> <c- a>var</c-> fileChunkFromEnd <c- o>=</c-> file<c- p>.</c->slice<c- p>(</c-><c- o>-</c-><c- p>(</c->Math<c- p>.</c->round<c- p>(</c->file<c- p>.</c->size<c- o>/</c-><c- mf>2</c-><c- p>)));</c-> <c- c1>// slice file into 1/2 chunk starting at beginning of file</c-> <c- a>var</c-> fileChunkFromStart <c- o>=</c-> file<c- p>.</c->slice<c- p>(</c-><c- mf>0</c-><c- p>,</c-> Math<c- p>.</c->round<c- p>(</c->file<c- p>.</c->size<c- o>/</c-><c- mf>2</c-><c- p>));</c-> <c- c1>// slice file from beginning till 150 bytes before end</c-> <c- a>var</c-> fileNoMetadata <c- o>=</c-> file<c- p>.</c->slice<c- p>(</c-><c- mf>0</c-><c- p>,</c-> <c- o>-</c-><c- mf>150</c-><c- p>,</c-> <c- u>"application/experimental"</c-><c- p>);</c-> <c- p>}</c-> </pre> </div> </div> <h4 class="heading settled" data-level="3.3.2" id="stream-method-algo"><span class="secno">3.3.2. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dom-blob-stream" id="ref-for-dom-blob-stream①">stream()</a></code> method</span><a class="self-link" href="#stream-method-algo"></a></h4> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="method" data-export id="dom-blob-stream"><code>stream()</code></dfn> method, when invoked, must return the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream">get stream</a> on <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①">this</a>.</p> <h4 class="heading settled" data-level="3.3.3" id="text-method-algo"><span class="secno">3.3.3. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dom-blob-text" id="ref-for-dom-blob-text①">text()</a></code> method</span><a class="self-link" href="#text-method-algo"></a></h4> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="method" data-export id="dom-blob-text"><code>text()</code></dfn> method, when invoked, must run these steps:</p> <ol> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream①">get stream</a> on <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this②">this</a>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader">getting a reader</a> from <var>stream</var>. If that threw an exception, return a new promise rejected with that exception.</p> <li data-md> <p>Let <var>promise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes" id="ref-for-readablestreamdefaultreader-read-all-bytes">reading all bytes</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Return the result of transforming <var>promise</var> by a fulfillment handler that returns the result of running <a data-link-type="dfn" href="https://encoding.spec.whatwg.org/#utf-8-decode" id="ref-for-utf-8-decode">UTF-8 decode</a> on its first argument.</p> </ol> <p class="note" role="note"><span class="marker">Note:</span> This is different from the behavior of <code class="idl"><a data-link-type="idl" href="#dfn-readAsText" id="ref-for-dfn-readAsText">readAsText()</a></code> to align better with the behavior of <code class="idl"><a data-link-type="idl" href="https://fetch.spec.whatwg.org/#dom-body-text" id="ref-for-dom-body-text">Fetch’s text()</a></code>. Specifically this method will always use UTF-8 as encoding, while <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader③">FileReader</a></code> can use a different encoding depending on the blob’s type and passed in encoding name.</p> <h4 class="heading settled" data-level="3.3.4" id="arraybuffer-method-algo"><span class="secno">3.3.4. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dom-blob-arraybuffer" id="ref-for-dom-blob-arraybuffer①">arrayBuffer()</a></code> method</span><a class="self-link" href="#arraybuffer-method-algo"></a></h4> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="method" data-export id="dom-blob-arraybuffer"><code>arrayBuffer()</code></dfn> method, when invoked, must run these steps:</p> <ol> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream②">get stream</a> on <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this③">this</a>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader①">getting a reader</a> from <var>stream</var>. If that threw an exception, return a new promise rejected with that exception.</p> <li data-md> <p>Let <var>promise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes" id="ref-for-readablestreamdefaultreader-read-all-bytes①">reading all bytes</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Return the result of transforming <var>promise</var> by a fulfillment handler that returns a new <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer③">ArrayBuffer</a></code> whose contents are its first argument.</p> </ol> <h4 class="heading settled" data-level="3.3.5" id="bytes-method-algo"><span class="secno">3.3.5. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dom-blob-bytes" id="ref-for-dom-blob-bytes①">bytes()</a></code> method</span><a class="self-link" href="#bytes-method-algo"></a></h4> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="Blob" data-dfn-type="method" data-export id="dom-blob-bytes"><code>bytes()</code></dfn> method, when invoked, must run these steps:</p> <ol> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream③">get stream</a> on <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this④">this</a>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader②">getting a reader</a> from <var>stream</var>. If that threw an exception, return a new promise rejected with that exception.</p> <li data-md> <p>Let <var>promise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes" id="ref-for-readablestreamdefaultreader-read-all-bytes②">reading all bytes</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Return the result of transforming <var>promise</var> by a fulfillment handler that returns a new <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-Uint8Array" id="ref-for-idl-Uint8Array②">Uint8Array</a></code> wrapping an <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer④">ArrayBuffer</a></code> containing its first argument.</p> </ol> <h2 class="heading settled" data-level="4" id="file-section"><span class="secno">4. </span><span class="content">The File Interface</span><a class="self-link" href="#file-section"></a></h2> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file⑨">File</a></code> object is a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③③">Blob</a></code> object with a <code class="idl"><a data-link-type="idl" href="#dfn-name" id="ref-for-dfn-name">name</a></code> attribute, which is a string; it can be created within the web application via a constructor, or is a reference to a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte⑨">byte</a> sequence from a file from the underlying (OS) file system.</p> <p>If a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①⓪">File</a></code> object is a reference to a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte①⓪">byte</a> sequence originating from a file on disk, then its <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state③">snapshot state</a> should be set to the state of the file on disk at the time the <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①①">File</a></code> object is created.</p> <p class="note" role="note"><span class="marker">Note:</span> This is a non-trivial requirement to implement for user agents, and is thus not a <em>must</em> but a <em>should</em> <a data-link-type="biblio" href="#biblio-rfc2119" title="Key words for use in RFCs to Indicate Requirement Levels">[RFC2119]</a>. User agents should endeavor to have a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①②">File</a></code> object’s <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state④">snapshot state</a> set to the state of the underlying storage on disk at the time the reference is taken. If the file is modified on disk following the time a reference has been taken, the <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①③">File</a></code>'s <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state⑤">snapshot state</a> will differ from the state of the underlying storage. User agents may use modification time stamps and other mechanisms to maintain <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state⑥">snapshot state</a>, but this is left as an implementation detail.</p> <p>When a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①④">File</a></code> object refers to a file on disk, user agents must return the <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①①">type</a></code> of that file, and must follow the <dfn class="dfn-paneled" data-dfn-type="dfn" data-export id="file-type-guidelines">file type guidelines</dfn> below:</p> <ul> <li data-md> <p>User agents must return the <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①②">type</a></code> as an ASCII-encoded string in lower case, such that when it is converted to a corresponding byte sequence, it is a <a data-link-type="dfn" href="https://mimesniff.spec.whatwg.org/#parsable-mime-type" id="ref-for-parsable-mime-type②">parsable MIME type</a>, or the empty string – 0 bytes – if the type cannot be determined.</p> <li data-md> <p>When the file is of type <code>text/plain</code> user agents must NOT append a charset parameter to the <i>dictionary of parameters</i> portion of the media type <a data-link-type="biblio" href="#biblio-mimesniff" title="MIME Sniffing Standard">[MIMESNIFF]</a>.</p> <li data-md> <p>User agents must not attempt heuristic determination of encoding, including statistical methods.</p> </ul> <pre class="idl highlight def">[<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed" id="ref-for-Exposed①"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->), <a class="idl-code" data-link-type="extended-attribute" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable" id="ref-for-serializable①"><c- g>Serializable</c-></a>] <c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="dfn-file"><code><c- g>File</c-></code></dfn> : <a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob③④"><c- n>Blob</c-></a> { <dfn class="dfn-paneled idl-code" data-dfn-for="File" data-dfn-type="constructor" data-export data-lt="File(fileBits, fileName, options)|constructor(fileBits, fileName, options)|File(fileBits, fileName)|constructor(fileBits, fileName)" id="dom-file-file"><code><c- g>constructor</c-></code></dfn>(<a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#idl-sequence" id="ref-for-idl-sequence①"><c- b>sequence</c-></a><<a data-link-type="idl-name" href="#typedefdef-blobpart" id="ref-for-typedefdef-blobpart②"><c- n>BlobPart</c-></a>> <a class="idl-code" data-link-type="argument" href="#dfn-fileBits" id="ref-for-dfn-fileBits"><c- g>fileBits</c-></a>, <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString⑤"><c- b>USVString</c-></a> <a class="idl-code" data-link-type="argument" href="#dfn-fileName" id="ref-for-dfn-fileName"><c- g>fileName</c-></a>, <c- b>optional</c-> <a data-link-type="idl-name" href="#dfn-FilePropertyBag" id="ref-for-dfn-FilePropertyBag"><c- n>FilePropertyBag</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="File/File(fileBits, fileName, options), File/constructor(fileBits, fileName, options), File/File(fileBits, fileName), File/constructor(fileBits, fileName)" data-dfn-type="argument" data-export id="dom-file-file-filebits-filename-options-options"><code><c- g>options</c-></code></dfn> = {}); <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString④"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="DOMString" href="#dfn-name" id="ref-for-dfn-name①"><c- g>name</c-></a>; <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long" id="ref-for-idl-long-long②"><c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="long long" href="#dfn-lastModified" id="ref-for-dfn-lastModified"><c- g>lastModified</c-></a>; }; <c- b>dictionary</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="dictionary" data-export id="dfn-FilePropertyBag"><code><c- g>FilePropertyBag</c-></code></dfn> : <a data-link-type="idl-name" href="#dfn-BlobPropertyBag" id="ref-for-dfn-BlobPropertyBag③"><c- n>BlobPropertyBag</c-></a> { <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long" id="ref-for-idl-long-long③"><c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="long long" href="#dfn-FPdate" id="ref-for-dfn-FPdate"><c- g>lastModified</c-></a>; }; </pre> <p><code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①⑤">File</a></code> objects are <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects" id="ref-for-serializable-objects①">serializable objects</a>. Their <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps" id="ref-for-serialization-steps①">serialization steps</a>, given <var>value</var> and <var>serialized</var>, are:</p> <ol> <li data-md> <p>Set <var>serialized</var>.[[SnapshotState]] to <var>value</var>’s <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state⑦">snapshot state</a>.</p> <li data-md> <p>Set <var>serialized</var>.[[ByteSequence]] to <var>value</var>’s underlying byte sequence.</p> <li data-md> <p>Set <var>serialized</var>.[[Name]] to the value of <var>value</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-name" id="ref-for-dfn-name②">name</a></code> attribute.</p> <li data-md> <p>Set <var>serialized</var>.[[LastModified]] to the value of <var>value</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-lastModified" id="ref-for-dfn-lastModified①">lastModified</a></code> attribute.</p> </ol> <p>Their <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps" id="ref-for-deserialization-steps①">deserialization steps</a>, given <var>value</var> and <var>serialized</var>, are:</p> <ol> <li data-md> <p>Set <var>value</var>’s <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state⑧">snapshot state</a> to <var>serialized</var>.[[SnapshotState]].</p> <li data-md> <p>Set <var>value</var>’s underlying byte sequence to <var>serialized</var>.[[ByteSequence]].</p> <li data-md> <p>Initialize the value of <var>value</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-name" id="ref-for-dfn-name③">name</a></code> attribute to <var>serialized</var>.[[Name]].</p> <li data-md> <p>Initialize the value of <var>value</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-lastModified" id="ref-for-dfn-lastModified②">lastModified</a></code> attribute to <var>serialized</var>.[[LastModified]].</p> </ol> <h3 class="heading settled" data-level="4.1" id="file-constructor"><span class="secno">4.1. </span><span class="content">Constructor</span><a class="self-link" href="#file-constructor"></a></h3> <div class="algorithm" data-algorithm="file-constructor"> The <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①⑥">File</a></code> constructor is invoked with two or three parameters, depending on whether the optional dictionary parameter is used. When the <code class="idl"><a data-link-type="idl" href="#dom-file-file" id="ref-for-dom-file-file">File()</a></code> constructor is invoked, user agents must run the following steps: <ol> <li data-md> <p>Let <var>bytes</var> be the result of <a data-link-type="dfn" href="#process-blob-parts" id="ref-for-process-blob-parts①">processing blob parts</a> given <code class="idl"><a data-link-type="idl" href="#dfn-fileBits" id="ref-for-dfn-fileBits①">fileBits</a></code> and <code class="idl"><a data-link-type="idl" href="#dom-file-file-filebits-filename-options-options" id="ref-for-dom-file-file-filebits-filename-options-options">options</a></code>.</p> <li data-md> <p>Let <var>n</var> be the <code class="idl"><a data-link-type="idl" href="#dfn-fileName" id="ref-for-dfn-fileName①">fileName</a></code> argument to the constructor.</p> <p class="note" role="note"><span class="marker">Note:</span> Underlying OS filesystems use differing conventions for file name; with constructed files, mandating UTF-16 lessens ambiquity when file names are converted to <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte①①">byte</a> sequences.</p> <li data-md> <p>Process <code class="idl"><a data-link-type="idl" href="#dfn-FilePropertyBag" id="ref-for-dfn-FilePropertyBag①">FilePropertyBag</a></code> dictionary argument by running the following substeps:</p> <ol> <li data-md> <p>If the <code class="idl"><a data-link-type="idl" href="#dfn-BPtype" id="ref-for-dfn-BPtype③">type</a></code> member is provided and is not the empty string, let <var>t</var> be set to the <code class="idl"><a data-link-type="idl" href="#dfn-BPtype" id="ref-for-dfn-BPtype④">type</a></code> dictionary member. If <var>t</var> contains any characters outside the range U+0020 to U+007E, then set <var>t</var> to the empty string and return from these substeps.</p> <li data-md> <p>Convert every character in <var>t</var> to <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#ascii-lowercase" id="ref-for-ascii-lowercase②">ASCII lowercase</a>.</p> <li data-md> <p>If the <code class="idl"><a data-link-type="idl" href="#dfn-FPdate" id="ref-for-dfn-FPdate①">lastModified</a></code> member is provided, let <var>d</var> be set to the <code class="idl"><a data-link-type="idl" href="#dfn-FPdate" id="ref-for-dfn-FPdate②">lastModified</a></code> dictionary member. If it is not provided, set <var>d</var> to the current date and time represented as the number of milliseconds since the <a data-link-type="dfn" href="#UnixEpoch" id="ref-for-UnixEpoch">Unix Epoch</a> (which is the equivalent of <code>Date.now()</code> <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>).</p> <p class="note" role="note"><span class="marker">Note:</span> Since ECMA-262 <code class="idl"><a data-link-type="idl" href="http://tc39.github.io/ecma262/#sec-date-constructor" id="ref-for-sec-date-constructor">Date</a></code> objects convert to <code>long long</code> values representing the number of milliseconds since the <a data-link-type="dfn" href="#UnixEpoch" id="ref-for-UnixEpoch①">Unix Epoch</a>, the <code class="idl"><a data-link-type="idl" href="#dfn-FPdate" id="ref-for-dfn-FPdate③">lastModified</a></code> member could be a <code class="idl"><a data-link-type="idl" href="http://tc39.github.io/ecma262/#sec-date-constructor" id="ref-for-sec-date-constructor①">Date</a></code> object <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>.</p> </ol> <li data-md> <p>Return a new <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①⑦">File</a></code> object <var>F</var> such that:</p> <ol start="2"> <li data-md> <p><var>F</var> refers to the <var>bytes</var> <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte" id="ref-for-byte①②">byte</a> sequence.</p> <li data-md> <p><var>F</var>.<code class="idl"><a data-link-type="idl" href="#dfn-size" id="ref-for-dfn-size⑥">size</a></code> is set to the number of total bytes in <var>bytes</var>.</p> <li data-md> <p><var>F</var>.<code class="idl"><a data-link-type="idl" href="#dfn-name" id="ref-for-dfn-name④">name</a></code> is set to <var>n</var>.</p> <li data-md> <p><var>F</var>.<code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①③">type</a></code> is set to <var>t</var>.</p> <li data-md> <p><var>F</var>.<code class="idl"><a data-link-type="idl" href="#dfn-lastModified" id="ref-for-dfn-lastModified③">lastModified</a></code> is set to <var>d</var>.</p> </ol> </ol> </div> <h4 class="heading settled" data-level="4.1.1" id="file-constructor-params"><span class="secno">4.1.1. </span><span class="content">Constructor Parameters</span><a class="self-link" href="#file-constructor-params"></a></h4> <p>The <code class="idl"><a data-link-type="idl" href="#dom-file-file" id="ref-for-dom-file-file①">File()</a></code> constructor can be invoked with the parameters below:</p> <dl> <dt>A <dfn class="dfn-paneled idl-code" data-dfn-for="File/File(fileBits, fileName, options)" data-dfn-type="argument" data-export id="dfn-fileBits"><code>fileBits</code></dfn> <code>sequence</code> <dd> which takes any number of the following elements, and in any order: <ul> <li data-md> <p><code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#BufferSource" id="ref-for-BufferSource③">BufferSource</a></code> elements.</p> <li data-md> <p><code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③⑤">Blob</a></code> elements, which includes <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①⑧">File</a></code> elements.</p> <li data-md> <p><code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString⑥">USVString</a></code> elements.</p> </ul> <dt>A <dfn class="dfn-paneled idl-code" data-dfn-for="File/File(fileBits, fileName, options)" data-dfn-type="argument" data-export id="dfn-fileName"><code>fileName</code></dfn> parameter <dd>A <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-USVString" id="ref-for-idl-USVString⑦">USVString</a></code> parameter representing the name of the file; normative conditions for this constructor parameter can be found in <a href="#file-constructor">§ 4.1 Constructor</a>. <dt id="def-Properties"><a class="self-link" href="#def-Properties"></a>An optional <code class="idl"><a data-link-type="idl" href="#dfn-FilePropertyBag" id="ref-for-dfn-FilePropertyBag②">FilePropertyBag</a></code> dictionary <dd> which in addition to the <a href="#dfn-BlobPropertyBagMembers">members</a> of <code class="idl"><a data-link-type="idl" href="#dfn-BlobPropertyBag" id="ref-for-dfn-BlobPropertyBag④">BlobPropertyBag</a></code> takes one member: <ul> <li data-md> <p>An optional <dfn class="dfn-paneled idl-code" data-dfn-for="FilePropertyBag" data-dfn-type="dict-member" data-export id="dfn-FPdate"><code>lastModified</code></dfn> member, which must be a <code>long long</code>; normative conditions for this member are provided in <a href="#file-constructor">§ 4.1 Constructor</a>.</p> </ul> </dl> <h3 class="heading settled" data-level="4.2" id="file-attrs"><span class="secno">4.2. </span><span class="content">Attributes</span><a class="self-link" href="#file-attrs"></a></h3> <dl> <dt><dfn class="dfn-paneled idl-code" data-dfn-for="File" data-dfn-type="attribute" data-export id="dfn-name"><code>name</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString⑤">DOMString</a>, readonly</span> <dd>The name of the file. On getting, this must return the name of the file as a string. There are numerous file name variations and conventions used by different underlying OS file systems; this is merely the name of the file, without path information. On getting, if user agents cannot make this information available, they must return the empty string. If a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file①⑨">File</a></code> object is created using a constructor, further normative conditions for this attribute are found in <a href="#file-constructor">§ 4.1 Constructor</a>. <dt><dfn class="dfn-paneled idl-code" data-dfn-for="File" data-dfn-type="attribute" data-export id="dfn-lastModified"><code>lastModified</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#idl-long-long" id="ref-for-idl-long-long④">long long</a>, readonly</span> <dd>The last modified date of the file. On getting, if user agents can make this information available, this must return a <code>long long</code> set to the time the file was last modified as the number of milliseconds since the <a data-link-type="dfn" href="#UnixEpoch" id="ref-for-UnixEpoch②">Unix Epoch</a>. If the last modification date and time are not known, the attribute must return the current date and time as a <code>long long</code> representing the number of milliseconds since the <a data-link-type="dfn" href="#UnixEpoch" id="ref-for-UnixEpoch③">Unix Epoch</a>; this is equivalent to <code class="lang-javascript highlight">Date<c- p>.</c->now<c- p>()</c-></code> <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>. If a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②⓪">File</a></code> object is created using a constructor, further normative conditions for this attribute are found in <a href="#file-constructor">§ 4.1 Constructor</a>. </dl> <p>The <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②①">File</a></code> interface is available on objects that expose an attribute of type <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist①">FileList</a></code>; these objects are defined in HTML <a data-link-type="biblio" href="#biblio-html" title="HTML Standard">[HTML]</a>. The <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②②">File</a></code> interface, which inherits from <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③⑥">Blob</a></code>, is immutable, and thus represents file data that can be read into memory at the time a <a data-link-type="dfn" href="#readOperation" id="ref-for-readOperation">read operation</a> is initiated. User agents must process reads on files that no longer exist at the time of read as <a data-link-type="dfn" href="#file-error-read" id="ref-for-file-error-read">errors</a>, throwing a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notfounderror" id="ref-for-notfounderror">NotFoundError</a></code> exception if using a <code class="idl"><a data-link-type="idl" href="#dfn-FileReaderSync" id="ref-for-dfn-FileReaderSync①">FileReaderSync</a></code> on a Web Worker <a data-link-type="biblio" href="#biblio-workers" title="Web Workers">[Workers]</a> or firing an <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> event with the <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-filereader-error" id="ref-for-dom-filereader-error">error</a></code> attribute returning a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notfounderror" id="ref-for-notfounderror①">NotFoundError</a></code>.</p> <div class="example" id="example-c4014f19"> <a class="self-link" href="#example-c4014f19"></a> In the examples below, metadata from a file object is displayed meaningfully, and a file object is created with a name and a last modified date. <pre class="lang-javascript highlight"><c- a>var</c-> file <c- o>=</c-> document<c- p>.</c->getElementById<c- p>(</c-><c- u>"filePicker"</c-><c- p>).</c->files<c- p>[</c-><c- mf>0</c-><c- p>];</c-> <c- a>var</c-> date <c- o>=</c-> <c- ow>new</c-> Date<c- p>(</c->file<c- p>.</c->lastModified<c- p>);</c-> println<c- p>(</c-><c- u>"You selected the file "</c-> <c- o>+</c-> file<c- p>.</c->name <c- o>+</c-> <c- u>" which was modified on "</c-> <c- o>+</c-> date<c- p>.</c->toDateString<c- p>()</c-> <c- o>+</c-> <c- u>"."</c-><c- p>);</c-> <c- p>...</c-> <c- c1>// Generate a file with a specific last modified date</c-> <c- a>var</c-> d <c- o>=</c-> <c- ow>new</c-> Date<c- p>(</c-><c- mf>2013</c-><c- p>,</c-> <c- mf>12</c-><c- p>,</c-> <c- mf>5</c-><c- p>,</c-> <c- mf>16</c-><c- p>,</c-> <c- mf>23</c-><c- p>,</c-> <c- mf>45</c-><c- p>,</c-> <c- mf>600</c-><c- p>);</c-> <c- a>var</c-> generatedFile <c- o>=</c-> <c- ow>new</c-> File<c- p>([</c-><c- u>"Rough Draft ...."</c-><c- p>],</c-> <c- u>"Draft1.txt"</c-><c- p>,</c-> <c- p>{</c->type<c- o>:</c-> <c- u>"text/plain"</c-><c- p>,</c-> lastModified<c- o>:</c-> d<c- p>})</c-> <c- p>...</c-> </pre> </div> <h2 class="heading settled" data-level="5" id="filelist-section"><span class="secno">5. </span><span class="content">The FileList Interface</span><a class="self-link" href="#filelist-section"></a></h2> <p class="note" role="note"><span class="marker">Note:</span> The <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist②">FileList</a></code> interface should be considered "at risk" since the general trend on the Web Platform is to replace such interfaces with the <code class="idl"><a data-link-type="idl" href="http://tc39.github.io/ecma262/#sec-array-constructor" id="ref-for-sec-array-constructor">Array</a></code> platform object in ECMAScript <a data-link-type="biblio" href="#biblio-ecma-262" title="ECMAScript Language Specification">[ECMA-262]</a>. In particular, this means syntax of the sort <code class="lang-javascript highlight">filelist<c- p>.</c->item<c- p>(</c-><c- mf>0</c-><c- p>)</c-></code> is at risk; most other programmatic use of <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist③">FileList</a></code> is unlikely to be affected by the eventual migration to an <code class="idl"><a data-link-type="idl" href="http://tc39.github.io/ecma262/#sec-array-constructor" id="ref-for-sec-array-constructor①">Array</a></code> type.</p> <p>This interface is a list of <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②③">File</a></code> objects.</p> <pre class="idl highlight def">[<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed" id="ref-for-Exposed②"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->), <a class="idl-code" data-link-type="extended-attribute" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable" id="ref-for-serializable②"><c- g>Serializable</c-></a>] <c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="dfn-filelist"><code><c- g>FileList</c-></code></dfn> { <c- b>getter</c-> <a data-link-type="idl-name" href="#dfn-file" id="ref-for-dfn-file②④"><c- n>File</c-></a>? <a class="idl-code" data-link-type="method" href="#dfn-item" id="ref-for-dfn-item"><c- g>item</c-></a>(<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-long" id="ref-for-idl-unsigned-long"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="argument" href="#dfn-index" id="ref-for-dfn-index"><c- g>index</c-></a>); <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-long" id="ref-for-idl-unsigned-long①"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned long" href="#dfn-length" id="ref-for-dfn-length"><c- g>length</c-></a>; }; </pre> <p><code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist④">FileList</a></code> objects are <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects" id="ref-for-serializable-objects②">serializable objects</a>. Their <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps" id="ref-for-serialization-steps②">serialization steps</a>, given <var>value</var> and <var>serialized</var>, are:</p> <ol> <li data-md> <p>Set <var>serialized</var>.[[Files]] to an empty <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#list" id="ref-for-list">list</a>.</p> <li data-md> <p>For each <var>file</var> in <var>value</var>, append the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#sub-serialization" id="ref-for-sub-serialization">sub-serialization</a> of <var>file</var> to <var>serialized</var>.[[Files]].</p> </ol> <p>Their <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps" id="ref-for-deserialization-steps②">deserialization step</a>, given <var>serialized</var> and <var>value</var>, are:</p> <ol> <li data-md> <p><a data-link-type="dfn" href="https://infra.spec.whatwg.org/#list-iterate" id="ref-for-list-iterate">For each</a> <var>file</var> of <var>serialized</var>.[[Files]], add the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/structured-data.html#sub-deserialization" id="ref-for-sub-deserialization">sub-deserialization</a> of <var>file</var> to <var>value</var>.</p> </ol> <div class="example" id="example-47506268"> <a class="self-link" href="#example-47506268"></a> Sample usage typically involves DOM access to the <code><input type="file"></code> element within a form, and then accessing selected files. <pre class="lang-javascript highlight"><c- c1>// uploadData is a form element</c-> <c- c1>// fileChooser is input element of type 'file'</c-> <c- a>var</c-> file <c- o>=</c-> document<c- p>.</c->forms<c- p>[</c-><c- t>'uploadData'</c-><c- p>][</c-><c- t>'fileChooser'</c-><c- p>].</c->files<c- p>[</c-><c- mf>0</c-><c- p>];</c-> <c- c1>// alternative syntax can be</c-> <c- c1>// var file = document.forms['uploadData']['fileChooser'].files.item(0);</c-> <c- k>if</c-><c- p>(</c->file<c- p>)</c-> <c- p>{</c-> <c- c1>// Perform file ops</c-> <c- p>}</c-> </pre> </div> <h3 class="heading settled" data-level="5.1" id="attributes-filelist"><span class="secno">5.1. </span><span class="content">Attributes</span><a class="self-link" href="#attributes-filelist"></a></h3> <dl> <dt><dfn class="dfn-paneled idl-code" data-dfn-for="FileList" data-dfn-type="attribute" data-export id="dfn-length"><code>length</code></dfn>, <span> of type <a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#idl-unsigned-long" id="ref-for-idl-unsigned-long②">unsigned long</a>, readonly</span> <dd>must return the number of files in the <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist⑤">FileList</a></code> object. If there are no files, this attribute must return 0. </dl> <h3 class="heading settled" data-level="5.2" id="filelist-methods-params"><span class="secno">5.2. </span><span class="content">Methods and Parameters</span><a class="self-link" href="#filelist-methods-params"></a></h3> <dl> <dt><dfn class="dfn-paneled idl-code" data-dfn-for="FileList" data-dfn-type="method" data-export id="dfn-item"><code>item(index)</code></dfn> <dd> must return the <var>index</var>th <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②⑤">File</a></code> object in the <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist⑥">FileList</a></code>. If there is no <var>index</var>th <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②⑥">File</a></code> object in the <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist⑦">FileList</a></code>, then this method must return <code>null</code>. <p><dfn class="dfn-paneled idl-code" data-dfn-for="FileList/item(index)" data-dfn-type="argument" data-export id="dfn-index"><code>index</code></dfn> must be treated by user agents as value for the position of a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②⑦">File</a></code> object in the <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist⑧">FileList</a></code>, with 0 representing the first file. <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#dfn-supported-property-indices" id="ref-for-dfn-supported-property-indices">Supported property indices</a> are the numbers in the range zero to one less than the number of <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②⑧">File</a></code> objects represented by the <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist⑨">FileList</a></code> object. If there are no such <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file②⑨">File</a></code> objects, then there are no supported property indices.</p> </dl> <p class="note" role="note"><span class="marker">Note:</span> The <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/input.html#htmlinputelement" id="ref-for-htmlinputelement">HTMLInputElement</a></code> interface has a readonly attribute of type <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist①⓪">FileList</a></code>, which is what is being accessed in the above example. Other interfaces with a readonly attribute of type <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist①①">FileList</a></code> include the <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/dnd.html#datatransfer" id="ref-for-datatransfer①">DataTransfer</a></code> interface.</p> <h2 class="heading settled" data-level="6" id="reading-data-section"><span class="secno">6. </span><span class="content">Reading Data</span><a class="self-link" href="#reading-data-section"></a></h2> <h3 class="heading settled" data-level="6.1" id="blobreader-task-source"><span class="secno">6.1. </span><span class="content">The File Reading Task Source</span><a class="self-link" href="#blobreader-task-source"></a></h3> <p>This specification defines a new generic <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#task-source" id="ref-for-task-source">task source</a> called the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="fileReadingTaskSource">file reading task source</dfn>, which is used for all <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="ref-for-queue-a-task">tasks that are queued</a> in this specification to read byte sequences associated with <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob③⑦">Blob</a></code> and <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③⓪">File</a></code> objects. It is to be used for features that trigger in response to asynchronously reading binary data.</p> <h3 class="heading settled" data-level="6.2" id="APIASynch"><span class="secno">6.2. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader④">FileReader</a></code> API</span><a class="self-link" href="#APIASynch"></a></h3> <pre class="idl highlight def">[<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed" id="ref-for-Exposed③"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->)] <c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="dfn-filereader"><code><c- g>FileReader</c-></code></dfn>: <a data-link-type="idl-name" href="https://dom.spec.whatwg.org/#eventtarget" id="ref-for-eventtarget"><c- n>EventTarget</c-></a> { <a class="idl-code" data-link-type="constructor" href="#filereaderConstrctr" id="ref-for-filereaderConstrctr"><c- g>constructor</c-></a>(); // async read methods <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined" id="ref-for-idl-undefined"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsArrayBuffer" id="ref-for-dfn-readAsArrayBuffer"><c- g>readAsArrayBuffer</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob③⑧"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader/readAsArrayBuffer(blob)" data-dfn-type="argument" data-export id="dom-filereader-readasarraybuffer-blob-blob"><code><c- g>blob</c-></code></dfn>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined" id="ref-for-idl-undefined①"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsBinaryString" id="ref-for-dfn-readAsBinaryString"><c- g>readAsBinaryString</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob③⑨"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader/readAsBinaryString(blob)" data-dfn-type="argument" data-export id="dom-filereader-readasbinarystring-blob-blob"><code><c- g>blob</c-></code></dfn>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined" id="ref-for-idl-undefined②"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsText" id="ref-for-dfn-readAsText①"><c- g>readAsText</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob④⓪"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader/readAsText(blob, encoding), FileReader/readAsText(blob)" data-dfn-type="argument" data-export id="dom-filereader-readastext-blob-encoding-blob"><code><c- g>blob</c-></code></dfn>, <c- b>optional</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString⑥"><c- b>DOMString</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader/readAsText(blob, encoding), FileReader/readAsText(blob)" data-dfn-type="argument" data-export id="dom-filereader-readastext-blob-encoding-encoding"><code><c- g>encoding</c-></code></dfn>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined" id="ref-for-idl-undefined③"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsDataURL" id="ref-for-dfn-readAsDataURL"><c- g>readAsDataURL</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob④①"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader/readAsDataURL(blob)" data-dfn-type="argument" data-export id="dom-filereader-readasdataurl-blob-blob"><code><c- g>blob</c-></code></dfn>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined" id="ref-for-idl-undefined④"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-abort" id="ref-for-dfn-abort①"><c- g>abort</c-></a>(); // states <c- b>const</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short" id="ref-for-idl-unsigned-short"><c- b>unsigned</c-> <c- b>short</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="const" data-export id="dom-filereader-empty"><code><c- g>EMPTY</c-></code></dfn> = 0; <c- b>const</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short" id="ref-for-idl-unsigned-short①"><c- b>unsigned</c-> <c- b>short</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="const" data-export id="dom-filereader-loading"><code><c- g>LOADING</c-></code></dfn> = 1; <c- b>const</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short" id="ref-for-idl-unsigned-short②"><c- b>unsigned</c-> <c- b>short</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="const" data-export id="dom-filereader-done"><code><c- g>DONE</c-></code></dfn> = 2; <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short" id="ref-for-idl-unsigned-short③"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned short" href="#dom-filereader-readystate" id="ref-for-dom-filereader-readystate"><c- g>readyState</c-></a>; // File or Blob data <c- b>readonly</c-> <c- b>attribute</c-> (<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString⑦"><c- b>DOMString</c-></a> <c- b>or</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer⑤"><c- b>ArrayBuffer</c-></a>)? <a class="idl-code" data-link-type="attribute" data-readonly data-type="(DOMString or ArrayBuffer)?" href="#dom-filereader-result" id="ref-for-dom-filereader-result"><c- g>result</c-></a>; <c- b>readonly</c-> <c- b>attribute</c-> <a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#idl-DOMException" id="ref-for-idl-DOMException"><c- n>DOMException</c-></a>? <a class="idl-code" data-link-type="attribute" data-readonly data-type="DOMException?" href="#dom-filereader-error" id="ref-for-dom-filereader-error①"><c- g>error</c-></a>; // event handler content attributes <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onloadstart" id="ref-for-dfn-onloadstart"><c- g>onloadstart</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler①"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onprogress" id="ref-for-dfn-onprogress"><c- g>onprogress</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler②"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onload" id="ref-for-dfn-onload"><c- g>onload</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler③"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onabort" id="ref-for-dfn-onabort"><c- g>onabort</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler④"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onerror" id="ref-for-dfn-onerror"><c- g>onerror</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler" id="ref-for-eventhandler⑤"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onloadend" id="ref-for-dfn-onloadend"><c- g>onloadend</c-></a>; }; </pre> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader⑤">FileReader</a></code> has an associated <dfn class="dfn-paneled" data-dfn-for="FileReader" data-dfn-type="dfn" data-noexport id="filereader-state">state</dfn>, that is <code>"empty"</code>, <code>"loading"</code>, or <code>"done"</code>. It is initially <code>"empty"</code>.</p> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader⑥">FileReader</a></code> has an associated <dfn class="dfn-paneled" data-dfn-for="FileReader" data-dfn-type="dfn" data-noexport id="filereader-result">result</dfn> (<code>null</code>, a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString⑧">DOMString</a></code> or an <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer⑥">ArrayBuffer</a></code>). It is initially <code>null</code>.</p> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader⑦">FileReader</a></code> has an associated <dfn class="dfn-paneled" data-dfn-for="FileReader" data-dfn-type="dfn" data-noexport id="filereader-error">error</dfn> (<code>null</code> or a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-DOMException" id="ref-for-idl-DOMException①">DOMException</a></code>). It is initially <code>null</code>.</p> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="constructor" data-export data-lt="FileReader()|constructor()" id="filereaderConstrctr"><code>FileReader()</code></dfn> constructor, when invoked, must return a new <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader⑧">FileReader</a></code> object.</p> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dom-filereader-readystate"><code>readyState</code></dfn> attribute’s getter, when invoked, switches on <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this⑤">this</a>'s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state">state</a> and runs the associated step:</p> <dl> <dt data-md><code>"empty"</code> <dd data-md> <p>Return <code class="idl"><a data-link-type="idl" href="#dom-filereader-empty" id="ref-for-dom-filereader-empty">EMPTY</a></code></p> <dt data-md><code>"loading"</code> <dd data-md> <p>Return <code class="idl"><a data-link-type="idl" href="#dom-filereader-loading" id="ref-for-dom-filereader-loading">LOADING</a></code></p> <dt data-md><code>"done"</code> <dd data-md> <p>Return <code class="idl"><a data-link-type="idl" href="#dom-filereader-done" id="ref-for-dom-filereader-done">DONE</a></code></p> </dl> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dom-filereader-result"><code>result</code></dfn> attribute’s getter, when invoked, must return <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this⑥">this</a>'s <a data-link-type="dfn" href="#filereader-result" id="ref-for-filereader-result">result</a>.</p> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dom-filereader-error"><code>error</code></dfn> attribute’s getter, when invoked, must return <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this⑦">this</a>'s <a data-link-type="dfn" href="#filereader-error" id="ref-for-filereader-error">error</a>.</p> <div class="algorithm" data-algorithm="read operation"> A <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader⑨">FileReader</a></code> <var>fr</var> has an associated <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="readOperation">read operation</dfn> algorithm, which given <var>blob</var>, a <var>type</var> and an optional <var>encodingName</var>, runs the following steps: <ol> <li data-md> <p>If <var>fr</var>’s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state①">state</a> is <code>"loading"</code>, throw an <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#invalidstateerror" id="ref-for-invalidstateerror">InvalidStateError</a></code> <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-DOMException" id="ref-for-idl-DOMException②">DOMException</a></code>.</p> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state②">state</a> to <code>"loading"</code>.</p> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-result" id="ref-for-filereader-result①">result</a> to <code>null</code>.</p> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-error" id="ref-for-filereader-error①">error</a> to <code>null</code>.</p> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream④">get stream</a> on <var>blob</var>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader③">getting a reader</a> from <var>stream</var>.</p> <li data-md> <p>Let <var>bytes</var> be an empty <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte-sequence" id="ref-for-byte-sequence①">byte sequence</a>.</p> <li data-md> <p>Let <var>chunkPromise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-a-chunk" id="ref-for-readablestreamdefaultreader-read-a-chunk">reading a chunk</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Let <var>isFirstChunk</var> be true.</p> <li data-md> <p><a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel" id="ref-for-in-parallel①">In parallel</a>, while true:</p> <ol> <li data-md> <p>Wait for <var>chunkPromise</var> to be fulfilled or rejected.</p> <li data-md> <p>If <var>chunkPromise</var> is fulfilled, and <var>isFirstChunk</var> is true, <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="ref-for-queue-a-task①">queue a task</a> to <a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event">fire a progress event</a> called <code class="idl"><a data-link-type="idl" href="#dfn-loadstart-event" id="ref-for-dfn-loadstart-event">loadstart</a></code> at <var>fr</var>.</p> <p class="issue" id="issue-0504580b"><a class="self-link" href="#issue-0504580b"></a> We might change <code class="idl"><a data-link-type="idl" href="#dfn-loadstart-event" id="ref-for-dfn-loadstart-event①">loadstart</a></code> to be dispatched synchronously, to align with XMLHttpRequest behavior. <a href="https://github.com/w3c/FileAPI/issues/119">[Issue #119]</a></p> <li data-md> <p>Set <var>isFirstChunk</var> to false.</p> <li data-md> <p>If <var>chunkPromise</var> is fulfilled with an object whose <code>done</code> property is false and whose <code>value</code> property is a <code>Uint8Array</code> object, run these steps:</p> <ol> <li data-md> <p>Let <var>bs</var> be the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte-sequence" id="ref-for-byte-sequence②">byte sequence</a> represented by the <code>Uint8Array</code> object.</p> <li data-md> <p>Append <var>bs</var> to <var>bytes</var>.</p> <li data-md> <p>If roughly 50ms have passed since these steps were last invoked, <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="ref-for-queue-a-task②">queue a task</a> to <a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event①">fire a progress event</a> called <code class="idl"><a data-link-type="idl" href="#dfn-progress-event" id="ref-for-dfn-progress-event">progress</a></code> at <var>fr</var>.</p> <li data-md> <p>Set <var>chunkPromise</var> to the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-a-chunk" id="ref-for-readablestreamdefaultreader-read-a-chunk①">reading a chunk</a> from <var>stream</var> with <var>reader</var>.</p> </ol> <li data-md> <p>Otherwise, if <var>chunkPromise</var> is fulfilled with an object whose <code>done</code> property is true, <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="ref-for-queue-a-task③">queue a task</a> to run the following steps and abort this algorithm:</p> <ol> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state③">state</a> to <code>"done"</code>.</p> <li data-md> <p>Let <var>result</var> be the result of <a data-link-type="dfn" href="#blob-package-data" id="ref-for-blob-package-data①">package data</a> given <var>bytes</var>, <var>type</var>, <var>blob</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①④">type</a></code>, and <var>encodingName</var>.</p> <li data-md> <p>If <a data-link-type="dfn" href="#blob-package-data" id="ref-for-blob-package-data②">package data</a> threw an exception <var>error</var>:</p> <ol> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-error" id="ref-for-filereader-error②">error</a> to <var>error</var>.</p> <li data-md> <p><a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event②">Fire a progress event</a> called <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> at <var>fr</var>.</p> </ol> <li data-md> <p>Else:</p> <ol> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-result" id="ref-for-filereader-result②">result</a> to <var>result</var>.</p> <li data-md> <p><a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event③">Fire a progress event</a> called <code class="idl"><a data-link-type="idl" href="#dfn-load-event" id="ref-for-dfn-load-event">load</a></code> at the <var>fr</var>.</p> </ol> <li data-md> <p>If <var>fr</var>’s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state④">state</a> is not <code>"loading"</code>, <a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event④">fire a progress event</a> called <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event">loadend</a></code> at the <var>fr</var>.</p> <p class="note" role="note"><span class="marker">Note:</span> Event handler for the <code class="idl"><a data-link-type="idl" href="#dfn-load-event" id="ref-for-dfn-load-event①">load</a></code> or <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> events could have started another load, if that happens the <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event①">loadend</a></code> event for this load is not fired.</p> </ol> <li data-md> <p>Otherwise, if <var>chunkPromise</var> is rejected with an error <var>error</var>, <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="ref-for-queue-a-task④">queue a task</a> to run the following steps and abort this algorithm:</p> <ol> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state⑤">state</a> to <code>"done"</code>.</p> <li data-md> <p>Set <var>fr</var>’s <a data-link-type="dfn" href="#filereader-error" id="ref-for-filereader-error③">error</a> to <var>error</var>.</p> <li data-md> <p><a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event⑤">Fire a progress event</a> called <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> at <var>fr</var>.</p> <li data-md> <p>If <var>fr</var>’s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state⑥">state</a> is not <code>"loading"</code>, <a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event⑥">fire a progress event</a> called <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event②">loadend</a></code> at <var>fr</var>.</p> <p class="note" role="note"><span class="marker">Note:</span> Event handler for the <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> event could have started another load, if that happens the <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event③">loadend</a></code> event for this load is not fired.</p> </ol> </ol> </ol> <p>Use the <a data-link-type="dfn" href="#fileReadingTaskSource" id="ref-for-fileReadingTaskSource①">file reading task source</a> for all these tasks.</p> </div> <h4 class="heading settled" data-level="6.2.1" id="event-handler-attributes-section"><span class="secno">6.2.1. </span><span class="content">Event Handler Content Attributes</span><a class="self-link" href="#event-handler-attributes-section"></a></h4> <p>The following are the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-content-attributes" id="ref-for-event-handler-content-attributes">event handler content attributes</a> (and their corresponding <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type" id="ref-for-event-handler-event-type">event handler event types</a>) that user agents must support on <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①⓪">FileReader</a></code> as DOM attributes:</p> <table> <thead> <tr> <th><a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-content-attributes" id="ref-for-event-handler-content-attributes①">event handler content attribute</a> <th><a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type" id="ref-for-event-handler-event-type①">event handler event type</a> <tbody> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dfn-onloadstart"><code>onloadstart</code></dfn> <td><code class="idl"><a data-link-type="idl" href="#dfn-loadstart-event" id="ref-for-dfn-loadstart-event②">loadstart</a></code> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dfn-onprogress"><code>onprogress</code></dfn> <td><code class="idl"><a data-link-type="idl" href="#dfn-progress-event" id="ref-for-dfn-progress-event①">progress</a></code> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dfn-onabort"><code>onabort</code></dfn> <td><code class="idl"><a data-link-type="idl">abort</a></code> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dfn-onerror"><code>onerror</code></dfn> <td><code class="idl"><a class="idl-code" data-link-type="event">error</a></code> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dfn-onload"><code>onload</code></dfn> <td><code class="idl"><a data-link-type="idl" href="#dfn-load-event" id="ref-for-dfn-load-event②">load</a></code> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="attribute" data-export id="dfn-onloadend"><code>onloadend</code></dfn> <td><code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event④">loadend</a></code> </table> <h4 class="heading settled" data-level="6.2.2" id="blobreader-state"><span class="secno">6.2.2. </span><span class="content">FileReader States</span><a class="self-link" href="#blobreader-state"></a></h4> <div class="note domintro" role="note"> The <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①①">FileReader</a></code> object can be in one of 3 states. The <code class="idl"><a data-link-type="idl" href="#dom-filereader-readystate" id="ref-for-dom-filereader-readystate①">readyState</a></code> attribute tells you in which state the object is: <dl> <dt data-md><code class="idl"><a data-link-type="idl" href="#dom-filereader-empty" id="ref-for-dom-filereader-empty①">EMPTY</a></code> (numeric value 0) <dd data-md> <p>The <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①②">FileReader</a></code> object has been constructed, and there are no pending reads. None of the <a data-link-type="dfn" href="#read-method" id="ref-for-read-method①">read methods</a> have been called. This is the default state of a newly minted <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①③">FileReader</a></code> object, until one of the <a data-link-type="dfn" href="#read-method" id="ref-for-read-method②">read methods</a> have been called on it.</p> <dt data-md><code class="idl"><a data-link-type="idl" href="#dom-filereader-loading" id="ref-for-dom-filereader-loading①">LOADING</a></code> (numeric value 1) <dd data-md> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③①">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob④②">Blob</a></code> is being read. One of the <a data-link-type="dfn" href="#read-method" id="ref-for-read-method③">read methods</a> is being processed, and no error has occurred during the read.</p> <dt data-md><code class="idl"><a data-link-type="idl" href="#dom-filereader-done" id="ref-for-dom-filereader-done①">DONE</a></code> (numeric value 2) <dd data-md> <p>The entire <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③②">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob④③">Blob</a></code> has been read into memory, OR a <a data-link-type="dfn" href="#file-error-read" id="ref-for-file-error-read①">file read error</a> occurred, OR the read was aborted using <code class="idl"><a data-link-type="idl" href="#dfn-abort" id="ref-for-dfn-abort②">abort()</a></code>. The <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①④">FileReader</a></code> is no longer reading a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③③">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob④④">Blob</a></code>. If <code class="idl"><a data-link-type="idl" href="#dom-filereader-readystate" id="ref-for-dom-filereader-readystate②">readyState</a></code> is set to <code class="idl"><a data-link-type="idl" href="#dom-filereader-done" id="ref-for-dom-filereader-done②">DONE</a></code> it means at least one of the <a data-link-type="dfn" href="#read-method" id="ref-for-read-method④">read methods</a> have been called on this <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①⑤">FileReader</a></code>.</p> </dl> </div> <h4 class="heading settled" data-level="6.2.3" id="reading-a-file"><span class="secno">6.2.3. </span><span class="content">Reading a File or Blob</span><a class="self-link" href="#reading-a-file"></a></h4> <p>The <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①⑥">FileReader</a></code> interface makes available several <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="asynchronous read method" data-noexport id="asynchronous-read-methods">asynchronous read methods</dfn>—<code class="idl"><a data-link-type="idl" href="#dfn-readAsArrayBuffer" id="ref-for-dfn-readAsArrayBuffer①">readAsArrayBuffer()</a></code>, <code class="idl"><a data-link-type="idl" href="#dfn-readAsBinaryString" id="ref-for-dfn-readAsBinaryString①">readAsBinaryString()</a></code>, <code class="idl"><a data-link-type="idl" href="#dfn-readAsText" id="ref-for-dfn-readAsText②">readAsText()</a></code> and <code class="idl"><a data-link-type="idl" href="#dfn-readAsDataURL" id="ref-for-dfn-readAsDataURL①">readAsDataURL()</a></code>, which read files into memory.</p> <p class="note" role="note"><span class="marker">Note:</span> If multiple concurrent read methods are called on the same <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①⑦">FileReader</a></code> object, user agents throw an <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#invalidstateerror" id="ref-for-invalidstateerror①">InvalidStateError</a></code> on any of the read methods that occur when <code class="idl"><a data-link-type="idl" href="#dom-filereader-readystate" id="ref-for-dom-filereader-readystate③">readyState</a></code> = <code class="idl"><a data-link-type="idl" href="#dom-filereader-loading" id="ref-for-dom-filereader-loading②">LOADING</a></code>.</p> <p>(<code class="idl"><a data-link-type="idl" href="#dfn-FileReaderSync" id="ref-for-dfn-FileReaderSync②">FileReaderSync</a></code> makes available several <a data-link-type="dfn" href="#read-method-sync" id="ref-for-read-method-sync">synchronous read methods</a>. Collectively, the sync and async read methods of <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①⑧">FileReader</a></code> and <code class="idl"><a data-link-type="idl" href="#dfn-FileReaderSync" id="ref-for-dfn-FileReaderSync③">FileReaderSync</a></code> are referred to as just <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="read method" data-noexport id="read-method">read methods</dfn>.)</p> <h5 class="heading settled" data-level="6.2.3.1" id="readAsDataURL"><span class="secno">6.2.3.1. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsDataURL" id="ref-for-dfn-readAsDataURL②">readAsDataURL()</a></code> method</span><a class="self-link" href="#readAsDataURL"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="method" data-export id="dfn-readAsDataURL"><code>readAsDataURL(<var>blob</var>)</code></dfn> method, when invoked, must initiate a <a data-link-type="dfn" href="#readOperation" id="ref-for-readOperation①">read operation</a> for <var>blob</var> with <em>DataURL</em>.</p> <h5 class="heading settled" data-level="6.2.3.2" id="readAsDataText"><span class="secno">6.2.3.2. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsText" id="ref-for-dfn-readAsText③">readAsText()</a></code> method</span><a class="self-link" href="#readAsDataText"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="method" data-export data-lt="readAsText(blob, encoding)|readAsText(blob)" id="dfn-readAsText"><code>readAsText(<var>blob</var>, <var>encoding</var>)</code></dfn> method, when invoked, must initiate a <a data-link-type="dfn" href="#readOperation" id="ref-for-readOperation②">read operation</a> for <var>blob</var> with <em>Text</em> and <var>encoding</var>.</p> <h5 class="heading settled" data-level="6.2.3.3" id="readAsArrayBuffer"><span class="secno">6.2.3.3. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsArrayBuffer" id="ref-for-dfn-readAsArrayBuffer②">readAsArrayBuffer()</a></code></span><a class="self-link" href="#readAsArrayBuffer"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="method" data-export id="dfn-readAsArrayBuffer"><code>readAsArrayBuffer(<var>blob</var>)</code></dfn> method, when invoked, must initiate a <a data-link-type="dfn" href="#readOperation" id="ref-for-readOperation③">read operation</a> for <var>blob</var> with <em>ArrayBuffer</em>.</p> <h5 class="heading settled" data-level="6.2.3.4" id="readAsBinaryString"><span class="secno">6.2.3.4. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsBinaryString" id="ref-for-dfn-readAsBinaryString②">readAsBinaryString()</a></code> method</span><a class="self-link" href="#readAsBinaryString"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="method" data-export id="dfn-readAsBinaryString"><code>readAsBinaryString(<var>blob</var>)</code></dfn> method, when invoked, must initiate a <a data-link-type="dfn" href="#readOperation" id="ref-for-readOperation④">read operation</a> for <var>blob</var> with <em>BinaryString</em>.</p> <p class="note" role="note"><span class="marker">Note:</span> The use of <code class="idl"><a data-link-type="idl" href="#dfn-readAsArrayBuffer" id="ref-for-dfn-readAsArrayBuffer③">readAsArrayBuffer()</a></code> is preferred over <code class="idl"><a data-link-type="idl" href="#dfn-readAsBinaryString" id="ref-for-dfn-readAsBinaryString③">readAsBinaryString()</a></code>, which is provided for backwards compatibility.</p> <h5 class="heading settled" data-level="6.2.3.5" id="abort"><span class="secno">6.2.3.5. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-abort" id="ref-for-dfn-abort③">abort()</a></code> method</span><a class="self-link" href="#abort"></a></h5> <p>When the <dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="method" data-export id="dfn-abort"><code>abort()</code></dfn> method is called, the user agent must run the steps below:</p> <ol> <li data-md> <p>If <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this⑧">this</a>'s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state⑦">state</a> is <code>"empty"</code> or if <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this⑨">this</a>'s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state⑧">state</a> is <code>"done"</code> set <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①⓪">this</a>'s <a data-link-type="dfn" href="#filereader-result" id="ref-for-filereader-result③">result</a> to <code>null</code> and <a data-link-type="dfn" href="#terminate-an-algorithm" id="ref-for-terminate-an-algorithm">terminate this algorithm</a>.</p> <li data-md> <p>If <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①①">this</a>'s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state⑨">state</a> is <code>"loading"</code> set <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①②">this</a>'s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state①⓪">state</a> to <code>"done"</code> and set <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①③">this</a>'s <a data-link-type="dfn" href="#filereader-result" id="ref-for-filereader-result④">result</a> to <code>null</code>.</p> <li data-md> <p>If there are any <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-task" id="ref-for-concept-task">tasks</a> from <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①④">this</a> on the <a data-link-type="dfn" href="#fileReadingTaskSource" id="ref-for-fileReadingTaskSource②">file reading task source</a> in an affiliated <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task" id="ref-for-queue-a-task⑤">task queue</a>, then remove those <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-task" id="ref-for-concept-task①">tasks</a> from that task queue.</p> <li data-md> <p><a data-link-type="dfn" href="#terminate-an-algorithm" id="ref-for-terminate-an-algorithm①">Terminate the algorithm</a> for the <a data-link-type="dfn" href="#read-method" id="ref-for-read-method⑤">read method</a> being processed.</p> <li data-md> <p><a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event⑦">Fire a progress event</a> called <code class="idl"><a data-link-type="idl">abort</a></code> at <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①⑤">this</a>.</p> <li data-md> <p>If <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①⑥">this</a>'s <a data-link-type="dfn" href="#filereader-state" id="ref-for-filereader-state①①">state</a> is not <code>"loading"</code>, <a data-link-type="dfn" href="#fire-a-progress-event" id="ref-for-fire-a-progress-event⑧">fire a progress event</a> called <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event⑤">loadend</a></code> at <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#this" id="ref-for-this①⑦">this</a>.</p> </ol> <h3 class="heading settled" data-level="6.3" id="packaging-data"><span class="secno">6.3. </span><span class="content">Packaging data</span><a class="self-link" href="#packaging-data"></a></h3> <div class="algorithm" data-algorithm="package data"> A <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob④⑤">Blob</a></code> has an associated <dfn class="dfn-paneled" data-dfn-for="Blob" data-dfn-type="dfn" data-noexport id="blob-package-data">package data</dfn> algorithm, given <var>bytes</var>, a <var>type</var>, a optional <var>mimeType</var>, and a optional <var>encodingName</var>, which switches on <var>type</var> and runs the associated steps: <dl> <dt data-md>DataURL <dd data-md> <p>Return <var>bytes</var> as a DataURL <a data-link-type="biblio" href="#biblio-rfc2397" title="The "data" URL scheme">[RFC2397]</a> subject to the considerations below:</p> <ul> <li data-md> <p>Use <var>mimeType</var> as part of the Data URL if it is available in keeping with the Data URL specification <a data-link-type="biblio" href="#biblio-rfc2397" title="The "data" URL scheme">[RFC2397]</a>.</p> <li data-md> <p>If <var>mimeType</var> is not available return a Data URL without a media-type. <a data-link-type="biblio" href="#biblio-rfc2397" title="The "data" URL scheme">[RFC2397]</a>.</p> </ul> <p class="issue" id="issue-f80bda5b"><a class="self-link" href="#issue-f80bda5b"></a> Better specify how the DataURL is generated. <a href="https://github.com/w3c/FileAPI/issues/104">[Issue #104]</a></p> <dt data-md>Text <dd data-md> <ol> <li data-md> <p>Let <var>encoding</var> be failure.</p> <li data-md> <p>If the <var>encodingName</var> is present, set <var>encoding</var> to the result of <a data-link-type="dfn" href="https://encoding.spec.whatwg.org/#concept-encoding-get" id="ref-for-concept-encoding-get">getting an encoding</a> from <var>encodingName</var>.</p> <li data-md> <p>If <var>encoding</var> is failure, and <var>mimeType</var> is present:</p> <ol> <li data-md> <p>Let <var>type</var> be the result of <a data-link-type="dfn" href="https://mimesniff.spec.whatwg.org/#parse-a-mime-type" id="ref-for-parse-a-mime-type①">parse a MIME type</a> given <var>mimeType</var>.</p> <li data-md> <p>If <var>type</var> is not failure, set <var>encoding</var> to the result of <a data-link-type="dfn" href="https://encoding.spec.whatwg.org/#concept-encoding-get" id="ref-for-concept-encoding-get①">getting an encoding</a> from <var>type</var>’s <a data-link-type="dfn" href="https://mimesniff.spec.whatwg.org/#parameters" id="ref-for-parameters">parameters</a>[<code>"charset"</code>].</p> <div class="example" id="example-161c55fc"><a class="self-link" href="#example-161c55fc"></a> If <code>blob</code> has a <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①⑤">type</a></code> attribute of <code>text/plain;charset=utf-8</code> then <a data-link-type="dfn" href="https://encoding.spec.whatwg.org/#concept-encoding-get" id="ref-for-concept-encoding-get②">getting an encoding</a> is run using <code>"utf-8"</code> as the label. Note that user agents must parse and extract the portion of the Charset Parameter that constitutes a <em>label</em> of an encoding. </div> </ol> <li data-md> <p>If <var>encoding</var> is failure, then set <var>encoding</var> to <a data-link-type="dfn" href="https://encoding.spec.whatwg.org/#utf-8" id="ref-for-utf-8">UTF-8</a>.</p> <li data-md> <p><a data-link-type="dfn" href="https://encoding.spec.whatwg.org/#decode" id="ref-for-decode">Decode</a> <var>bytes</var> using fallback encoding <var>encoding</var>, and return the result.</p> </ol> <dt data-md>ArrayBuffer <dd data-md> <p>Return a new <code>ArrayBuffer</code> whose contents are <var>bytes</var>.</p> <dt data-md>BinaryString <dd data-md> <p>Return <var>bytes</var> as a binary string, in which every byte is represented by a code unit of equal value [0..255].</p> </dl> </div> <h3 class="heading settled" data-level="6.4" id="events"><span class="secno">6.4. </span><span class="content">Events</span><a class="self-link" href="#events"></a></h3> <p>The <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader①⑨">FileReader</a></code> object must be the event target for all events in this specification.</p> <p>When this specification says to <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="fire-a-progress-event">fire a progress event</dfn> <i>called e</i> (for some <code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#progressevent" id="ref-for-progressevent">ProgressEvent</a></code> <code>e</code> at a given <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader②⓪">FileReader</a></code> <code>reader</code>), the following are normative:</p> <ul> <li data-md> <p>The progress event <code>e</code> does not bubble. <code>e.bubbles</code> must be false <a data-link-type="biblio" href="#biblio-dom" title="DOM Standard">[DOM]</a></p> <li data-md> <p>The progress event <code>e</code> is NOT cancelable. <code>e.cancelable</code> must be false <a data-link-type="biblio" href="#biblio-dom" title="DOM Standard">[DOM]</a></p> </ul> <h4 class="heading settled" data-level="6.4.1" id="event-summary"><span class="secno">6.4.1. </span><span class="content">Event Summary</span><a class="self-link" href="#event-summary"></a></h4> <p>The following are the events that are <a data-link-type="dfn" href="https://dom.spec.whatwg.org/#concept-event-fire" id="ref-for-concept-event-fire">fired</a> at <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader②①">FileReader</a></code> objects.</p> <table id="event-summary-table"> <thead> <tr> <th>Event name <th>Interface <th>Fired when… <tbody> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="event" data-export id="dfn-loadstart-event"><code>loadstart</code></dfn> <td><code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#progressevent" id="ref-for-progressevent①">ProgressEvent</a></code> <td>When the read starts. <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="event" data-export id="dfn-progress-event"><code>progress</code></dfn> <td><code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#progressevent" id="ref-for-progressevent②">ProgressEvent</a></code> <td>While reading (and decoding) <code>blob</code> <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="event" data-export id="dfn-abort-event"><code>abort</code></dfn> <td><code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#progressevent" id="ref-for-progressevent③">ProgressEvent</a></code> <td>When the read has been aborted. For instance, by invoking the <code class="idl"><a data-link-type="idl" href="#dfn-abort" id="ref-for-dfn-abort④">abort()</a></code> method. <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="event" data-export id="dfn-error-event"><code>error</code></dfn> <td><code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#progressevent" id="ref-for-progressevent④">ProgressEvent</a></code> <td>When the read has failed (see <a data-link-type="dfn" href="#file-error-read" id="ref-for-file-error-read②">file read errors</a>). <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="event" data-export id="dfn-load-event"><code>load</code></dfn> <td><code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#progressevent" id="ref-for-progressevent⑤">ProgressEvent</a></code> <td>When the read has successfully completed. <tr> <td><dfn class="dfn-paneled idl-code" data-dfn-for="FileReader" data-dfn-type="event" data-export id="dfn-loadend-event"><code>loadend</code></dfn> <td><code class="idl"><a data-link-type="idl" href="https://xhr.spec.whatwg.org/#progressevent" id="ref-for-progressevent⑥">ProgressEvent</a></code> <td>When the request has completed (either in success or failure). </table> <h4 class="heading settled" data-level="6.4.2" id="eventInvariants"><span class="secno">6.4.2. </span><span class="content">Summary of Event Invariants</span><a class="self-link" href="#eventInvariants"></a></h4> <p><em>This section is informative.</em></p> <p>The following are invariants applicable to <a data-link-type="dfn" href="https://dom.spec.whatwg.org/#concept-event-fire" id="ref-for-concept-event-fire①">event firing</a> for a given asynchronous <a data-link-type="dfn" href="#read-method" id="ref-for-read-method⑥">read method</a> in this specification:</p> <ol> <li data-md> <p>Once a <code class="idl"><a data-link-type="idl" href="#dfn-loadstart-event" id="ref-for-dfn-loadstart-event③">loadstart</a></code> has been fired, a corresponding <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event⑥">loadend</a></code> fires at completion of the read, UNLESS any of the following are true:</p> <ul> <li data-md> <p>the <a data-link-type="dfn" href="#read-method" id="ref-for-read-method⑦">read method</a> has been cancelled using <code class="idl"><a data-link-type="idl" href="#dfn-abort" id="ref-for-dfn-abort⑤">abort()</a></code> and a new <a data-link-type="dfn" href="#read-method" id="ref-for-read-method⑧">read method</a> has been invoked</p> <li data-md> <p>the event handler function for a <code class="idl"><a data-link-type="idl" href="#dfn-load-event" id="ref-for-dfn-load-event③">load</a></code> event initiates a new read</p> <li data-md> <p>the event handler function for a <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> event initiates a new read.</p> </ul> <p class="note" role="note"><span class="marker">Note:</span> The events <code class="idl"><a data-link-type="idl" href="#dfn-loadstart-event" id="ref-for-dfn-loadstart-event④">loadstart</a></code> and <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event⑦">loadend</a></code> are not coupled in a one-to-one manner.</p> <div class="example" id="example-4eee468a"> <a class="self-link" href="#example-4eee468a"></a> This example showcases "read-chaining": initiating another read from within an event handler while the "first" read continues processing. <pre class="lang-javascript highlight"><c- c1>// In code of the sort...</c-> reader<c- p>.</c->readAsText<c- p>(</c->file<c- p>);</c-> reader<c- p>.</c->onload <c- o>=</c-> <c- a>function</c-><c- p>(){</c->reader<c- p>.</c->readAsText<c- p>(</c->alternateFile<c- p>);}</c-> <c- p>.....</c-> <c- c1>//... the loadend event must not fire for the first read</c-> reader<c- p>.</c->readAsText<c- p>(</c->file<c- p>);</c-> reader<c- p>.</c->abort<c- p>();</c-> reader<c- p>.</c->onabort <c- o>=</c-> <c- a>function</c-><c- p>(){</c->reader<c- p>.</c->readAsText<c- p>(</c->updatedFile<c- p>);}</c-> <c- c1>//... the loadend event must not fire for the first read</c-> </pre> </div> <li data-md> <p>One <code class="idl"><a data-link-type="idl" href="#dfn-progress-event" id="ref-for-dfn-progress-event②">progress</a></code> event will fire when <code>blob</code> has been completely read into memory.</p> <li data-md> <p>No <code class="idl"><a data-link-type="idl" href="#dfn-progress-event" id="ref-for-dfn-progress-event③">progress</a></code> event fires before <code class="idl"><a data-link-type="idl" href="#dfn-loadstart-event" id="ref-for-dfn-loadstart-event⑤">loadstart</a></code>.</p> <li data-md> <p>No <code class="idl"><a data-link-type="idl" href="#dfn-progress-event" id="ref-for-dfn-progress-event④">progress</a></code> event fires after any one of <code class="idl"><a data-link-type="idl">abort</a></code>, <code class="idl"><a data-link-type="idl" href="#dfn-load-event" id="ref-for-dfn-load-event④">load</a></code>, and <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> have fired. At most one of <code class="idl"><a data-link-type="idl">abort</a></code>, <code class="idl"><a data-link-type="idl" href="#dfn-load-event" id="ref-for-dfn-load-event⑤">load</a></code>, and <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> fire for a given read.</p> <li data-md> <p>No <code class="idl"><a data-link-type="idl">abort</a></code>, <code class="idl"><a data-link-type="idl" href="#dfn-load-event" id="ref-for-dfn-load-event⑥">load</a></code>, or <code class="idl"><a class="idl-code" data-link-type="event">error</a></code> event fires after <code class="idl"><a data-link-type="idl" href="#dfn-loadend-event" id="ref-for-dfn-loadend-event⑧">loadend</a></code>.</p> </ol> <h3 class="heading settled" data-level="6.5" id="readingOnThreads"><span class="secno">6.5. </span><span class="content">Reading on Threads</span><a class="self-link" href="#readingOnThreads"></a></h3> <p>Web Workers allow for the use of synchronous <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③④">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob④⑥">Blob</a></code> read APIs, since such reads on threads do not block the main thread. This section defines a synchronous API, which can be used within Workers [[Web Workers]]. Workers can avail of both the asynchronous API (the <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader②②">FileReader</a></code> object) <em>and</em> the synchronous API (the <code class="idl"><a data-link-type="idl" href="#dfn-FileReaderSync" id="ref-for-dfn-FileReaderSync④">FileReaderSync</a></code> object).</p> <h4 class="heading settled" data-level="6.5.1" id="FileReaderSync"><span class="secno">6.5.1. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-FileReaderSync" id="ref-for-dfn-FileReaderSync⑤">FileReaderSync</a></code> API</span><a class="self-link" href="#FileReaderSync"></a></h4> <p>This interface provides methods to <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="synchronous read method" data-noexport id="read-method-sync">synchronously read</dfn> <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③⑤">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob④⑦">Blob</a></code> objects into memory.</p> <pre class="idl highlight def">[<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed" id="ref-for-Exposed④"><c- g>Exposed</c-></a>=(<c- n>DedicatedWorker</c->,<c- n>SharedWorker</c->)] <c- b>interface</c-> <dfn class="dfn-paneled idl-code" data-dfn-type="interface" data-export id="dfn-FileReaderSync"><code><c- g>FileReaderSync</c-></code></dfn> { <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync" data-dfn-type="constructor" data-export data-lt="FileReaderSync()|constructor()" id="dom-filereadersync-filereadersync"><code><c- g>constructor</c-></code></dfn>(); // Synchronously return strings <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer" id="ref-for-idl-ArrayBuffer⑦"><c- b>ArrayBuffer</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsArrayBufferSync" id="ref-for-dfn-readAsArrayBufferSync"><c- g>readAsArrayBuffer</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob④⑧"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync/readAsArrayBuffer(blob)" data-dfn-type="argument" data-export id="dom-filereadersync-readasarraybuffer-blob-blob"><code><c- g>blob</c-></code></dfn>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString⑨"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsBinaryStringSync" id="ref-for-dfn-readAsBinaryStringSync"><c- g>readAsBinaryString</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob④⑨"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync/readAsBinaryString(blob)" data-dfn-type="argument" data-export id="dom-filereadersync-readasbinarystring-blob-blob"><code><c- g>blob</c-></code></dfn>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString①⓪"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsTextSync" id="ref-for-dfn-readAsTextSync"><c- g>readAsText</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob⑤⓪"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync/readAsText(blob, encoding), FileReaderSync/readAsText(blob)" data-dfn-type="argument" data-export id="dom-filereadersync-readastext-blob-encoding-blob"><code><c- g>blob</c-></code></dfn>, <c- b>optional</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString①①"><c- b>DOMString</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync/readAsText(blob, encoding), FileReaderSync/readAsText(blob)" data-dfn-type="argument" data-export id="dom-filereadersync-readastext-blob-encoding-encoding"><code><c- g>encoding</c-></code></dfn>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString①②"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsDataURLSync" id="ref-for-dfn-readAsDataURLSync"><c- g>readAsDataURL</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob⑤①"><c- n>Blob</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync/readAsDataURL(blob)" data-dfn-type="argument" data-export id="dom-filereadersync-readasdataurl-blob-blob"><code><c- g>blob</c-></code></dfn>); }; </pre> <h5 class="heading settled" data-level="6.5.1.1" id="filereadersyncConstrctr"><span class="secno">6.5.1.1. </span><span class="content">Constructors</span><a class="self-link" href="#filereadersyncConstrctr"></a></h5> <p>When the <code class="idl"><a data-link-type="idl" href="#dom-filereadersync-filereadersync" id="ref-for-dom-filereadersync-filereadersync">FileReaderSync()</a></code> constructor is invoked, the user agent must return a new <code class="idl"><a data-link-type="idl" href="#dfn-FileReaderSync" id="ref-for-dfn-FileReaderSync⑥">FileReaderSync</a></code> object.</p> <h5 class="heading settled" data-level="6.5.1.2" id="readAsTextSync"><span class="secno">6.5.1.2. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsTextSync" id="ref-for-dfn-readAsTextSync①">readAsText()</a></code></span><a class="self-link" href="#readAsTextSync"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync" data-dfn-type="method" data-export data-lt="readAsText(blob, encoding)|readAsText(blob)" id="dfn-readAsTextSync"><code>readAsText(<var>blob</var>, <var>encoding</var>)</code></dfn> method, when invoked, must run these steps:</p> <ol> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream⑤">get stream</a> on <var>blob</var>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader④">getting a reader</a> from <var>stream</var>.</p> <li data-md> <p>Let <var>promise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes" id="ref-for-readablestreamdefaultreader-read-all-bytes③">reading all bytes</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Wait for <var>promise</var> to be fulfilled or rejected.</p> <li data-md> <p>If <var>promise</var> fulfilled with a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte-sequence" id="ref-for-byte-sequence③">byte sequence</a> <var>bytes</var>:</p> <ol> <li data-md> <p>Return the result of <a data-link-type="dfn" href="#blob-package-data" id="ref-for-blob-package-data③">package data</a> given <var>bytes</var>, <em>Text</em>, <var>blob</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①⑥">type</a></code>, and <var>encoding</var>.</p> </ol> <li data-md> <p>Throw <var>promise</var>’s rejection reason.</p> </ol> <h5 class="heading settled" data-level="6.5.1.3" id="readAsDataURLSync-section"><span class="secno">6.5.1.3. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsDataURLSync" id="ref-for-dfn-readAsDataURLSync①">readAsDataURL()</a></code> method</span><a class="self-link" href="#readAsDataURLSync-section"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync" data-dfn-type="method" data-export id="dfn-readAsDataURLSync"><code>readAsDataURL(<var>blob</var>)</code></dfn> method, when invoked, must run these steps:</p> <ol> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream⑥">get stream</a> on <var>blob</var>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader⑤">getting a reader</a> from <var>stream</var>.</p> <li data-md> <p>Let <var>promise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes" id="ref-for-readablestreamdefaultreader-read-all-bytes④">reading all bytes</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Wait for <var>promise</var> to be fulfilled or rejected.</p> <li data-md> <p>If <var>promise</var> fulfilled with a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte-sequence" id="ref-for-byte-sequence④">byte sequence</a> <var>bytes</var>:</p> <ol> <li data-md> <p>Return the result of <a data-link-type="dfn" href="#blob-package-data" id="ref-for-blob-package-data④">package data</a> given <var>bytes</var>, <em>DataURL</em>, and <var>blob</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①⑦">type</a></code>.</p> </ol> <li data-md> <p>Throw <var>promise</var>’s rejection reason.</p> </ol> <h5 class="heading settled" data-level="6.5.1.4" id="readAsArrayBufferSyncSection"><span class="secno">6.5.1.4. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsArrayBufferSync" id="ref-for-dfn-readAsArrayBufferSync①">readAsArrayBuffer()</a></code> method</span><a class="self-link" href="#readAsArrayBufferSyncSection"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync" data-dfn-type="method" data-export id="dfn-readAsArrayBufferSync"><code>readAsArrayBuffer(<var>blob</var>)</code></dfn> method, when invoked, must run these steps:</p> <ol> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream⑦">get stream</a> on <var>blob</var>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader⑥">getting a reader</a> from <var>stream</var>.</p> <li data-md> <p>Let <var>promise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes" id="ref-for-readablestreamdefaultreader-read-all-bytes⑤">reading all bytes</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Wait for <var>promise</var> to be fulfilled or rejected.</p> <li data-md> <p>If <var>promise</var> fulfilled with a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte-sequence" id="ref-for-byte-sequence⑤">byte sequence</a> <var>bytes</var>:</p> <ol> <li data-md> <p>Return the result of <a data-link-type="dfn" href="#blob-package-data" id="ref-for-blob-package-data⑤">package data</a> given <var>bytes</var>, <em>ArrayBuffer</em>, and <var>blob</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①⑧">type</a></code>.</p> </ol> <li data-md> <p>Throw <var>promise</var>’s rejection reason.</p> </ol> <h5 class="heading settled" data-level="6.5.1.5" id="readAsBinaryStringSyncSection"><span class="secno">6.5.1.5. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#dfn-readAsBinaryStringSync" id="ref-for-dfn-readAsBinaryStringSync①">readAsBinaryString()</a></code> method</span><a class="self-link" href="#readAsBinaryStringSyncSection"></a></h5> <p>The <dfn class="dfn-paneled idl-code" data-dfn-for="FileReaderSync" data-dfn-type="method" data-export id="dfn-readAsBinaryStringSync"><code>readAsBinaryString(<var>blob</var>)</code></dfn> method, when invoked, must run these steps:</p> <ol> <li data-md> <p>Let <var>stream</var> be the result of calling <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream⑧">get stream</a> on <var>blob</var>.</p> <li data-md> <p>Let <var>reader</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestream-get-a-reader" id="ref-for-readablestream-get-a-reader⑦">getting a reader</a> from <var>stream</var>.</p> <li data-md> <p>Let <var>promise</var> be the result of <a data-link-type="dfn" href="https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes" id="ref-for-readablestreamdefaultreader-read-all-bytes⑥">reading all bytes</a> from <var>stream</var> with <var>reader</var>.</p> <li data-md> <p>Wait for <var>promise</var> to be fulfilled or rejected.</p> <li data-md> <p>If <var>promise</var> fulfilled with a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#byte-sequence" id="ref-for-byte-sequence⑥">byte sequence</a> <var>bytes</var>:</p> <ol> <li data-md> <p>Return the result of <a data-link-type="dfn" href="#blob-package-data" id="ref-for-blob-package-data⑥">package data</a> given <var>bytes</var>, <em>BinaryString</em>, and <var>blob</var>’s <code class="idl"><a data-link-type="idl" href="#dfn-type" id="ref-for-dfn-type①⑨">type</a></code>.</p> </ol> <li data-md> <p>Throw <var>promise</var>’s rejection reason.</p> </ol> <p class="note" role="note"><span class="marker">Note:</span> The use of <code class="idl"><a data-link-type="idl" href="#dfn-readAsArrayBufferSync" id="ref-for-dfn-readAsArrayBufferSync②">readAsArrayBuffer()</a></code> is preferred over <code class="idl"><a data-link-type="idl" href="#dfn-readAsBinaryStringSync" id="ref-for-dfn-readAsBinaryStringSync②">readAsBinaryString()</a></code>, which is provided for backwards compatibility.</p> <h2 class="heading settled" data-level="7" id="ErrorAndException"><span class="secno">7. </span><span class="content">Errors and Exceptions</span><a class="self-link" href="#ErrorAndException"></a></h2> <p><dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="file read error" data-noexport id="file-error-read">File read errors</dfn> can occur when reading files from the underlying filesystem. The list below of potential error conditions is <em>informative</em>.</p> <ul> <li data-md> <p>The <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③⑥">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤②">Blob</a></code> being accessed may not exist at the time one of the <a data-link-type="dfn" href="#asynchronous-read-methods" id="ref-for-asynchronous-read-methods">asynchronous read methods</a> or <a data-link-type="dfn" href="#read-method-sync" id="ref-for-read-method-sync①">synchronous read methods</a> are called. This may be due to it having been moved or deleted after a reference to it was acquired (e.g. concurrent modification with another application). See <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notfounderror" id="ref-for-notfounderror②">NotFoundError</a></code>.</p> <li data-md> <p>A <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③⑦">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤③">Blob</a></code> may be unreadable. This may be due to permission problems that occur after a reference to a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③⑧">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤④">Blob</a></code> has been acquired (e.g. concurrent lock with another application). Additionally, the <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state⑨">snapshot state</a> may have changed. See <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notreadableerror" id="ref-for-notreadableerror">NotReadableError</a></code>.</p> <li data-md> <p>User agents MAY determine that some files are unsafe for use within Web applications. A file may change on disk since the original file selection, thus resulting in an invalid read. Additionally, some file and directory structures may be considered restricted by the underlying filesystem; attempts to read from them may be considered a security violation. See <a href="#security-discussion">§ 9 Security and Privacy Considerations</a> and <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#securityerror" id="ref-for-securityerror">SecurityError</a></code>.</p> </ul> <h3 class="heading settled" data-level="7.1" id="dfn-error-codes"><span class="secno">7.1. </span><span class="content">Throwing an Exception or Returning an Error</span><a class="self-link" href="#dfn-error-codes"></a></h3> <p><em>This section is normative.</em></p> <p>Error conditions can arise when reading a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file③⑨">File</a></code> or a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤⑤">Blob</a></code>.</p> <p>The <a data-link-type="dfn" href="#readOperation" id="ref-for-readOperation⑤">read operation</a> can terminate due to error conditions when reading a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file④⓪">File</a></code> or a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤⑥">Blob</a></code>; the particular error condition that causes the <a data-link-type="dfn" href="#blob-get-stream" id="ref-for-blob-get-stream⑨">get stream</a> algorithm to fail is called a <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="failureReason">failure reason</dfn>. A <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason①">failure reason</a> is one of <a data-link-type="dfn" href="#NotFoundFR" id="ref-for-NotFoundFR">NotFound</a>, <a data-link-type="dfn" href="#UnsafeFileFR" id="ref-for-UnsafeFileFR">UnsafeFile</a>, <a data-link-type="dfn" href="#TooManyReadsFR" id="ref-for-TooManyReadsFR">TooManyReads</a>, <a data-link-type="dfn" href="#SnapshotStateFR" id="ref-for-SnapshotStateFR">SnapshotState</a>, or <a data-link-type="dfn" href="#FileLockFR" id="ref-for-FileLockFR">FileLock</a>.</p> <p>Synchronous read methods <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#dfn-throw" id="ref-for-dfn-throw">throw</a> exceptions of the type in the table below if there has been an error owing to a particular <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason②">failure reason</a>.</p> <p>Asynchronous read methods use the <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-filereader-error" id="ref-for-dom-filereader-error②">error</a></code> attribute of the <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader②③">FileReader</a></code> object, which must return a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#idl-DOMException" id="ref-for-idl-DOMException③">DOMException</a></code> object of the most appropriate type from the table below if there has been an error owing to a particular <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason③">failure reason</a>, or otherwise return null.</p> <table class="data"> <thead> <tr> <th>Type <th>Description and Failure Reason <tbody> <tr> <td><code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notfounderror" id="ref-for-notfounderror③">NotFoundError</a></code> <td> If the <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file④①">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤⑦">Blob</a></code> resource could not be found at the time the read was processed, this is the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="NotFoundFR">NotFound</dfn> <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason④">failure reason</a>. <p>For asynchronous read methods the <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-filereader-error" id="ref-for-dom-filereader-error③">error</a></code> attribute must return a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notfounderror" id="ref-for-notfounderror④">NotFoundError</a></code> exception and synchronous read methods must <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#dfn-throw" id="ref-for-dfn-throw①">throw</a> a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notfounderror" id="ref-for-notfounderror⑤">NotFoundError</a></code> exception.</p> <tr> <td><code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#securityerror" id="ref-for-securityerror①">SecurityError</a></code> <td> If: <ul> <li data-md> <p>it is determined that certain files are unsafe for access within a Web application, this is the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="UnsafeFileFR">UnsafeFile</dfn> <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason⑤">failure reason</a>.</p> <li data-md> <p>it is determined that too many read calls are being made on <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file④②">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤⑧">Blob</a></code> resources, this is the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="TooManyReadsFR">TooManyReads</dfn> <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason⑥">failure reason</a>.</p> </ul> <p>For asynchronous read methods the <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-filereader-error" id="ref-for-dom-filereader-error④">error</a></code> attribute may return a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#securityerror" id="ref-for-securityerror②">SecurityError</a></code> exception and synchronous read methods may <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#dfn-throw" id="ref-for-dfn-throw②">throw</a> a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#securityerror" id="ref-for-securityerror③">SecurityError</a></code> exception.</p> <p>This is a security error to be used in situations not covered by any other <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason⑦">failure reason</a>.</p> <tr> <td><code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notreadableerror" id="ref-for-notreadableerror①">NotReadableError</a></code> <td> If: <ul> <li data-md> <p>the <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state①⓪">snapshot state</a> of a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file④③">File</a></code> or a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑤⑨">Blob</a></code> does not match the state of the underlying storage, this is the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="SnapshotStateFR">SnapshotState</dfn> <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason⑧">failure reason</a>.</p> <li data-md> <p>the <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file④④">File</a></code> or <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥⓪">Blob</a></code> cannot be read, typically due due to permission problems that occur after a <a data-link-type="dfn" href="#snapshot-state" id="ref-for-snapshot-state①①">snapshot state</a> has been established (e.g. concurrent lock on the underlying storage with another application) then this is the <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="FileLockFR">FileLock</dfn> <a data-link-type="dfn" href="#failureReason" id="ref-for-failureReason⑨">failure reason</a>.</p> </ul> <p>For asynchronous read methods the <code class="idl"><a class="idl-code" data-link-type="attribute" href="#dom-filereader-error" id="ref-for-dom-filereader-error⑤">error</a></code> attribute must return a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notreadableerror" id="ref-for-notreadableerror②">NotReadableError</a></code> exception and synchronous read methods must <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#dfn-throw" id="ref-for-dfn-throw③">throw</a> a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#notreadableerror" id="ref-for-notreadableerror③">NotReadableError</a></code> exception.</p> </table> <h2 class="heading settled" data-level="8" id="url"><span class="secno">8. </span><span class="content">A URL for Blob and MediaSource reference</span><a class="self-link" href="#url"></a></h2> <p>This section defines a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-scheme" id="ref-for-concept-url-scheme">scheme</a> for a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url" id="ref-for-concept-url">URL</a> used to refer to <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥①">Blob</a></code> and <code class="idl"><a data-link-type="idl" href="http://w3c.github.io/media-source/#mediasource" id="ref-for-mediasource">MediaSource</a></code> objects.</p> <h3 class="heading settled" data-level="8.1" id="url-intro"><span class="secno">8.1. </span><span class="content">Introduction</span><a class="self-link" href="#url-intro"></a></h3> <p><em>This section is informative.</em></p> <p><a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①">Blob (or object) URLs</a> are URLs like <code>blob:http://example.com/550e8400-e29b-41d4-a716-446655440000</code>. This enables integration of <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥②">Blob</a></code>s and <code class="idl"><a data-link-type="idl" href="http://w3c.github.io/media-source/#mediasource" id="ref-for-mediasource①">MediaSource</a></code>s with other APIs that are only designed to be used with URLs, such as the <code><a data-link-type="element" href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element" id="ref-for-the-img-element">img</a></code> element. <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url②">Blob URLs</a> can also be used to navigate to as well as to trigger downloads of locally generated data.</p> <p>For this purpose two static methods are exposed on the <code class="idl"><a data-link-type="idl" href="https://url.spec.whatwg.org/#url" id="ref-for-url">URL</a></code> interface, <code class="idl"><a data-link-type="idl" href="#dfn-createObjectURL" id="ref-for-dfn-createObjectURL">createObjectURL(obj)</a></code> and <code class="idl"><a data-link-type="idl" href="#dfn-revokeObjectURL" id="ref-for-dfn-revokeObjectURL">revokeObjectURL(url)</a></code>. The first method creates a mapping from a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url" id="ref-for-concept-url①">URL</a> to a <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥③">Blob</a></code>, and the second method revokes said mapping. As long as the mapping exist the <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥④">Blob</a></code> can’t be garbage collected, so some care must be taken to revoke the URL as soon as the reference is no longer needed. All URLs are revoked when the global that created the URL itself goes away.</p> <h3 class="heading settled" data-level="8.2" id="url-model"><span class="secno">8.2. </span><span class="content">Model</span><a class="self-link" href="#url-model"></a></h3> <p>Each user agent must maintain a <dfn class="dfn-paneled" data-dfn-type="dfn" data-export id="BlobURLStore">blob URL store</dfn>. A <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore">blob URL store</a> is a <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#ordered-map" id="ref-for-ordered-map">map</a> where <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-getting-the-keys" id="ref-for-map-getting-the-keys">keys</a> are <a data-link-type="dfn" href="https://url.spec.whatwg.org/#valid-url-string" id="ref-for-valid-url-string">valid URL strings</a> and <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-getting-the-values" id="ref-for-map-getting-the-values">values</a> are <a data-link-type="dfn" href="#blob-url-entry" id="ref-for-blob-url-entry">blob URL Entries</a>.</p> <p>A <dfn class="dfn-paneled" data-dfn-type="dfn" data-export id="blob-url-entry">blob URL entry</dfn> consists of an <dfn class="dfn-paneled" data-dfn-for="blob URL entry" data-dfn-type="dfn" data-noexport id="blob-url-entry-object">object</dfn> (of type <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥⑤">Blob</a></code> or <code class="idl"><a data-link-type="idl" href="http://w3c.github.io/media-source/#mediasource" id="ref-for-mediasource②">MediaSource</a></code>), and an <dfn class="dfn-paneled" data-dfn-for="blob URL entry" data-dfn-type="dfn" data-export id="blob-url-entry-environment">environment</dfn> (an <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object" id="ref-for-environment-settings-object">environment settings object</a>).</p> <p class="note" role="note"><span class="marker">Note:</span> Specifications have to use the <a data-link-type="dfn" href="#blob-url-obtain-object" id="ref-for-blob-url-obtain-object">obtain a blob object</a> algorithm to access a <a data-link-type="dfn" href="#blob-url-entry" id="ref-for-blob-url-entry①">blob URL entry</a>'s <a data-link-type="dfn" href="#blob-url-entry-object" id="ref-for-blob-url-entry-object">object</a>.</p> <p><a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-getting-the-keys" id="ref-for-map-getting-the-keys①">Keys</a> in the <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore①">blob URL store</a> (also known as <dfn class="dfn-paneled" data-dfn-type="dfn" data-export data-lt="blob URL|object URL" id="blob-url">blob URLs</dfn>) are <a data-link-type="dfn" href="https://url.spec.whatwg.org/#valid-url-string" id="ref-for-valid-url-string①">valid URL strings</a> that when <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-parser" id="ref-for-concept-url-parser">parsed</a> result in a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url" id="ref-for-concept-url②">URL</a> with a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-scheme" id="ref-for-concept-url-scheme①">scheme</a> equal to "<code>blob</code>", an <a data-link-type="dfn" href="https://url.spec.whatwg.org/#empty-host" id="ref-for-empty-host">empty host</a>, and a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-path" id="ref-for-concept-url-path">path</a> consisting of one element itself also a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#valid-url-string" id="ref-for-valid-url-string②">valid URL string</a>.</p> <div class="algorithm" data-algorithm="obtainBlobObject"> To <dfn class="dfn-paneled" data-dfn-type="dfn" data-export id="blob-url-obtain-object">obtain a blob object</dfn> given a <a data-link-type="dfn" href="#blob-url-entry" id="ref-for-blob-url-entry②">blob URL entry</a> <var>blobUrlEntry</var> and an <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object" id="ref-for-environment-settings-object①">environment settings object</a> or the string "<code>navigation</code>" <var>environment</var>, perform the following steps. They return an <a data-link-type="dfn" href="#blob-url-entry-object" id="ref-for-blob-url-entry-object①">object</a>. <ol> <li data-md> <p>Let <var>isAuthorized</var> be true.</p> <li data-md> <p>If <var>environment</var> is not the string "<code>navigation</code>", then set <var>isAuthorized</var> to the result of <a data-link-type="dfn" href="#check-for-same-partition-blob-url-usage" id="ref-for-check-for-same-partition-blob-url-usage">checking for same-partition blob URL usage</a> with <var>blobUrlEntry</var> and <var>environment</var>.</p> <li data-md> <p>If <var>isAuthorized</var> is false, then return failure.</p> <li data-md> <p>Return <var>blobUrlEntry</var>’s <a data-link-type="dfn" href="#blob-url-entry-object" id="ref-for-blob-url-entry-object②">object</a>.</p> </ol> </div> <div class="algorithm" data-algorithm="createBlobURL"> To <dfn class="dfn-paneled" data-dfn-type="dfn" data-lt="generate a new blob URL|generating a new blob URL" data-noexport id="unicodeBlobURL"> generate a new blob URL</dfn>, run the following steps: <ol> <li data-md> <p>Let <var>result</var> be the empty string.</p> <li data-md> <p>Append the string "<code>blob:</code>" to <var>result</var>.</p> <li data-md> <p>Let <var>settings</var> be the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#current-settings-object" id="ref-for-current-settings-object">current settings object</a></p> <li data-md> <p>Let <var>origin</var> be <var>settings</var>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-origin" id="ref-for-concept-settings-object-origin">origin</a>.</p> <li data-md> <p>Let <var>serialized</var> be the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/browsers.html#ascii-serialisation-of-an-origin" id="ref-for-ascii-serialisation-of-an-origin">ASCII serialization</a> of <var>origin</var>.</p> <li data-md> <p>If <var>serialized</var> is "<code>null</code>", set it to an implementation-defined value.</p> <li data-md> <p>Append <var>serialized</var> to <var>result</var>.</p> <li data-md> <p>Append U+0024 SOLIDUS (<code>/</code>) to <var>result</var>.</p> <li data-md> <p>Generate a UUID <a data-link-type="biblio" href="#biblio-rfc4122" title="Universally Unique IDentifiers (UUIDs)">[RFC4122]</a> as a string and append it to <var>result</var>.</p> <li data-md> <p>Return <var>result</var>.</p> </ol> </div> <div class="example" id="example-752424a0"><a class="self-link" href="#example-752424a0"></a> An example of a blob URL that can be generated by this algorithm is <code>blob:https://example.org/40a5fb5a-d56d-4a33-b4e2-0acf6a8e5f64</code>. </div> <div class="algorithm" data-algorithm="addBlobURL"> To <dfn class="dfn-paneled" data-dfn-for="blob url store" data-dfn-type="dfn" data-lt="add an entry|add the entry|add an entry to the blob URL store|add the entry to the blob URL store|adding an entry to the blob URL store" data-noexport id="add-an-entry"> add an entry to the blob URL store</dfn> for a given <var>object</var>, run the following steps: <ol> <li data-md> <p>Let <var>store</var> be the user agent’s <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore②">blob URL store</a>.</p> <li data-md> <p>Let <var>url</var> be the result of <a data-link-type="dfn" href="#unicodeBlobURL" id="ref-for-unicodeBlobURL">generating a new blob URL</a>.</p> <li data-md> <p>Let <var>entry</var> be a new <a data-link-type="dfn" href="#blob-url-entry" id="ref-for-blob-url-entry③">blob URL entry</a> consisting of <var>object</var> and the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#current-settings-object" id="ref-for-current-settings-object①">current settings object</a>.</p> <li data-md> <p><a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-set" id="ref-for-map-set">Set</a> <var>store</var>[<var>url</var>] to <var>entry</var>.</p> <li data-md> <p>Return <var>url</var>.</p> </ol> </div> <div class="algorithm" data-algorithm="removeBlobURL"> To <dfn class="dfn-paneled" data-dfn-for="blob url store" data-dfn-type="dfn" data-lt="remove an entry|remove the entry|remove an entry from the blob URL store|remove the entry from the blob URL store" data-noexport id="removeTheEntry"> remove an entry from the blob URL store</dfn> for a given <var>url</var>, run the following steps: <ol> <li data-md> <p>Let <var>store</var> be the user agent’s <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore③">blob URL store</a>;</p> <li data-md> <p>Let <var>url string</var> be the result of <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-serializer" id="ref-for-concept-url-serializer">serializing</a> <var>url</var>.</p> <li data-md> <p><a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-remove" id="ref-for-map-remove">Remove</a> <var>store</var>[<var>url string</var>].</p> </ol> </div> <h3 class="heading settled" data-level="8.3" id="requestResponseModel"><span class="secno">8.3. </span><span class="content">Dereferencing Model for blob URLs</span><a class="self-link" href="#requestResponseModel"></a></h3> <div class="algorithm" data-algorithm="resolveURL"> To <dfn class="dfn-paneled" data-dfn-type="dfn" data-export id="blob-url-resolve">resolve a blob URL</dfn> given a <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url" id="ref-for-concept-url③">URL</a> <var>url</var>: <ol> <li data-md> <p><a data-link-type="dfn" href="https://infra.spec.whatwg.org/#assert" id="ref-for-assert">Assert</a>: <var>url</var>’s <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-scheme" id="ref-for-concept-url-scheme②">scheme</a> is "<code>blob</code>".</p> <li data-md> <p>Let <var>store</var> be the user agent’s <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore④">blob URL store</a>.</p> <li data-md> <p>Let <var>url string</var> be the result of <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-serializer" id="ref-for-concept-url-serializer①">serializing</a> <var>url</var> with the <em>exclude fragment flag</em> set.</p> <li data-md> <p>If <var>store</var>[<var>url string</var>] <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-exists" id="ref-for-map-exists">exists</a>, return <var>store</var>[<var>url string</var>]; otherwise return failure.</p> </ol> </div> <p>Futher requirements for the parsing and fetching model for <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url③">blob URLs</a> are defined in the <a data-link-type="biblio" href="#biblio-url" title="URL Standard">[URL]</a> and <a data-link-type="biblio" href="#biblio-fetch" title="Fetch Standard">[Fetch]</a> specifications.</p> <h4 class="heading settled" data-level="8.3.1" id="originOfBlobURL"><span class="secno">8.3.1. </span><span class="content">Origin of blob URLs</span><a class="self-link" href="#originOfBlobURL"></a></h4> <p><em>This section is informative.</em></p> <p>The origin of a blob URL is always the same as that of the environment that created the URL, as long as the URL hasn’t been revoked yet. This is achieved by the <a data-link-type="biblio" href="#biblio-url" title="URL Standard">[URL]</a> spec looking up the URL in the <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore⑤">blob URL store</a> when parsing a URL, and using that entry to return the correct origin.</p> <p>If the URL was revoked the serialization of the origin will still remain the same as the serialization of the origin of the environment that created the blob URL, but for opaque origins the origin itself might be distinct. This difference isn’t observable though, since a revoked blob URL can’t be resolved/fetched anymore anyway.</p> <h4 class="heading settled" data-level="8.3.2" id="partitioningOfBlobUrls"><span class="secno">8.3.2. </span><span class="content">Access restrictions on blob URLs</span><a class="self-link" href="#partitioningOfBlobUrls"></a></h4> <p><a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url④">Blob URLs</a> can only be fetched from environments where the <a data-link-type="dfn" href="https://w3c.github.io/ServiceWorker/#service-worker-registration-storage-key" id="ref-for-service-worker-registration-storage-key">storage key</a> matches that of the environment where the <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url⑤">blob URL</a> was created. <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url⑥">Blob URL</a> navigations are not subject to this restriction.</p> <div class="algorithm" data-algorithm="checkForSamePartitionBlobUrlUsage"> To <dfn class="dfn-paneled" data-dfn-type="dfn" data-noexport id="check-for-same-partition-blob-url-usage">check for same-partition blob URL usage</dfn> given a <a data-link-type="dfn" href="#blob-url-entry" id="ref-for-blob-url-entry④">blob URL entry</a> <var>blobUrlEntry</var> and an <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object" id="ref-for-environment-settings-object②">environment settings object</a> <var>environment</var>, perform the following steps. They return a boolean. <ol> <li data-md> <p>Let <var>blobStorageKey</var> be the result of <a data-link-type="dfn" href="https://storage.spec.whatwg.org/#obtain-a-storage-key-for-non-storage-purposes" id="ref-for-obtain-a-storage-key-for-non-storage-purposes">obtaining a storage key for non-storage purposes</a> with <var>blobUrlEntry</var>’s <a data-link-type="dfn" href="#blob-url-entry-environment" id="ref-for-blob-url-entry-environment">environment</a>.</p> <li data-md> <p>Let <var>environmentStorageKey</var> be the result of <a data-link-type="dfn" href="https://storage.spec.whatwg.org/#obtain-a-storage-key-for-non-storage-purposes" id="ref-for-obtain-a-storage-key-for-non-storage-purposes①">obtaining a storage key for non-storage purposes</a> with <var>environment</var>.</p> <li data-md> <p>If <var>blobStorageKey</var> is not <a data-link-type="dfn" href="https://storage.spec.whatwg.org/#storage-key-equal" id="ref-for-storage-key-equal">equal</a> to <var>environmentStorageKey</var>, then return false.</p> <li data-md> <p>Return true.</p> </ol> </div> <h4 class="heading settled dfn-paneled" data-dfn-for="blob url" data-dfn-type="dfn" data-export data-level="8.3.3" data-lt="lifetime|lifetime stipulation" id="lifeTime"><span class="secno">8.3.3. </span><span class="content">Lifetime of blob URLs</span><a class="self-link" href="#lifeTime" id="ref-for-lifeTime"></a></h4> <p>This specification extends the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/document-lifecycle.html#unloading-document-cleanup-steps" id="ref-for-unloading-document-cleanup-steps">unloading document cleanup steps</a> with the following steps:</p> <ol> <li data-md> <p>Let <var>environment</var> be the <code class="idl"><a data-link-type="idl" href="https://dom.spec.whatwg.org/#document" id="ref-for-document">Document</a></code>'s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object" id="ref-for-relevant-settings-object">relevant settings object</a>.</p> <li data-md> <p>Let <var>store</var> be the user agent’s <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore⑥">blob URL store</a>;</p> <li data-md> <p>Remove from <var>store</var> any entries for which the <a data-link-type="dfn" href="https://infra.spec.whatwg.org/#map-value" id="ref-for-map-value">value</a>'s <a data-link-type="dfn" href="#blob-url-entry-environment" id="ref-for-blob-url-entry-environment①">environment</a> is equal to <var>environment</var>.</p> </ol> <p class="issue" id="issue-5f2e5a9d"><a class="self-link" href="#issue-5f2e5a9d"></a> This needs a similar hook when a worker is unloaded.</p> <h3 class="heading settled" data-level="8.4" id="creating-revoking"><span class="secno">8.4. </span><span class="content">Creating and Revoking a blob URL</span><a class="self-link" href="#creating-revoking"></a></h3> <p><a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url⑦">Blob URLs</a> are created and revoked using static methods exposed on the <code class="idl"><a data-link-type="idl" href="https://url.spec.whatwg.org/#url" id="ref-for-url①">URL</a></code> object. Revocation of a <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url⑧">blob URL</a> decouples the <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url⑨">blob URL</a> from the resource it refers to, and if it is dereferenced after it is revoked, user agents must act as if a <a data-link-type="dfn" href="https://fetch.spec.whatwg.org/#concept-network-error" id="ref-for-concept-network-error">network error</a> has occurred. This section describes a supplemental interface to the URL specification <a data-link-type="biblio" href="#biblio-url" title="URL Standard">[URL]</a> and presents methods for <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①⓪">blob URL</a> creation and revocation.</p> <pre class="idl highlight def">[<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed" id="ref-for-Exposed⑤"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>DedicatedWorker</c->,<c- n>SharedWorker</c->)] <c- b>partial</c-> <c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="https://url.spec.whatwg.org/#url" id="ref-for-url②"><c- g>URL</c-></a> { <c- b>static</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString①③"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-createObjectURL" id="ref-for-dfn-createObjectURL①"><c- g>createObjectURL</c-></a>((<a data-link-type="idl-name" href="#dfn-Blob" id="ref-for-dfn-Blob⑥⑥"><c- n>Blob</c-></a> <c- b>or</c-> <a data-link-type="idl-name" href="http://w3c.github.io/media-source/#mediasource" id="ref-for-mediasource③"><c- n>MediaSource</c-></a>) <dfn class="dfn-paneled idl-code" data-dfn-for="URL/createObjectURL(obj)" data-dfn-type="argument" data-export id="dom-url-createobjecturl-obj-obj"><code><c- g>obj</c-></code></dfn>); <c- b>static</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined" id="ref-for-idl-undefined⑤"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-revokeObjectURL" id="ref-for-dfn-revokeObjectURL①"><c- g>revokeObjectURL</c-></a>(<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString" id="ref-for-idl-DOMString①④"><c- b>DOMString</c-></a> <dfn class="dfn-paneled idl-code" data-dfn-for="URL/revokeObjectURL(url)" data-dfn-type="argument" data-export id="dom-url-revokeobjecturl-url-url"><code><c- g>url</c-></code></dfn>); }; </pre> <div class="algorithm" data-algorithm="createObjectURL"> The <dfn class="dfn-paneled idl-code" data-dfn-for="URL" data-dfn-type="method" data-export id="dfn-createObjectURL"><code>createObjectURL(<var>obj</var>)</code></dfn> static method must return the result of <a data-link-type="dfn" href="#add-an-entry" id="ref-for-add-an-entry">adding an entry to the blob URL store</a> for <var>obj</var>. </div> <div class="algorithm" data-algorithm="revokeObjectURL"> The <dfn class="dfn-paneled idl-code" data-dfn-for="URL" data-dfn-type="method" data-export id="dfn-revokeObjectURL"><code>revokeObjectURL(<var>url</var>)</code></dfn> static method must run these steps: <ol> <li data-md> <p>Let <var>urlRecord</var> be the result of <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-parser" id="ref-for-concept-url-parser①">parsing</a> <var>url</var>.</p> <li data-md> <p>If <var>urlRecord</var>’s <a data-link-type="dfn" href="https://url.spec.whatwg.org/#concept-url-scheme" id="ref-for-concept-url-scheme③">scheme</a> is not "<code>blob</code>", return.</p> <li data-md> <p>Let <var>entry</var> be <var>urlRecord</var>’s <a data-link-type="dfn" href="#blob-url-entry" id="ref-for-blob-url-entry⑤">blob URL entry</a>.</p> <li data-md> <p>If <var>entry</var> is null, then return.</p> <li data-md> <p>Let <var>isAuthorized</var> be the result of <a data-link-type="dfn" href="#check-for-same-partition-blob-url-usage" id="ref-for-check-for-same-partition-blob-url-usage①">checking for same-partition blob URL usage</a> with <var>entry</var> and the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/webappapis.html#current-settings-object" id="ref-for-current-settings-object②">current settings object</a>.</p> <li data-md> <p>If <var>isAuthorized</var> is false, then return.</p> <li data-md> <p><a data-link-type="dfn" href="#removeTheEntry" id="ref-for-removeTheEntry">Remove an entry from the Blob URL Store</a> for <var>url</var>.</p> </ol> <p class="note" role="note"><span class="marker">Note:</span> This means that rather than throwing some kind of error, attempting to revoke a URL that isn’t registered or that was registered from an environment in a different storage partition will silently fail. User agents might display a message on the error console if this happens.</p> <p class="note" role="note"><span class="marker">Note:</span> Attempts to dereference <var>url</var> after it has been revoked will result in a <a data-link-type="dfn" href="https://fetch.spec.whatwg.org/#concept-network-error" id="ref-for-concept-network-error①">network error</a>. Requests that were started before the <var>url</var> was revoked should still succeed.</p> </div> <div class="example" id="example-8201d564"> <a class="self-link" href="#example-8201d564"></a> In the example below, <code>window1</code> and <code>window2</code> are separate, but in the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/browsers.html#same-origin" id="ref-for-same-origin">same origin</a>; <code>window2</code> could be an <code><a data-link-type="element" href="https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element" id="ref-for-the-iframe-element">iframe</a></code> inside <code>window1</code>. <pre class="lang-javascript highlight">myurl <c- o>=</c-> window1<c- p>.</c->URL<c- p>.</c->createObjectURL<c- p>(</c->myblob<c- p>);</c-> window2<c- p>.</c->URL<c- p>.</c->revokeObjectURL<c- p>(</c->myurl<c- p>);</c-> </pre> <p>Since a user agent has one global <a data-link-type="dfn" href="#BlobURLStore" id="ref-for-BlobURLStore⑦">blob URL store</a>, it is possible to revoke an object URL from a different window than from which it was created. The <code>URL.<code class="idl"><a data-link-type="idl" href="#dfn-revokeObjectURL" id="ref-for-dfn-revokeObjectURL②">revokeObjectURL()</a></code></code> call ensures that subsequent dereferencing of <code>myurl</code> results in a the user agent acting as if a <a data-link-type="dfn" href="https://fetch.spec.whatwg.org/#concept-network-error" id="ref-for-concept-network-error②">network error</a> has occurred.</p> </div> <h4 class="heading settled" data-level="8.4.1" id="examplesOfCreationRevocation"><span class="secno">8.4.1. </span><span class="content">Examples of blob URL Creation and Revocation</span><a class="self-link" href="#examplesOfCreationRevocation"></a></h4> <p><a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①①">Blob URL</a>s are strings that are used to <a data-link-type="dfn" href="https://fetch.spec.whatwg.org/#concept-fetch" id="ref-for-concept-fetch①">fetch</a> <code class="idl"><a data-link-type="idl" href="#dfn-Blob" id="ref-for-dfn-Blob⑥⑦">Blob</a></code> objects, and can persist for as long as the <code>document</code> from which they were minted using <code>URL.<code class="idl"><a data-link-type="idl" href="#dfn-createObjectURL" id="ref-for-dfn-createObjectURL②">createObjectURL()</a></code></code>—see <a href="#lifeTime" id="ref-for-lifeTime①">§ 8.3.3 Lifetime of blob URLs</a>.</p> <p>This section gives sample usage of creation and revocation of <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①②">blob URL</a>s with explanations.</p> <div class="example" id="example-1527a3d5"> <a class="self-link" href="#example-1527a3d5"></a> In the example below, two <code><a data-link-type="element" href="https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element" id="ref-for-the-img-element①">img</a></code> elements <a data-link-type="biblio" href="#biblio-html" title="HTML Standard">[HTML]</a> refer to the same <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①③">blob URL</a>: <pre class="lang-javascript highlight">url <c- o>=</c-> URL<c- p>.</c->createObjectURL<c- p>(</c->blob<c- p>);</c-> img1<c- p>.</c->src <c- o>=</c-> url<c- p>;</c-> img2<c- p>.</c->src <c- o>=</c-> url<c- p>;</c-> </pre> </div> <div class="example" id="example-ec3131a7"> <a class="self-link" href="#example-ec3131a7"></a> In the example below, <code>URL.<code class="idl"><a data-link-type="idl" href="#dfn-revokeObjectURL" id="ref-for-dfn-revokeObjectURL③">revokeObjectURL()</a></code></code> is explicitly called. <pre class="lang-javascript highlight"><c- a>var</c-> blobURLref <c- o>=</c-> URL<c- p>.</c->createObjectURL<c- p>(</c->file<c- p>);</c-> img1 <c- o>=</c-> <c- ow>new</c-> Image<c- p>();</c-> img2 <c- o>=</c-> <c- ow>new</c-> Image<c- p>();</c-> <c- c1>// Both assignments below work as expected</c-> img1<c- p>.</c->src <c- o>=</c-> blobURLref<c- p>;</c-> img2<c- p>.</c->src <c- o>=</c-> blobURLref<c- p>;</c-> <c- c1>// ... Following body load</c-> <c- c1>// Check if both images have loaded</c-> <c- k>if</c-><c- p>(</c->img1<c- p>.</c->complete <c- o>&&</c-> img2<c- p>.</c->complete<c- p>)</c-> <c- p>{</c-> <c- c1>// Ensure that subsequent refs throw an exception</c-> URL<c- p>.</c->revokeObjectURL<c- p>(</c->blobURLref<c- p>);</c-> <c- p>}</c-> <c- k>else</c-> <c- p>{</c-> msg<c- p>(</c-><c- u>"Images cannot be previewed!"</c-><c- p>);</c-> <c- c1>// revoke the string-based reference</c-> URL<c- p>.</c->revokeObjectURL<c- p>(</c->blobURLref<c- p>);</c-> <c- p>}</c-> </pre> </div> <p>The example above allows multiple references to a single <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①④">blob URL</a>, and the web developer then revokes the <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①⑤">blob URL</a> string after both image objects have been loaded. While not restricting number of uses of the <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①⑥">blob URL</a> offers more flexibility, it increases the likelihood of leaks; developers should pair it with a corresponding call to <code>URL.<code class="idl"><a data-link-type="idl" href="#dfn-revokeObjectURL" id="ref-for-dfn-revokeObjectURL④">revokeObjectURL()</a></code></code>.</p> <h2 class="heading settled" data-level="9" id="security-discussion"><span class="secno">9. </span><span class="content">Security and Privacy Considerations</span><a class="self-link" href="#security-discussion"></a></h2> <p><em>This section is informative.</em></p> <p>This specification allows web content to read files from the underlying file system, as well as provides a means for files to be accessed by unique identifiers, and as such is subject to some security considerations. This specification also assumes that the primary user interaction is with the <code><input type="file"/></code> element of HTML forms <a data-link-type="biblio" href="#biblio-html" title="HTML Standard">[HTML]</a>, and that all files that are being read by <code class="idl"><a data-link-type="idl" href="#dfn-filereader" id="ref-for-dfn-filereader②④">FileReader</a></code> objects have first been selected by the user. Important security considerations include preventing malicious file selection attacks (selection looping), preventing access to system-sensitive files, and guarding against modifications of files on disk after a selection has taken place.</p> <dl> <dt data-md>Preventing selection looping <dd data-md> <p>During file selection, a user may be bombarded with the file picker associated with <code><input type="file"/></code> (in a "must choose" loop that forces selection before the file picker is dismissed) and a user agent may prevent file access to any selections by making the <code class="idl"><a data-link-type="idl" href="#dfn-filelist" id="ref-for-dfn-filelist①②">FileList</a></code> object returned be of size 0.</p> <dt data-md>System-sensitive files <dd data-md> <p>(e.g. files in /usr/bin, password files, and other native operating system executables) typically should not be exposed to web content, and should not be accessed via <a data-link-type="dfn" href="#blob-url" id="ref-for-blob-url①⑦">blob URLs</a>. User agents may <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#dfn-throw" id="ref-for-dfn-throw④">throw</a> a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#securityerror" id="ref-for-securityerror④">SecurityError</a></code> exception for synchronous read methods, or return a <code class="idl"><a data-link-type="idl" href="https://webidl.spec.whatwg.org/#securityerror" id="ref-for-securityerror⑤">SecurityError</a></code> exception for asynchronous reads.</p> </dl> <p class="issue" id="issue-61296551"><a class="self-link" href="#issue-61296551"></a> This section is provisional; more security data may supplement this in subsequent drafts.</p> <h2 class="heading settled" data-level="10" id="requirements"><span class="secno">10. </span><span class="content">Requirements and Use Cases</span><a class="self-link" href="#requirements"></a></h2> <p>This section covers what the requirements are for this API, as well as illustrates some use cases. This version of the API does not satisfy all use cases; subsequent versions may elect to address these.</p> <ul> <li data-md> <p>Once a user has given permission, user agents should provide the ability to read and parse data directly from a local file programmatically.</p> <div class="example" id="example-d8c3c684"><a class="self-link" href="#example-d8c3c684"></a> A lyrics viewer. User wants to read song lyrics from songs in his plist file. User browses for plist file. File is opened, read, parsed, and presented to the user as a sortable, actionable list within a web application. User can select songs to fetch lyrics. User uses the "browse for file" dialog. </div> <li data-md> <p>Data should be able to be stored locally so that it is available for later use, which is useful for offline data access for web applications.</p> <div class="example" id="example-950bb00a"><a class="self-link" href="#example-950bb00a"></a> A Calendar App. User’s company has a calendar. User wants to sync local events to company calendar, marked as "busy" slots (without leaking personal info). User browses for file and selects it. The <code>text/calendar</code> file is parsed in the browser, allowing the user to merge the files to one calendar view. The user wants to then save the file back to his local calendar file (using "Save As"?). The user can also send the integrated calendar file back to the server calendar store asynchronously. </div> <li data-md> <p>User agents should provide the ability to save a local file programmatically given an amount of data and a file name.</p> <p class="note" role="note"><span class="marker">Note:</span> While this specification doesn’t provide an explicit API call to trigger downloads, the HTML5 specification has addressed this. The <code><a data-link-type="element-sub" href="https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download" id="ref-for-attr-hyperlink-download">download</a></code> attribute of the <code><a data-link-type="element" href="https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element" id="ref-for-the-a-element">a</a></code> element initiates a download, saving a <code class="idl"><a data-link-type="idl" href="#dfn-file" id="ref-for-dfn-file④⑤">File</a></code> with the name specified. The combination of this API and the <code><a data-link-type="element-sub" href="https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download" id="ref-for-attr-hyperlink-download①">download</a></code> attribute on <code><a data-link-type="element" href="https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element" id="ref-for-the-a-element①">a</a></code> elements allows for the creation of files within web applications, and the ability to save them locally.</p> <div class="example" id="example-eb79e741"><a class="self-link" href="#example-eb79e741"></a> A Spreadsheet App. User interacts with a form, and generates some input. The form then generates a CSV (Comma Separated Variables) output for the user to import into a spreadsheet, and uses "Save...". The generated output can also be directly integrated into a web-based spreadsheet, and uploaded asynchronously. </div> <li data-md> <p>User agents should provide a streamlined programmatic ability to send data from a file to a remote server that works more efficiently than form-based uploads today.</p> <div class="example" id="example-5f8d4bd7"><a class="self-link" href="#example-5f8d4bd7"></a> A Video/Photo Upload App. User is able to select large files for upload, which can then be "chunk-transfered" to the server. </div> <li data-md> <p>User agents should provide an API exposed to script that exposes the features above. The user is notified by UI anytime interaction with the file system takes place, giving the user full ability to cancel or abort the transaction. The user is notified of any file selections, and can cancel these. No invocations to these APIs occur silently without user intervention.</p> </ul> <h2 class="no-num heading settled" id="acknowledgements-section"><span class="content"> Acknowledgements</span><a class="self-link" href="#acknowledgements-section"></a></h2> <p>This specification was originally developed by the SVG Working Group. Many thanks to Mark Baker and Anne van Kesteren for their feedback.</p> <p>Thanks to Robin Berjon, Jonas Sicking and Vsevolod Shmyroff for editing the original specification.</p> <p>Special thanks to Olli Pettay, Nikunj Mehta, Garrett Smith, Aaron Boodman, Michael Nordman, Jian Li, Dmitry Titov, Ian Hickson, Darin Fisher, Sam Weinig, Adrian Bateman and Julian Reschke.</p> <p>Thanks to the W3C WebApps WG, and to participants on the public-webapps@w3.org listserv</p> </main> <div data-fill-with="conformance"> <h2 class="no-ref no-num heading settled" id="w3c-conformance"><span class="content">Conformance</span><a class="self-link" href="#w3c-conformance"></a></h2> <h3 class="no-ref no-num heading settled" id="w3c-conventions"><span class="content">Document conventions</span><a class="self-link" href="#w3c-conventions"></a></h3> <p>Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification. </p> <p>All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. <a data-link-type="biblio" href="#biblio-rfc2119" title="Key words for use in RFCs to Indicate Requirement Levels">[RFC2119]</a> </p> <p>Examples in this specification are introduced with the words “for example” or are set apart from the normative text with <code>class="example"</code>, like this: </p> <div class="example" id="w3c-example"> <a class="self-link" href="#w3c-example"></a> <p>This is an example of an informative example. </p> </div> <p>Informative notes begin with the word “Note” and are set apart from the normative text with <code>class="note"</code>, like this: </p> <p class="note" role="note">Note, this is an informative note.</p> <section> <h3 class="no-ref no-num heading settled" id="w3c-conformant-algorithms"><span class="content">Conformant Algorithms</span><a class="self-link" href="#w3c-conformant-algorithms"></a></h3> <p>Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and abort these steps") are to be interpreted with the meaning of the key word ("must", "should", "may", etc) used in introducing the algorithm. </p> <p>Conformance requirements phrased as algorithms or specific steps can be implemented in any manner, so long as the end result is equivalent. In particular, the algorithms defined in this specification are intended to be easy to understand and are not intended to be performant. Implementers are encouraged to optimize. </p> </section> </div> <script src="https://www.w3.org/scripts/TR/2021/fixup.js"></script> <h2 class="no-num no-ref heading settled" id="index"><span class="content">Index</span><a class="self-link" href="#index"></a></h2> <h3 class="no-num no-ref heading settled" id="index-defined-here"><span class="content">Terms defined by this specification</span><a class="self-link" href="#index-defined-here"></a></h3> <ul class="index"> <li><a href="#dfn-abort-event">abort</a><span>, in § 6.4.1</span> <li><a href="#dfn-abort">abort()</a><span>, in § 6.2.3.5</span> <li><a href="#add-an-entry">add an entry</a><span>, in § 8.2</span> <li><a href="#add-an-entry">add an entry to the blob URL store</a><span>, in § 8.2</span> <li><a href="#add-an-entry">adding an entry to the blob URL store</a><span>, in § 8.2</span> <li><a href="#add-an-entry">add the entry</a><span>, in § 8.2</span> <li><a href="#add-an-entry">add the entry to the blob URL store</a><span>, in § 8.2</span> <li><a href="#dom-blob-arraybuffer">arrayBuffer()</a><span>, in § 3.3.4</span> <li><a href="#asynchronous-read-methods">asynchronous read method</a><span>, in § 6.2.3</span> <li><a href="#dfn-Blob">Blob</a><span>, in § 3</span> <li><a href="#dom-blob-blob">Blob()</a><span>, in § 3</span> <li><a href="#dom-blob-blob">Blob(blobParts)</a><span>, in § 3</span> <li><a href="#dom-blob-blob">Blob(blobParts, options)</a><span>, in § 3</span> <li><a href="#typedefdef-blobpart">BlobPart</a><span>, in § 3</span> <li><a href="#dfn-BlobPropertyBag">BlobPropertyBag</a><span>, in § 3</span> <li><a href="#blob-url">blob URL</a><span>, in § 8.2</span> <li><a href="#blob-url-entry">blob URL entry</a><span>, in § 8.2</span> <li><a href="#BlobURLStore">blob URL store</a><span>, in § 8.2</span> <li><a href="#dom-blob-bytes">bytes()</a><span>, in § 3.3.5</span> <li><a href="#check-for-same-partition-blob-url-usage">check for same-partition blob URL usage</a><span>, in § 8.3.2</span> <li> constructor() <ul> <li><a href="#dom-blob-blob">constructor for Blob</a><span>, in § 3</span> <li><a href="#filereaderConstrctr">constructor for FileReader</a><span>, in § 6.2</span> <li><a href="#dom-filereadersync-filereadersync">constructor for FileReaderSync</a><span>, in § 6.5.1</span> </ul> <li><a href="#dom-blob-blob">constructor(blobParts)</a><span>, in § 3</span> <li><a href="#dom-blob-blob">constructor(blobParts, options)</a><span>, in § 3</span> <li><a href="#dom-file-file">constructor(fileBits, fileName)</a><span>, in § 4</span> <li><a href="#dom-file-file">constructor(fileBits, fileName, options)</a><span>, in § 4</span> <li><a href="#convert-line-endings-to-native">converting line endings to native</a><span>, in § 3.1.1</span> <li><a href="#convert-line-endings-to-native">convert line endings to native</a><span>, in § 3.1.1</span> <li><a href="#dfn-createObjectURL">createObjectURL(obj)</a><span>, in § 8.4</span> <li><a href="#dom-filereader-done">DONE</a><span>, in § 6.2</span> <li><a href="#dom-filereader-empty">EMPTY</a><span>, in § 6.2</span> <li><a href="#dom-blobpropertybag-endings">endings</a><span>, in § 3.1.1</span> <li><a href="#enumdef-endingtype">EndingType</a><span>, in § 3</span> <li><a href="#blob-url-entry-environment">environment</a><span>, in § 8.2</span> <li> error <ul> <li><a href="#dom-filereader-error">attribute for FileReader</a><span>, in § 6.2</span> <li><a href="#filereader-error">dfn for FileReader</a><span>, in § 6.2</span> <li><a href="#dfn-error-event">event for FileReader</a><span>, in § 6.4.1</span> </ul> <li><a href="#failureReason">failure reason</a><span>, in § 7.1</span> <li><a href="#dfn-file">File</a><span>, in § 4</span> <li><a href="#dom-file-file">File(fileBits, fileName)</a><span>, in § 4</span> <li><a href="#dom-file-file">File(fileBits, fileName, options)</a><span>, in § 4</span> <li><a href="#dfn-filelist">FileList</a><span>, in § 5</span> <li><a href="#FileLockFR">FileLock</a><span>, in § 7.1</span> <li><a href="#dfn-FilePropertyBag">FilePropertyBag</a><span>, in § 4</span> <li><a href="#dfn-filereader">FileReader</a><span>, in § 6.2</span> <li><a href="#filereaderConstrctr">FileReader()</a><span>, in § 6.2</span> <li><a href="#file-error-read">file read error</a><span>, in § 7</span> <li><a href="#dfn-FileReaderSync">FileReaderSync</a><span>, in § 6.5.1</span> <li><a href="#dom-filereadersync-filereadersync">FileReaderSync()</a><span>, in § 6.5.1</span> <li><a href="#fileReadingTaskSource">file reading task source</a><span>, in § 6.1</span> <li><a href="#file-type-guidelines">file type guidelines</a><span>, in § 4</span> <li><a href="#fire-a-progress-event">fire a progress event</a><span>, in § 6.4</span> <li><a href="#unicodeBlobURL">generate a new blob URL</a><span>, in § 8.2</span> <li><a href="#unicodeBlobURL">generating a new blob URL</a><span>, in § 8.2</span> <li><a href="#blob-get-stream">get stream</a><span>, in § 3</span> <li><a href="#dfn-item">item(index)</a><span>, in § 5.2</span> <li> lastModified <ul> <li><a href="#dfn-lastModified">attribute for File</a><span>, in § 4.2</span> <li><a href="#dfn-FPdate">dict-member for FilePropertyBag</a><span>, in § 4.1.1</span> </ul> <li><a href="#dfn-length">length</a><span>, in § 5.1</span> <li><a href="#lifeTime">lifetime</a><span>, in § 8.3.2</span> <li><a href="#lifeTime">lifetime stipulation</a><span>, in § 8.3.2</span> <li><a href="#dfn-load-event">load</a><span>, in § 6.4.1</span> <li><a href="#dfn-loadend-event">loadend</a><span>, in § 6.4.1</span> <li><a href="#dom-filereader-loading">LOADING</a><span>, in § 6.2</span> <li><a href="#dfn-loadstart-event">loadstart</a><span>, in § 6.4.1</span> <li><a href="#dfn-name">name</a><span>, in § 4.2</span> <li><a href="#dom-endingtype-native">"native"</a><span>, in § 3</span> <li><a href="#NotFoundFR">NotFound</a><span>, in § 7.1</span> <li><a href="#blob-url-entry-object">object</a><span>, in § 8.2</span> <li><a href="#blob-url">object URL</a><span>, in § 8.2</span> <li><a href="#blob-url-obtain-object">obtain a blob object</a><span>, in § 8.2</span> <li><a href="#dfn-onabort">onabort</a><span>, in § 6.2.1</span> <li><a href="#dfn-onerror">onerror</a><span>, in § 6.2.1</span> <li><a href="#dfn-onload">onload</a><span>, in § 6.2.1</span> <li><a href="#dfn-onloadend">onloadend</a><span>, in § 6.2.1</span> <li><a href="#dfn-onloadstart">onloadstart</a><span>, in § 6.2.1</span> <li><a href="#dfn-onprogress">onprogress</a><span>, in § 6.2.1</span> <li><a href="#blob-package-data">package data</a><span>, in § 6.3</span> <li><a href="#process-blob-parts">process blob parts</a><span>, in § 3.1.1</span> <li><a href="#process-blob-parts">processing blob parts</a><span>, in § 3.1.1</span> <li><a href="#dfn-progress-event">progress</a><span>, in § 6.4.1</span> <li> readAsArrayBuffer(blob) <ul> <li><a href="#dfn-readAsArrayBuffer">method for FileReader</a><span>, in § 6.2.3.3</span> <li><a href="#dfn-readAsArrayBufferSync">method for FileReaderSync</a><span>, in § 6.5.1.4</span> </ul> <li> readAsBinaryString(blob) <ul> <li><a href="#dfn-readAsBinaryString">method for FileReader</a><span>, in § 6.2.3.4</span> <li><a href="#dfn-readAsBinaryStringSync">method for FileReaderSync</a><span>, in § 6.5.1.5</span> </ul> <li> readAsDataURL(blob) <ul> <li><a href="#dfn-readAsDataURL">method for FileReader</a><span>, in § 6.2.3.1</span> <li><a href="#dfn-readAsDataURLSync">method for FileReaderSync</a><span>, in § 6.5.1.3</span> </ul> <li> readAsText(blob) <ul> <li><a href="#dfn-readAsText">method for FileReader</a><span>, in § 6.2.3.2</span> <li><a href="#dfn-readAsTextSync">method for FileReaderSync</a><span>, in § 6.5.1.2</span> </ul> <li> readAsText(blob, encoding) <ul> <li><a href="#dfn-readAsText">method for FileReader</a><span>, in § 6.2.3.2</span> <li><a href="#dfn-readAsTextSync">method for FileReaderSync</a><span>, in § 6.5.1.2</span> </ul> <li><a href="#read-method">read method</a><span>, in § 6.2.3</span> <li><a href="#readOperation">read operation</a><span>, in § 6.2</span> <li><a href="#dom-filereader-readystate">readyState</a><span>, in § 6.2</span> <li><a href="#removeTheEntry">remove an entry</a><span>, in § 8.2</span> <li><a href="#removeTheEntry">remove an entry from the blob URL store</a><span>, in § 8.2</span> <li><a href="#removeTheEntry">remove the entry</a><span>, in § 8.2</span> <li><a href="#removeTheEntry">remove the entry from the blob URL store</a><span>, in § 8.2</span> <li><a href="#blob-url-resolve">resolve a blob URL</a><span>, in § 8.3</span> <li> result <ul> <li><a href="#dom-filereader-result">attribute for FileReader</a><span>, in § 6.2</span> <li><a href="#filereader-result">dfn for FileReader</a><span>, in § 6.2</span> </ul> <li><a href="#dfn-revokeObjectURL">revokeObjectURL(url)</a><span>, in § 8.4</span> <li><a href="#dfn-size">size</a><span>, in § 3.2</span> <li><a href="#dfn-slice">slice()</a><span>, in § 3.3.1</span> <li><a href="#slice-blob">slice blob</a><span>, in § 2</span> <li><a href="#dfn-slice">slice(start)</a><span>, in § 3.3.1</span> <li><a href="#dfn-slice">slice(start, end)</a><span>, in § 3.3.1</span> <li><a href="#dfn-slice">slice(start, end, contentType)</a><span>, in § 3.3.1</span> <li><a href="#dfn-slice">slice(start, end, contentType), slice(start, end), slice(start), slice()</a><span>, in § 3.3.1</span> <li><a href="#snapshot-state">snapshot state</a><span>, in § 3</span> <li><a href="#SnapshotStateFR">SnapshotState</a><span>, in § 7.1</span> <li><a href="#filereader-state">state</a><span>, in § 6.2</span> <li><a href="#dom-blob-stream">stream()</a><span>, in § 3.3.2</span> <li><a href="#read-method-sync">synchronous read method</a><span>, in § 6.5.1</span> <li><a href="#terminate-an-algorithm">terminate an algorithm</a><span>, in § 2</span> <li><a href="#terminate-an-algorithm">terminate this algorithm</a><span>, in § 2</span> <li><a href="#dom-blob-text">text()</a><span>, in § 3.3.3</span> <li><a href="#TooManyReadsFR">TooManyReads</a><span>, in § 7.1</span> <li><a href="#dom-endingtype-transparent">"transparent"</a><span>, in § 3</span> <li> type <ul> <li><a href="#dfn-type">attribute for Blob</a><span>, in § 3.2</span> <li><a href="#dfn-BPtype">dict-member for BlobPropertyBag</a><span>, in § 3.1.1</span> </ul> <li><a href="#UnixEpoch">Unix Epoch</a><span>, in § 2</span> <li><a href="#UnsafeFileFR">UnsafeFile</a><span>, in § 7.1</span> </ul> <h3 class="no-num no-ref heading settled" id="index-defined-elsewhere"><span class="content">Terms defined by reference</span><a class="self-link" href="#index-defined-elsewhere"></a></h3> <ul class="index"> <li> <a data-link-type="biblio">[DOM]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="85394472">Document</span> <li><span class="dfn-paneled" id="2bc0cdf4">EventTarget</span> <li><span class="dfn-paneled" id="5fd23811">fire an event</span> </ul> <li> <a data-link-type="biblio">[ECMA-262]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="c8b89a7b">Array</span> <li><span class="dfn-paneled" id="b1cd2079">Date</span> </ul> <li> <a data-link-type="biblio">[ENCODING]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="58b7ba18">decode</span> <li><span class="dfn-paneled" id="8ddcd9b8">getting an encoding</span> <li><span class="dfn-paneled" id="bffb633e">UTF-8</span> <li><span class="dfn-paneled" id="b0fcb8d7">UTF-8 decode</span> <li><span class="dfn-paneled" id="0303e8e5">UTF-8 encode</span> </ul> <li> <a data-link-type="biblio">[Fetch]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="a33db89a">fetch</span> <li><span class="dfn-paneled" id="eb1b1af3">network error</span> <li><span class="dfn-paneled" id="36219a2a">text()</span> </ul> <li> <a data-link-type="biblio">[HTML]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="2b83ae0c">DataTransfer</span> <li><span class="dfn-paneled" id="f0951476">EventHandler</span> <li><span class="dfn-paneled" id="83b269de">HTMLInputElement</span> <li><span class="dfn-paneled" id="eb5c4be3">Serializable</span> <li><span class="dfn-paneled" id="68bf3d31">a</span> <li><span class="dfn-paneled" id="b410a6ef">ASCII serialization of an origin</span> <li><span class="dfn-paneled" id="12b8dfc0">current settings object</span> <li><span class="dfn-paneled" id="888d7c65">deserialization steps</span> <li><span class="dfn-paneled" id="c49c2ced">download</span> <li><span class="dfn-paneled" id="3e12e042">environment settings object</span> <li><span class="dfn-paneled" id="cc6d9aed">event handler content attribute</span> <li><span class="dfn-paneled" id="9d386f55">event handler event type</span> <li><span class="dfn-paneled" id="87fcd40c">iframe</span> <li><span class="dfn-paneled" id="f0811ff8">img</span> <li><span class="dfn-paneled" id="a72449dd">in parallel</span> <li><span class="dfn-paneled" id="d7d642a2">input</span> <li><span class="dfn-paneled" id="43ac8374">origin</span> <li><span class="dfn-paneled" id="6747f355">postMessage(message, options)</span> <li><span class="dfn-paneled" id="48438eb3">queue a global task</span> <li><span class="dfn-paneled" id="9a517a7d">queue a task</span> <li><span class="dfn-paneled" id="e99bd18e">relevant global object</span> <li><span class="dfn-paneled" id="5991ccfb">relevant realm</span> <li><span class="dfn-paneled" id="9c4c1e66">relevant settings object</span> <li><span class="dfn-paneled" id="7393da89">same origin</span> <li><span class="dfn-paneled" id="0a422d04">serializable object</span> <li><span class="dfn-paneled" id="f32dc6c1">serialization steps</span> <li><span class="dfn-paneled" id="c187d599">sub-deserialization</span> <li><span class="dfn-paneled" id="d76ab844">sub-serialization</span> <li><span class="dfn-paneled" id="e270bd2a">task</span> <li><span class="dfn-paneled" id="c3b2d08c">task source</span> <li><span class="dfn-paneled" id="4411082c">unloading document cleanup steps</span> </ul> <li> <a data-link-type="biblio">[INFRA]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="6f2dfa22">ASCII lowercase</span> <li><span class="dfn-paneled" id="77b4c09a">assert</span> <li><span class="dfn-paneled" id="f5354b9d">byte</span> <li><span class="dfn-paneled" id="3de9e659">byte sequence</span> <li><span class="dfn-paneled" id="915aff5e">code point</span> <li><span class="dfn-paneled" id="60184fa5">collecting a sequence of code points</span> <li><span class="dfn-paneled" id="1243a891">exist</span> <li><span class="dfn-paneled" id="16d07e10">for each</span> <li><span class="dfn-paneled" id="31db57e6">keys</span> <li><span class="dfn-paneled" id="649608b9">list</span> <li><span class="dfn-paneled" id="3fca5a9e">map</span> <li><span class="dfn-paneled" id="75bee4d5">position variable</span> <li><span class="dfn-paneled" id="7d4424b2">remove</span> <li><span class="dfn-paneled" id="0e6b2056">set</span> <li><span class="dfn-paneled" id="0698d556">string</span> <li><span class="dfn-paneled" id="802b0fdd">value</span> <li><span class="dfn-paneled" id="12d6b9a8">values</span> </ul> <li> <a data-link-type="biblio">[MEDIA-SOURCE-2]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="1cd4985f">MediaSource</span> </ul> <li> <a data-link-type="biblio">[MIMESNIFF]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="fc5a3214">parameters</span> <li><span class="dfn-paneled" id="678221b9">parsable mime type</span> <li><span class="dfn-paneled" id="d72dabca">parse a MIME type</span> </ul> <li> <a data-link-type="biblio">[SERVICE-WORKERS]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="7d16decb">storage key</span> </ul> <li> <a data-link-type="biblio">[STORAGE]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="8d831b4d">equal</span> <li><span class="dfn-paneled" id="76919410">obtain a storage key for non-storage purposes</span> </ul> <li> <a data-link-type="biblio">[STREAMS]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="59ed4e57">ReadableStream</span> <li><span class="dfn-paneled" id="2d10bf58">chunk</span> <li><span class="dfn-paneled" id="6b6bb798">enqueue</span> <li><span class="dfn-paneled" id="3bd18bd6">error</span> <li><span class="dfn-paneled" id="ef28f15d">get a reader</span> <li><span class="dfn-paneled" id="ad191408">read a chunk</span> <li><span class="dfn-paneled" id="742b8bae">read all bytes</span> <li><span class="dfn-paneled" id="c0350ab0">set up with byte reading support</span> </ul> <li> <a data-link-type="biblio">[URL]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="f06432d7">URL</span> <li><span class="dfn-paneled" id="cfc67fdc">empty host</span> <li><span class="dfn-paneled" id="c0868016">path</span> <li><span class="dfn-paneled" id="3a711be7">scheme</span> <li><span class="dfn-paneled" id="dcffbccd">URL</span> <li><span class="dfn-paneled" id="ca3ca4ae">URL parser</span> <li><span class="dfn-paneled" id="5442ea33">URL serializer</span> <li><span class="dfn-paneled" id="05af0c3f">valid URL string</span> </ul> <li> <a data-link-type="biblio">[WebIDL]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="2f8afbfe">ArrayBuffer</span> <li><span class="dfn-paneled" id="3aff2fb3">BufferSource</span> <li><span class="dfn-paneled" id="f89c7d0d">Clamp</span> <li><span class="dfn-paneled" id="dca2de17">DOMException</span> <li><span class="dfn-paneled" id="8855a9aa">DOMString</span> <li><span class="dfn-paneled" id="889e932f">Exposed</span> <li><span class="dfn-paneled" id="797018a7">InvalidStateError</span> <li><span class="dfn-paneled" id="c807e273">NewObject</span> <li><span class="dfn-paneled" id="9eda9b58">NotFoundError</span> <li><span class="dfn-paneled" id="0be3911e">NotReadableError</span> <li><span class="dfn-paneled" id="bdbd19d1">Promise</span> <li><span class="dfn-paneled" id="c3e881ef">SecurityError</span> <li><span class="dfn-paneled" id="b0d7f3c3">USVString</span> <li><span class="dfn-paneled" id="95d7775a">Uint8Array</span> <li><span class="dfn-paneled" id="92d13070">get a copy of the buffer source</span> <li><span class="dfn-paneled" id="9aeb0a82">long long</span> <li><span class="dfn-paneled" id="56f81a8e">new</span> <li><span class="dfn-paneled" id="9cce47fd">sequence</span> <li><span class="dfn-paneled" id="e031fa01">supported property indices</span> <li><span class="dfn-paneled" id="4013a022">this</span> <li><span class="dfn-paneled" id="b4cfa5ce">throw</span> <li><span class="dfn-paneled" id="5f90bbfb">undefined</span> <li><span class="dfn-paneled" id="e97a9688">unsigned long</span> <li><span class="dfn-paneled" id="f14b47b8">unsigned long long</span> <li><span class="dfn-paneled" id="450958f7">unsigned short</span> </ul> <li> <a data-link-type="biblio">[XHR]</a> defines the following terms: <ul> <li><span class="dfn-paneled" id="7b0dc914">ProgressEvent</span> <li><span class="dfn-paneled" id="d06b2b8c">XMLHttpRequest</span> <li><span class="dfn-paneled" id="56320452">send()</span> </ul> </ul> <h2 class="no-num no-ref heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2> <h3 class="no-num no-ref heading settled" id="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3> <dl> <dt id="biblio-dom">[DOM] <dd>Anne van Kesteren. <a href="https://dom.spec.whatwg.org/"><cite>DOM Standard</cite></a>. Living Standard. URL: <a href="https://dom.spec.whatwg.org/">https://dom.spec.whatwg.org/</a> <dt id="biblio-ecma-262">[ECMA-262] <dd><a href="https://tc39.es/ecma262/multipage/"><cite>ECMAScript Language Specification</cite></a>. URL: <a href="https://tc39.es/ecma262/multipage/">https://tc39.es/ecma262/multipage/</a> <dt id="biblio-encoding">[ENCODING] <dd>Anne van Kesteren. <a href="https://encoding.spec.whatwg.org/"><cite>Encoding Standard</cite></a>. Living Standard. URL: <a href="https://encoding.spec.whatwg.org/">https://encoding.spec.whatwg.org/</a> <dt id="biblio-fetch">[Fetch] <dd>Anne van Kesteren. <a href="https://fetch.spec.whatwg.org/"><cite>Fetch Standard</cite></a>. Living Standard. URL: <a href="https://fetch.spec.whatwg.org/">https://fetch.spec.whatwg.org/</a> <dt id="biblio-html">[HTML] <dd>Anne van Kesteren; et al. <a href="https://html.spec.whatwg.org/multipage/"><cite>HTML Standard</cite></a>. Living Standard. URL: <a href="https://html.spec.whatwg.org/multipage/">https://html.spec.whatwg.org/multipage/</a> <dt id="biblio-infra">[INFRA] <dd>Anne van Kesteren; Domenic Denicola. <a href="https://infra.spec.whatwg.org/"><cite>Infra Standard</cite></a>. Living Standard. URL: <a href="https://infra.spec.whatwg.org/">https://infra.spec.whatwg.org/</a> <dt id="biblio-media-source-2">[MEDIA-SOURCE-2] <dd>Jean-Yves Avenard; Mark Watson. <a href="https://w3c.github.io/media-source/"><cite>Media Source Extensions™</cite></a>. URL: <a href="https://w3c.github.io/media-source/">https://w3c.github.io/media-source/</a> <dt id="biblio-mimesniff">[MIMESNIFF] <dd>Gordon P. Hemsley. <a href="https://mimesniff.spec.whatwg.org/"><cite>MIME Sniffing Standard</cite></a>. Living Standard. URL: <a href="https://mimesniff.spec.whatwg.org/">https://mimesniff.spec.whatwg.org/</a> <dt id="biblio-rfc2119">[RFC2119] <dd>S. Bradner. <a href="https://datatracker.ietf.org/doc/html/rfc2119"><cite>Key words for use in RFCs to Indicate Requirement Levels</cite></a>. March 1997. Best Current Practice. URL: <a href="https://datatracker.ietf.org/doc/html/rfc2119">https://datatracker.ietf.org/doc/html/rfc2119</a> <dt id="biblio-rfc2397">[RFC2397] <dd>L. Masinter. <a href="https://www.rfc-editor.org/rfc/rfc2397"><cite>The "data" URL scheme</cite></a>. August 1998. Proposed Standard. URL: <a href="https://www.rfc-editor.org/rfc/rfc2397">https://www.rfc-editor.org/rfc/rfc2397</a> <dt id="biblio-rfc4122">[RFC4122] <dd>K. Davis; B. Peabody; P. Leach. <a href="https://www.rfc-editor.org/rfc/rfc9562"><cite>Universally Unique IDentifiers (UUIDs)</cite></a>. May 2024. Proposed Standard. URL: <a href="https://www.rfc-editor.org/rfc/rfc9562">https://www.rfc-editor.org/rfc/rfc9562</a> <dt id="biblio-service-workers">[SERVICE-WORKERS] <dd>Jake Archibald; Marijn Kruisselbrink. <a href="https://w3c.github.io/ServiceWorker/"><cite>Service Workers</cite></a>. URL: <a href="https://w3c.github.io/ServiceWorker/">https://w3c.github.io/ServiceWorker/</a> <dt id="biblio-storage">[STORAGE] <dd>Anne van Kesteren. <a href="https://storage.spec.whatwg.org/"><cite>Storage Standard</cite></a>. Living Standard. URL: <a href="https://storage.spec.whatwg.org/">https://storage.spec.whatwg.org/</a> <dt id="biblio-streams">[STREAMS] <dd>Adam Rice; et al. <a href="https://streams.spec.whatwg.org/"><cite>Streams Standard</cite></a>. Living Standard. URL: <a href="https://streams.spec.whatwg.org/">https://streams.spec.whatwg.org/</a> <dt id="biblio-url">[URL] <dd>Anne van Kesteren. <a href="https://url.spec.whatwg.org/"><cite>URL Standard</cite></a>. Living Standard. URL: <a href="https://url.spec.whatwg.org/">https://url.spec.whatwg.org/</a> <dt id="biblio-webidl">[WebIDL] <dd>Edgar Chen; Timothy Gu. <a href="https://webidl.spec.whatwg.org/"><cite>Web IDL Standard</cite></a>. Living Standard. URL: <a href="https://webidl.spec.whatwg.org/">https://webidl.spec.whatwg.org/</a> <dt id="biblio-xhr">[XHR] <dd>Anne van Kesteren. <a href="https://xhr.spec.whatwg.org/"><cite>XMLHttpRequest Standard</cite></a>. Living Standard. URL: <a href="https://xhr.spec.whatwg.org/">https://xhr.spec.whatwg.org/</a> </dl> <h3 class="no-num no-ref heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3> <dl> <dt id="biblio-workers">[Workers] <dd>Ian Hickson. <a href="https://html.spec.whatwg.org/multipage/workers.html"><cite>Web Workers</cite></a>. URL: <a href="https://html.spec.whatwg.org/multipage/workers.html">https://html.spec.whatwg.org/multipage/workers.html</a> </dl> <h2 class="no-num no-ref heading settled" id="idl-index"><span class="content">IDL Index</span><a class="self-link" href="#idl-index"></a></h2> <pre class="idl highlight def">[<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->), <a class="idl-code" data-link-type="extended-attribute" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable"><c- g>Serializable</c-></a>] <c- b>interface</c-> <a href="#dfn-Blob"><code><c- g>Blob</c-></code></a> { <a href="#dom-blob-blob"><code><c- g>constructor</c-></code></a>(<c- b>optional</c-> <a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#idl-sequence"><c- b>sequence</c-></a><<a data-link-type="idl-name" href="#typedefdef-blobpart"><c- n>BlobPart</c-></a>> <a class="idl-code" data-link-type="argument" href="#dfn-blobParts"><c- g>blobParts</c-></a>, <c- b>optional</c-> <a data-link-type="idl-name" href="#dfn-BlobPropertyBag"><c- n>BlobPropertyBag</c-></a> <a href="#dom-blob-blob-blobparts-options-options"><code><c- g>options</c-></code></a> = {}); <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-long-long"><c- b>unsigned</c-> <c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned long long" href="#dfn-size"><c- g>size</c-></a>; <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="DOMString" href="#dfn-type"><c- g>type</c-></a>; // slice Blob into byte-ranged chunks <a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-slice"><c- g>slice</c-></a>(<c- b>optional</c-> [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Clamp"><c- g>Clamp</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long"><c- b>long</c-> <c- b>long</c-></a> <a href="#dom-blob-slice-start-end-contenttype-start"><code><c- g>start</c-></code></a>, <c- b>optional</c-> [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Clamp"><c- g>Clamp</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long"><c- b>long</c-> <c- b>long</c-></a> <a href="#dom-blob-slice-start-end-contenttype-end"><code><c- g>end</c-></code></a>, <c- b>optional</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a href="#dom-blob-slice-start-end-contenttype-contenttype"><code><c- g>contentType</c-></code></a>); // read from the Blob. [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject"><c- g>NewObject</c-></a>] <a data-link-type="idl-name" href="https://streams.spec.whatwg.org/#readablestream"><c- n>ReadableStream</c-></a> <a class="idl-code" data-link-type="method" href="#dom-blob-stream"><c- g>stream</c-></a>(); [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject"><c- g>NewObject</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-promise"><c- b>Promise</c-></a><<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-USVString"><c- b>USVString</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-blob-text"><c- g>text</c-></a>(); [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject"><c- g>NewObject</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-promise"><c- b>Promise</c-></a><<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer"><c- b>ArrayBuffer</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-blob-arraybuffer"><c- g>arrayBuffer</c-></a>(); [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#NewObject"><c- g>NewObject</c-></a>] <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-promise"><c- b>Promise</c-></a><<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-Uint8Array"><c- b>Uint8Array</c-></a>> <a class="idl-code" data-link-type="method" href="#dom-blob-bytes"><c- g>bytes</c-></a>(); }; <c- b>enum</c-> <a href="#enumdef-endingtype"><code><c- g>EndingType</c-></code></a> { <a href="#dom-endingtype-transparent"><code><c- s>"transparent"</c-></code></a>, <a href="#dom-endingtype-native"><code><c- s>"native"</c-></code></a> }; <c- b>dictionary</c-> <a href="#dfn-BlobPropertyBag"><code><c- g>BlobPropertyBag</c-></code></a> { <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-default="""" data-link-type="dict-member" data-type="DOMString" href="#dfn-BPtype"><c- g>type</c-></a> = ""; <a data-link-type="idl-name" href="#enumdef-endingtype"><c- n>EndingType</c-></a> <a class="idl-code" data-default=""transparent"" data-link-type="dict-member" data-type="EndingType" href="#dom-blobpropertybag-endings"><c- g>endings</c-></a> = "transparent"; }; <c- b>typedef</c-> (<a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#BufferSource"><c- n>BufferSource</c-></a> <c- b>or</c-> <a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <c- b>or</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-USVString"><c- b>USVString</c-></a>) <a href="#typedefdef-blobpart"><code><c- g>BlobPart</c-></code></a>; [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->), <a class="idl-code" data-link-type="extended-attribute" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable"><c- g>Serializable</c-></a>] <c- b>interface</c-> <a href="#dfn-file"><code><c- g>File</c-></code></a> : <a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> { <a href="#dom-file-file"><code><c- g>constructor</c-></code></a>(<a data-link-type="dfn" href="https://webidl.spec.whatwg.org/#idl-sequence"><c- b>sequence</c-></a><<a data-link-type="idl-name" href="#typedefdef-blobpart"><c- n>BlobPart</c-></a>> <a class="idl-code" data-link-type="argument" href="#dfn-fileBits"><c- g>fileBits</c-></a>, <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-USVString"><c- b>USVString</c-></a> <a class="idl-code" data-link-type="argument" href="#dfn-fileName"><c- g>fileName</c-></a>, <c- b>optional</c-> <a data-link-type="idl-name" href="#dfn-FilePropertyBag"><c- n>FilePropertyBag</c-></a> <a href="#dom-file-file-filebits-filename-options-options"><code><c- g>options</c-></code></a> = {}); <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="DOMString" href="#dfn-name"><c- g>name</c-></a>; <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long"><c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="long long" href="#dfn-lastModified"><c- g>lastModified</c-></a>; }; <c- b>dictionary</c-> <a href="#dfn-FilePropertyBag"><code><c- g>FilePropertyBag</c-></code></a> : <a data-link-type="idl-name" href="#dfn-BlobPropertyBag"><c- n>BlobPropertyBag</c-></a> { <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-long-long"><c- b>long</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="dict-member" data-type="long long" href="#dfn-FPdate"><c- g>lastModified</c-></a>; }; [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->), <a class="idl-code" data-link-type="extended-attribute" href="https://html.spec.whatwg.org/multipage/structured-data.html#serializable"><c- g>Serializable</c-></a>] <c- b>interface</c-> <a href="#dfn-filelist"><code><c- g>FileList</c-></code></a> { <c- b>getter</c-> <a data-link-type="idl-name" href="#dfn-file"><c- n>File</c-></a>? <a class="idl-code" data-link-type="method" href="#dfn-item"><c- g>item</c-></a>(<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-long"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="argument" href="#dfn-index"><c- g>index</c-></a>); <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-long"><c- b>unsigned</c-> <c- b>long</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned long" href="#dfn-length"><c- g>length</c-></a>; }; [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>Worker</c->)] <c- b>interface</c-> <a href="#dfn-filereader"><code><c- g>FileReader</c-></code></a>: <a data-link-type="idl-name" href="https://dom.spec.whatwg.org/#eventtarget"><c- n>EventTarget</c-></a> { <a class="idl-code" data-link-type="constructor" href="#filereaderConstrctr"><c- g>constructor</c-></a>(); // async read methods <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsArrayBuffer"><c- g>readAsArrayBuffer</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereader-readasarraybuffer-blob-blob"><code><c- g>blob</c-></code></a>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsBinaryString"><c- g>readAsBinaryString</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereader-readasbinarystring-blob-blob"><code><c- g>blob</c-></code></a>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsText"><c- g>readAsText</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereader-readastext-blob-encoding-blob"><code><c- g>blob</c-></code></a>, <c- b>optional</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a href="#dom-filereader-readastext-blob-encoding-encoding"><code><c- g>encoding</c-></code></a>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsDataURL"><c- g>readAsDataURL</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereader-readasdataurl-blob-blob"><code><c- g>blob</c-></code></a>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-abort"><c- g>abort</c-></a>(); // states <c- b>const</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short"><c- b>unsigned</c-> <c- b>short</c-></a> <a href="#dom-filereader-empty"><code><c- g>EMPTY</c-></code></a> = 0; <c- b>const</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short"><c- b>unsigned</c-> <c- b>short</c-></a> <a href="#dom-filereader-loading"><code><c- g>LOADING</c-></code></a> = 1; <c- b>const</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short"><c- b>unsigned</c-> <c- b>short</c-></a> <a href="#dom-filereader-done"><code><c- g>DONE</c-></code></a> = 2; <c- b>readonly</c-> <c- b>attribute</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-unsigned-short"><c- b>unsigned</c-> <c- b>short</c-></a> <a class="idl-code" data-link-type="attribute" data-readonly data-type="unsigned short" href="#dom-filereader-readystate"><c- g>readyState</c-></a>; // File or Blob data <c- b>readonly</c-> <c- b>attribute</c-> (<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <c- b>or</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer"><c- b>ArrayBuffer</c-></a>)? <a class="idl-code" data-link-type="attribute" data-readonly data-type="(DOMString or ArrayBuffer)?" href="#dom-filereader-result"><c- g>result</c-></a>; <c- b>readonly</c-> <c- b>attribute</c-> <a data-link-type="idl-name" href="https://webidl.spec.whatwg.org/#idl-DOMException"><c- n>DOMException</c-></a>? <a class="idl-code" data-link-type="attribute" data-readonly data-type="DOMException?" href="#dom-filereader-error"><c- g>error</c-></a>; // event handler content attributes <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onloadstart"><c- g>onloadstart</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onprogress"><c- g>onprogress</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onload"><c- g>onload</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onabort"><c- g>onabort</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onerror"><c- g>onerror</c-></a>; <c- b>attribute</c-> <a data-link-type="idl-name" href="https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"><c- n>EventHandler</c-></a> <a class="idl-code" data-link-type="attribute" data-type="EventHandler" href="#dfn-onloadend"><c- g>onloadend</c-></a>; }; [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed"><c- g>Exposed</c-></a>=(<c- n>DedicatedWorker</c->,<c- n>SharedWorker</c->)] <c- b>interface</c-> <a href="#dfn-FileReaderSync"><code><c- g>FileReaderSync</c-></code></a> { <a href="#dom-filereadersync-filereadersync"><code><c- g>constructor</c-></code></a>(); // Synchronously return strings <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-ArrayBuffer"><c- b>ArrayBuffer</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsArrayBufferSync"><c- g>readAsArrayBuffer</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereadersync-readasarraybuffer-blob-blob"><code><c- g>blob</c-></code></a>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsBinaryStringSync"><c- g>readAsBinaryString</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereadersync-readasbinarystring-blob-blob"><code><c- g>blob</c-></code></a>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsTextSync"><c- g>readAsText</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereadersync-readastext-blob-encoding-blob"><code><c- g>blob</c-></code></a>, <c- b>optional</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a href="#dom-filereadersync-readastext-blob-encoding-encoding"><code><c- g>encoding</c-></code></a>); <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-readAsDataURLSync"><c- g>readAsDataURL</c-></a>(<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <a href="#dom-filereadersync-readasdataurl-blob-blob"><code><c- g>blob</c-></code></a>); }; [<a class="idl-code" data-link-type="extended-attribute" href="https://webidl.spec.whatwg.org/#Exposed"><c- g>Exposed</c-></a>=(<c- n>Window</c->,<c- n>DedicatedWorker</c->,<c- n>SharedWorker</c->)] <c- b>partial</c-> <c- b>interface</c-> <a class="idl-code" data-link-type="interface" href="https://url.spec.whatwg.org/#url"><c- g>URL</c-></a> { <c- b>static</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-createObjectURL"><c- g>createObjectURL</c-></a>((<a data-link-type="idl-name" href="#dfn-Blob"><c- n>Blob</c-></a> <c- b>or</c-> <a data-link-type="idl-name" href="http://w3c.github.io/media-source/#mediasource"><c- n>MediaSource</c-></a>) <a href="#dom-url-createobjecturl-obj-obj"><code><c- g>obj</c-></code></a>); <c- b>static</c-> <a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-undefined"><c- b>undefined</c-></a> <a class="idl-code" data-link-type="method" href="#dfn-revokeObjectURL"><c- g>revokeObjectURL</c-></a>(<a class="idl-code" data-link-type="interface" href="https://webidl.spec.whatwg.org/#idl-DOMString"><c- b>DOMString</c-></a> <a href="#dom-url-revokeobjecturl-url-url"><code><c- g>url</c-></code></a>); }; </pre> <h2 class="no-num no-ref heading settled" id="issues-index"><span class="content">Issues Index</span><a class="self-link" href="#issues-index"></a></h2> <div style="counter-reset:issue"> <div class="issue"> We need to specify more concretely what reading from a Blob actually does, what possible errors can happen, perhaps something about chunk sizes, etc. <a class="issue-return" href="#issue-27e70e89" title="Jump to section">↵</a></div> <div class="issue"> We might change <code class="idl"><a data-link-type="idl" href="#dfn-loadstart-event">loadstart</a></code> to be dispatched synchronously, to align with XMLHttpRequest behavior. <a href="https://github.com/w3c/FileAPI/issues/119">[Issue #119]</a> <a class="issue-return" href="#issue-0504580b" title="Jump to section">↵</a></div> <div class="issue"> Better specify how the DataURL is generated. <a href="https://github.com/w3c/FileAPI/issues/104">[Issue #104]</a> <a class="issue-return" href="#issue-f80bda5b" title="Jump to section">↵</a></div> <div class="issue"> This needs a similar hook when a worker is unloaded. <a class="issue-return" href="#issue-5f2e5a9d" title="Jump to section">↵</a></div> <div class="issue"> This section is provisional; more security data may supplement this in subsequent drafts. <a class="issue-return" href="#issue-61296551" title="Jump to section">↵</a></div> </div> <details class="mdn-anno unpositioned" data-anno-for="constructorBlob"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob" title="The Blob() constructor returns a new Blob object. The content of the blob consists of the concatenation of the values given in the parameter array.">Blob/Blob</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>13+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>20+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12+</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>15.7.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dom-blob-arraybuffer"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/arrayBuffer" title="The arrayBuffer() method in the Blob interface returns a Promise that resolves with the contents of the blob as binary data contained in an ArrayBuffer.">Blob/arrayBuffer</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>69+</span></span><span class="safari yes"><span>Safari</span><span>14+</span></span><span class="chrome yes"><span>Chrome</span><span>76+</span></span> <hr> <span class="opera no"><span>Opera</span><span>?</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge no"><span>Edge (Legacy)</span><span>?</span></span><span class="ie no"><span>IE</span><span>None</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android no"><span>Opera Mobile</span><span>?</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>15.7.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-size"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/size" title="The Blob interface's size property returns the size of the Blob or File in bytes.">Blob/size</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>4+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>5+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>15.7.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-slice"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/slice" title="The Blob interface's slice() method creates and returns a new Blob object which contains data from a subset of the blob on which it's called.">Blob/slice</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>13+</span></span><span class="safari yes"><span>Safari</span><span>7+</span></span><span class="chrome yes"><span>Chrome</span><span>21+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12+</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>15.7.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dom-blob-stream"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/stream" title="The Blob interface's stream() method returns a ReadableStream which upon reading returns the data contained within the Blob.">Blob/stream</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>69+</span></span><span class="safari yes"><span>Safari</span><span>14.1+</span></span><span class="chrome yes"><span>Chrome</span><span>76+</span></span> <hr> <span class="opera no"><span>Opera</span><span>?</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge no"><span>Edge (Legacy)</span><span>?</span></span><span class="ie no"><span>IE</span><span>None</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android no"><span>Opera Mobile</span><span>?</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>15.7.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dom-blob-text"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/text" title="The text() method in the Blob interface returns a Promise that resolves with a string containing the contents of the blob, interpreted as UTF-8.">Blob/text</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>69+</span></span><span class="safari yes"><span>Safari</span><span>14+</span></span><span class="chrome yes"><span>Chrome</span><span>76+</span></span> <hr> <span class="opera no"><span>Opera</span><span>?</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge no"><span>Edge (Legacy)</span><span>?</span></span><span class="ie no"><span>IE</span><span>None</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android no"><span>Opera Mobile</span><span>?</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>15.7.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-type"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob/type" title="The type property of a Blob object returns the MIME type of the file.">Blob/type</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>4+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>5+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>15.7.0+</span></span> </div> </div> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/File/type" title="Returns the media type (MIME) of the file represented by a File object.">File/type</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>8+</span></span><span class="chrome yes"><span>Chrome</span><span>13+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>15+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>37+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>14+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="blob-section"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/Blob" title="The Blob object represents a blob, which is a file-like object of immutable, raw data; they can be read as text or binary data, or converted into a ReadableStream so its methods can be used for processing the data.">Blob</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>4+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>5+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>18.0.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="file-constructor"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/File/File" title="The File() constructor creates a new File object instance.">File/File</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>28+</span></span><span class="safari yes"><span>Safari</span><span>10.1+</span></span><span class="chrome yes"><span>Chrome</span><span>38+</span></span> <hr> <span class="opera no"><span>Opera</span><span>?</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge no"><span>Edge (Legacy)</span><span>?</span></span><span class="ie no"><span>IE</span><span>None</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android no"><span>Opera Mobile</span><span>?</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-lastModified"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/File/lastModified" title="The File.lastModified read-only property provides the last modified date of the file as the number of milliseconds since the Unix epoch (January 1, 1970 at midnight). Files without a known last modified date return the current date.">File/lastModified</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>15+</span></span><span class="safari yes"><span>Safari</span><span>10+</span></span><span class="chrome yes"><span>Chrome</span><span>13+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>15+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>18</span></span><span class="ie no"><span>IE</span><span>None</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>37+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>14+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-name"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/File/name" title="Returns the name of the file represented by a File object. For security reasons, the path is excluded from this property.">File/name</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>8+</span></span><span class="chrome yes"><span>Chrome</span><span>13+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>15+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>37+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>14+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="file-section"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/File" title="The File interface provides information about files and allows JavaScript in a web page to access their content.">File</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>7+</span></span><span class="safari yes"><span>Safari</span><span>4+</span></span><span class="chrome yes"><span>Chrome</span><span>13+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11.5+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>37+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11.5+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-item"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileList/item" title="The item() method of the FileList API returns a File object representing the file at the specified index in the file list.">FileList/item</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3+</span></span><span class="safari yes"><span>Safari</span><span>4+</span></span><span class="chrome yes"><span>Chrome</span><span>2+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>37+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-length"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileList/length" title="The read-only FileList length property returns the number of files in the FileList.">FileList/length</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3+</span></span><span class="safari yes"><span>Safari</span><span>4+</span></span><span class="chrome yes"><span>Chrome</span><span>2+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>37+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="filelist-section"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileList" title="An object of this type is returned by the files property of the HTML <input> element; this lets you access the list of files selected with the <input type="file"> element. It's also used for a list of files dropped into web content when using the drag and drop API; see the DataTransfer object for details on this usage.">FileList</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3+</span></span><span class="safari yes"><span>Safari</span><span>4+</span></span><span class="chrome yes"><span>Chrome</span><span>2+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>37+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="filereaderConstrctr"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/FileReader" title="The FileReader() constructor creates a new FileReader.">FileReader/FileReader</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="abort"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/abort" title="The abort method aborts the read operation. Upon return, the readyState will be DONE.">FileReader/abort</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-abort-event"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/abort_event" title="The abort event is fired when a read has been aborted: for instance because the program called FileReader.abort().">FileReader/abort_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-onabort"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/abort_event" title="The abort event is fired when a read has been aborted: for instance because the program called FileReader.abort().">FileReader/abort_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dom-filereader-error"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/error" title="The FileReader error property returns the error that occurred while reading the file.">FileReader/error</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-error-event"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/error_event" title="The error event is fired when the read failed due to an error (for example, because the file was not found or not readable).">FileReader/error_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-onerror"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/error_event" title="The error event is fired when the read failed due to an error (for example, because the file was not found or not readable).">FileReader/error_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-load-event"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/load_event" title="The load event is fired when a file has been read successfully.">FileReader/load_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-onload"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/load_event" title="The load event is fired when a file has been read successfully.">FileReader/load_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-loadend-event"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/loadend_event" title="The loadend event is fired when a file read has completed, successfully or not.">FileReader/loadend_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-onloadend"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/loadend_event" title="The loadend event is fired when a file read has completed, successfully or not.">FileReader/loadend_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-loadstart-event"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/loadstart_event" title="The loadstart event is fired when a file read operation has begun.">FileReader/loadstart_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>79+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>79+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-onloadstart"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/loadstart_event" title="The loadstart event is fired when a file read operation has begun.">FileReader/loadstart_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>79+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>79+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-progress-event"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/progress_event" title="The progress event is fired periodically as the FileReader reads data.">FileReader/progress_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-onprogress"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/progress_event" title="The progress event is fired periodically as the FileReader reads data.">FileReader/progress_event</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="readAsArrayBuffer"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsArrayBuffer" title="The FileReader interface's readAsArrayBuffer() method is used to start reading the contents of a specified Blob or File. When the read operation is finished, the readyState becomes DONE, and the loadend is triggered. At that time, the result attribute contains an ArrayBuffer representing the file's data.">FileReader/readAsArrayBuffer</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="readAsBinaryString"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsBinaryString" title="The readAsBinaryString method is used to start reading the contents of the specified Blob or File. When the read operation is finished, the readyState becomes DONE, and the FileReader.loadend_event is triggered. At that time, the result attribute contains the raw binary data from the file.">FileReader/readAsBinaryString</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie no"><span>IE</span><span>None</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="readAsDataURL"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsDataURL" title="The readAsDataURL method is used to read the contents of the specified Blob or File. When the read operation is finished, the readyState becomes DONE, and the loadend is triggered. At that time, the result attribute contains the data as a data: URL representing the file's data as a base64 encoded string.">FileReader/readAsDataURL</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="readAsDataText"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readAsText" title="The readAsText() method is used to read the contents of the specified Blob or File. When the read operation is complete, the readyState is changed to DONE, the loadend event is triggered, and the result property contains the contents of the file as a text string.">FileReader/readAsText</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dom-filereader-readystate"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/readyState" title="The FileReader readyState property provides the current state of the reading operation a FileReader is in. A FileReader exists in one of the following states:">FileReader/readyState</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dom-filereader-result"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader/result" title="The FileReader result property returns the file's contents. This property is only valid after the read operation is complete, and the format of the data depends on which of the methods was used to initiate the read operation.">FileReader/result</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="APIASynch"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReader" title="The FileReader object lets web applications asynchronously read the contents of files (or raw data buffers) stored on the user's computer, using File or Blob objects to specify the file or data to read.">FileReader</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>3.6+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>6+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>11+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android yes"><span>Firefox for Android</span><span>32+</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android yes"><span>Android WebView</span><span>3+</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>11+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="filereadersyncConstrctr"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReaderSync/FileReaderSync" title="The FileReaderSync() constructor creates a new FileReaderSync.">FileReaderSync/FileReaderSync</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>8+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>7+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="readAsArrayBufferSyncSection"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReaderSync/readAsArrayBuffer" title="The readAsArrayBuffer() method of the FileReaderSync interface allows to read File or Blob objects in a synchronous way into an ArrayBuffer. This interface is only available in workers as it enables synchronous I/O that could potentially block.">FileReaderSync/readAsArrayBuffer</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>8+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>9+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="readAsDataURLSync-section"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReaderSync/readAsDataURL" title="The readAsDataURL() method of the FileReaderSync interface allows to read File or Blob objects in a synchronous way into a string representing a data URL. This interface is only available in workers as it enables synchronous I/O that could potentially block.">FileReaderSync/readAsDataURL</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>8+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>7+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="readAsTextSync"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReaderSync/readAsText" title="The readAsText() method of the FileReaderSync interface allows to read File or Blob objects in a synchronous way into a string. This interface is only available in workers as it enables synchronous I/O that could potentially block.">FileReaderSync/readAsText</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>8+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>7+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="FileReaderSync"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/FileReaderSync" title="The FileReaderSync interface allows to read File or Blob objects synchronously.">FileReaderSync</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>8+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>7+</span></span> <hr> <span class="opera yes"><span>Opera</span><span>12.1+</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android yes"><span>Opera Mobile</span><span>12.1+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-createObjectURL"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL_static" title="The URL.createObjectURL() static method creates a string containing a URL representing the object given in the parameter.">URL/createObjectURL_static</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>19+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>19+</span></span> <hr> <span class="opera no"><span>Opera</span><span>?</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android no"><span>Opera Mobile</span><span>?</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>16.7.0+</span></span> </div> </div> </details> <details class="mdn-anno unpositioned" data-anno-for="dfn-revokeObjectURL"> <summary><b class="all-engines-flag" title="This feature is in all current engines.">✔</b><span>MDN</span></summary> <div class="feature"> <p><a href="https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL_static" title="The URL.revokeObjectURL() static method releases an existing object URL which was previously created by calling URL.createObjectURL().">URL/revokeObjectURL_static</a></p> <p class="all-engines-text">In all current engines.</p> <div class="support"> <span class="firefox yes"><span>Firefox</span><span>19+</span></span><span class="safari yes"><span>Safari</span><span>6+</span></span><span class="chrome yes"><span>Chrome</span><span>19+</span></span> <hr> <span class="opera no"><span>Opera</span><span>?</span></span><span class="edge_blink yes"><span>Edge</span><span>79+</span></span> <hr> <span class="edge yes"><span>Edge (Legacy)</span><span>12+</span></span><span class="ie yes"><span>IE</span><span>10+</span></span> <hr> <span class="firefox_android no"><span>Firefox for Android</span><span>?</span></span><span class="safari_ios no"><span>iOS Safari</span><span>?</span></span><span class="chrome_android no"><span>Chrome for Android</span><span>?</span></span><span class="webview_android no"><span>Android WebView</span><span>?</span></span><span class="samsunginternet_android no"><span>Samsung Internet</span><span>?</span></span><span class="opera_android no"><span>Opera Mobile</span><span>?</span></span> <hr> <span class="nodejs yes"><span>Node.js</span><span>16.7.0+</span></span> </div> </div> </details> <script>/* Boilerplate: script-dom-helper */ "use strict"; function query(sel) { return document.querySelector(sel); } function queryAll(sel) { return [...document.querySelectorAll(sel)]; } function iter(obj) { if(!obj) return []; var it = obj[Symbol.iterator]; if(it) return it; return Object.entries(obj); } function mk(tagname, attrs, ...children) { const el = document.createElement(tagname); for(const [k,v] of iter(attrs)) { if(k.slice(0,3) == "_on") { const eventName = k.slice(3); el.addEventListener(eventName, v); } else if(k[0] == "_") { // property, not attribute el[k.slice(1)] = v; } else { if(v === false || v == null) { continue; } else if(v === true) { el.setAttribute(k, ""); continue; } else { el.setAttribute(k, v); } } } append(el, children); return el; } /* Create shortcuts for every known HTML element */ [ "a", "abbr", "acronym", "address", "applet", "area", "article", "aside", "audio", "b", "base", "basefont", "bdo", "big", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "datalist", "dd", "del", "details", "dfn", "dialog", "div", "dl", "dt", "em", "embed", "fieldset", "figcaption", "figure", "font", "footer", "form", "frame", "frameset", "head", "header", "h1", "h2", "h3", "h4", "h5", "h6", "hr", "html", "i", "iframe", "img", "input", "ins", "kbd", "label", "legend", "li", "link", "main", "map", "mark", "meta", "meter", "nav", "nobr", "noscript", "object", "ol", "optgroup", "option", "output", "p", "param", "pre", "progress", "q", "s", "samp", "script", "section", "select", "small", "source", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "u", "ul", "var", "video", "wbr", "xmp", ].forEach(tagname=>{ mk[tagname] = (...args) => mk(tagname, ...args); }); function* nodesFromChildList(children) { for(const child of children.flat(Infinity)) { if(child instanceof Node) { yield child; } else { yield new Text(child); } } } function append(el, ...children) { for(const child of nodesFromChildList(children)) { if(el instanceof Node) el.appendChild(child); else el.push(child); } return el; } function insertAfter(el, ...children) { for(const child of nodesFromChildList(children)) { el.parentNode.insertBefore(child, el.nextSibling); } return el; } function clearContents(el) { el.innerHTML = ""; return el; } function parseHTML(markup) { if(markup.toLowerCase().trim().indexOf('<!doctype') === 0) { const doc = document.implementation.createHTMLDocument(""); doc.documentElement.innerHTML = markup; return doc; } else { const el = mk.template({}); el.innerHTML = markup; return el.content; } }</script> <script>/* Boilerplate: script-dfn-panel */ "use strict"; { let dfnPanelData = { "0303e8e5": {"dfnID":"0303e8e5","dfnText":"UTF-8 encode","external":true,"refSections":[{"refs":[{"id":"ref-for-utf-8-encode"}],"title":"3.1.1. Constructor Parameters"}],"url":"https://encoding.spec.whatwg.org/#utf-8-encode"}, "05af0c3f": {"dfnID":"05af0c3f","dfnText":"valid URL string","external":true,"refSections":[{"refs":[{"id":"ref-for-valid-url-string"},{"id":"ref-for-valid-url-string\u2460"},{"id":"ref-for-valid-url-string\u2461"}],"title":"8.2. Model"}],"url":"https://url.spec.whatwg.org/#valid-url-string"}, "0698d556": {"dfnID":"0698d556","dfnText":"string","external":true,"refSections":[{"refs":[{"id":"ref-for-string"},{"id":"ref-for-string\u2460"}],"title":"3.1.1. Constructor Parameters"}],"url":"https://infra.spec.whatwg.org/#string"}, "0a422d04": {"dfnID":"0a422d04","dfnText":"serializable object","external":true,"refSections":[{"refs":[{"id":"ref-for-serializable-objects"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-serializable-objects\u2460"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-serializable-objects\u2461"}],"title":"5. The FileList Interface"}],"url":"https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects"}, "0be3911e": {"dfnID":"0be3911e","dfnText":"NotReadableError","external":true,"refSections":[{"refs":[{"id":"ref-for-notreadableerror"}],"title":"7. Errors and Exceptions"},{"refs":[{"id":"ref-for-notreadableerror\u2460"},{"id":"ref-for-notreadableerror\u2461"},{"id":"ref-for-notreadableerror\u2462"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"https://webidl.spec.whatwg.org/#notreadableerror"}, "0e6b2056": {"dfnID":"0e6b2056","dfnText":"set","external":true,"refSections":[{"refs":[{"id":"ref-for-map-set"}],"title":"8.2. Model"}],"url":"https://infra.spec.whatwg.org/#map-set"}, "1243a891": {"dfnID":"1243a891","dfnText":"exist","external":true,"refSections":[{"refs":[{"id":"ref-for-map-exists"}],"title":"8.3. Dereferencing Model for blob URLs"}],"url":"https://infra.spec.whatwg.org/#map-exists"}, "12b8dfc0": {"dfnID":"12b8dfc0","dfnText":"current settings object","external":true,"refSections":[{"refs":[{"id":"ref-for-current-settings-object"},{"id":"ref-for-current-settings-object\u2460"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-current-settings-object\u2461"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#current-settings-object"}, "12d6b9a8": {"dfnID":"12d6b9a8","dfnText":"values","external":true,"refSections":[{"refs":[{"id":"ref-for-map-getting-the-values"}],"title":"8.2. Model"}],"url":"https://infra.spec.whatwg.org/#map-getting-the-values"}, "16d07e10": {"dfnID":"16d07e10","dfnText":"for each","external":true,"refSections":[{"refs":[{"id":"ref-for-list-iterate"}],"title":"5. The FileList Interface"}],"url":"https://infra.spec.whatwg.org/#list-iterate"}, "1cd4985f": {"dfnID":"1cd4985f","dfnText":"MediaSource","external":true,"refSections":[{"refs":[{"id":"ref-for-mediasource"}],"title":"8. A URL for Blob and MediaSource reference"},{"refs":[{"id":"ref-for-mediasource\u2460"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-mediasource\u2461"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-mediasource\u2462"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"http://w3c.github.io/media-source/#mediasource"}, "2b83ae0c": {"dfnID":"2b83ae0c","dfnText":"DataTransfer","external":true,"refSections":[{"refs":[{"id":"ref-for-datatransfer"}],"title":"Unnumbered Section"},{"refs":[{"id":"ref-for-datatransfer\u2460"}],"title":"5.2. Methods and Parameters"}],"url":"https://html.spec.whatwg.org/multipage/dnd.html#datatransfer"}, "2bc0cdf4": {"dfnID":"2bc0cdf4","dfnText":"EventTarget","external":true,"refSections":[{"refs":[{"id":"ref-for-eventtarget"}],"title":"6.2. The FileReader API"}],"url":"https://dom.spec.whatwg.org/#eventtarget"}, "2d10bf58": {"dfnID":"2d10bf58","dfnText":"chunk","external":true,"refSections":[{"refs":[{"id":"ref-for-chunk"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://streams.spec.whatwg.org/#chunk"}, "2f8afbfe": {"dfnID":"2f8afbfe","dfnText":"ArrayBuffer","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-ArrayBuffer"},{"id":"ref-for-idl-ArrayBuffer\u2460"},{"id":"ref-for-idl-ArrayBuffer\u2461"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-idl-ArrayBuffer\u2462"}],"title":"3.3.4. The arrayBuffer() method"},{"refs":[{"id":"ref-for-idl-ArrayBuffer\u2463"}],"title":"3.3.5. The bytes() method"},{"refs":[{"id":"ref-for-idl-ArrayBuffer\u2464"},{"id":"ref-for-idl-ArrayBuffer\u2465"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-idl-ArrayBuffer\u2466"}],"title":"6.5.1. The FileReaderSync API"}],"url":"https://webidl.spec.whatwg.org/#idl-ArrayBuffer"}, "31db57e6": {"dfnID":"31db57e6","dfnText":"keys","external":true,"refSections":[{"refs":[{"id":"ref-for-map-getting-the-keys"},{"id":"ref-for-map-getting-the-keys\u2460"}],"title":"8.2. Model"}],"url":"https://infra.spec.whatwg.org/#map-getting-the-keys"}, "36219a2a": {"dfnID":"36219a2a","dfnText":"text()","external":true,"refSections":[{"refs":[{"id":"ref-for-dom-body-text"}],"title":"3.3.3. The text() method"}],"url":"https://fetch.spec.whatwg.org/#dom-body-text"}, "3a711be7": {"dfnID":"3a711be7","dfnText":"scheme","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-url-scheme"}],"title":"8. A URL for Blob and MediaSource reference"},{"refs":[{"id":"ref-for-concept-url-scheme\u2460"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-concept-url-scheme\u2461"}],"title":"8.3. Dereferencing Model for blob URLs"},{"refs":[{"id":"ref-for-concept-url-scheme\u2462"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://url.spec.whatwg.org/#concept-url-scheme"}, "3aff2fb3": {"dfnID":"3aff2fb3","dfnText":"BufferSource","external":true,"refSections":[{"refs":[{"id":"ref-for-BufferSource"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-BufferSource\u2460"},{"id":"ref-for-BufferSource\u2461"}],"title":"3.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-BufferSource\u2462"}],"title":"4.1.1. Constructor Parameters"}],"url":"https://webidl.spec.whatwg.org/#BufferSource"}, "3bd18bd6": {"dfnID":"3bd18bd6","dfnText":"error","external":true,"refSections":[{"refs":[{"id":"ref-for-readablestream-error"},{"id":"ref-for-readablestream-error\u2460"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://streams.spec.whatwg.org/#readablestream-error"}, "3de9e659": {"dfnID":"3de9e659","dfnText":"byte sequence","external":true,"refSections":[{"refs":[{"id":"ref-for-byte-sequence"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-byte-sequence\u2460"},{"id":"ref-for-byte-sequence\u2461"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-byte-sequence\u2462"}],"title":"6.5.1.2. The readAsText()"},{"refs":[{"id":"ref-for-byte-sequence\u2463"}],"title":"6.5.1.3. The readAsDataURL() method"},{"refs":[{"id":"ref-for-byte-sequence\u2464"}],"title":"6.5.1.4. The readAsArrayBuffer() method"},{"refs":[{"id":"ref-for-byte-sequence\u2465"}],"title":"6.5.1.5. The readAsBinaryString() method"}],"url":"https://infra.spec.whatwg.org/#byte-sequence"}, "3e12e042": {"dfnID":"3e12e042","dfnText":"environment settings object","external":true,"refSections":[{"refs":[{"id":"ref-for-environment-settings-object"},{"id":"ref-for-environment-settings-object\u2460"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-environment-settings-object\u2461"}],"title":"8.3.2. Access restrictions on blob URLs"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object"}, "3fca5a9e": {"dfnID":"3fca5a9e","dfnText":"map","external":true,"refSections":[{"refs":[{"id":"ref-for-ordered-map"}],"title":"8.2. Model"}],"url":"https://infra.spec.whatwg.org/#ordered-map"}, "4013a022": {"dfnID":"4013a022","dfnText":"this","external":true,"refSections":[{"refs":[{"id":"ref-for-this"}],"title":"3.3.1. The slice() method"},{"refs":[{"id":"ref-for-this\u2460"}],"title":"3.3.2. The stream() method"},{"refs":[{"id":"ref-for-this\u2461"}],"title":"3.3.3. The text() method"},{"refs":[{"id":"ref-for-this\u2462"}],"title":"3.3.4. The arrayBuffer() method"},{"refs":[{"id":"ref-for-this\u2463"}],"title":"3.3.5. The bytes() method"},{"refs":[{"id":"ref-for-this\u2464"},{"id":"ref-for-this\u2465"},{"id":"ref-for-this\u2466"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-this\u2467"},{"id":"ref-for-this\u2468"},{"id":"ref-for-this\u2460\u24ea"},{"id":"ref-for-this\u2460\u2460"},{"id":"ref-for-this\u2460\u2461"},{"id":"ref-for-this\u2460\u2462"},{"id":"ref-for-this\u2460\u2463"},{"id":"ref-for-this\u2460\u2464"},{"id":"ref-for-this\u2460\u2465"},{"id":"ref-for-this\u2460\u2466"}],"title":"6.2.3.5. The abort() method"}],"url":"https://webidl.spec.whatwg.org/#this"}, "43ac8374": {"dfnID":"43ac8374","dfnText":"origin","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-settings-object-origin"}],"title":"8.2. Model"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-origin"}, "4411082c": {"dfnID":"4411082c","dfnText":"unloading document cleanup steps","external":true,"refSections":[{"refs":[{"id":"ref-for-unloading-document-cleanup-steps"}],"title":"8.3.3. Lifetime of blob URLs"}],"url":"https://html.spec.whatwg.org/multipage/document-lifecycle.html#unloading-document-cleanup-steps"}, "450958f7": {"dfnID":"450958f7","dfnText":"unsigned short","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-unsigned-short"},{"id":"ref-for-idl-unsigned-short\u2460"},{"id":"ref-for-idl-unsigned-short\u2461"},{"id":"ref-for-idl-unsigned-short\u2462"}],"title":"6.2. The FileReader API"}],"url":"https://webidl.spec.whatwg.org/#idl-unsigned-short"}, "48438eb3": {"dfnID":"48438eb3","dfnText":"queue a global task","external":true,"refSections":[{"refs":[{"id":"ref-for-queue-a-global-task"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-global-task"}, "5442ea33": {"dfnID":"5442ea33","dfnText":"URL serializer","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-url-serializer"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-concept-url-serializer\u2460"}],"title":"8.3. Dereferencing Model for blob URLs"}],"url":"https://url.spec.whatwg.org/#concept-url-serializer"}, "56320452": {"dfnID":"56320452","dfnText":"send()","external":true,"refSections":[{"refs":[{"id":"ref-for-dom-xmlhttprequest-send"}],"title":"Unnumbered Section"}],"url":"https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send"}, "56f81a8e": {"dfnID":"56f81a8e","dfnText":"new","external":true,"refSections":[{"refs":[{"id":"ref-for-new"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://webidl.spec.whatwg.org/#new"}, "58b7ba18": {"dfnID":"58b7ba18","dfnText":"decode","external":true,"refSections":[{"refs":[{"id":"ref-for-decode"}],"title":"6.3. Packaging data"}],"url":"https://encoding.spec.whatwg.org/#decode"}, "5991ccfb": {"dfnID":"5991ccfb","dfnText":"relevant realm","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-relevant-realm"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-realm"}, "59ed4e57": {"dfnID":"59ed4e57","dfnText":"ReadableStream","external":true,"refSections":[{"refs":[{"id":"ref-for-readablestream"},{"id":"ref-for-readablestream\u2460"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://streams.spec.whatwg.org/#readablestream"}, "5f90bbfb": {"dfnID":"5f90bbfb","dfnText":"undefined","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-undefined"},{"id":"ref-for-idl-undefined\u2460"},{"id":"ref-for-idl-undefined\u2461"},{"id":"ref-for-idl-undefined\u2462"},{"id":"ref-for-idl-undefined\u2463"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-idl-undefined\u2464"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://webidl.spec.whatwg.org/#idl-undefined"}, "5fd23811": {"dfnID":"5fd23811","dfnText":"fire an event","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-event-fire"}],"title":"6.4.1. Event Summary"},{"refs":[{"id":"ref-for-concept-event-fire\u2460"}],"title":"6.4.2. Summary of Event Invariants"}],"url":"https://dom.spec.whatwg.org/#concept-event-fire"}, "60184fa5": {"dfnID":"60184fa5","dfnText":"collecting a sequence of code points","external":true,"refSections":[{"refs":[{"id":"ref-for-collect-a-sequence-of-code-points"},{"id":"ref-for-collect-a-sequence-of-code-points\u2460"}],"title":"3.1.1. Constructor Parameters"}],"url":"https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points"}, "649608b9": {"dfnID":"649608b9","dfnText":"list","external":true,"refSections":[{"refs":[{"id":"ref-for-list"}],"title":"5. The FileList Interface"}],"url":"https://infra.spec.whatwg.org/#list"}, "6747f355": {"dfnID":"6747f355","dfnText":"postMessage(message, options)","external":true,"refSections":[{"refs":[{"id":"ref-for-dom-worker-postmessage-options"}],"title":"Unnumbered Section"}],"url":"https://html.spec.whatwg.org/multipage/workers.html#dom-worker-postmessage-options"}, "678221b9": {"dfnID":"678221b9","dfnText":"parsable mime type","external":true,"refSections":[{"refs":[{"id":"ref-for-parsable-mime-type"},{"id":"ref-for-parsable-mime-type\u2460"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-parsable-mime-type\u2461"}],"title":"4. The File Interface"}],"url":"https://mimesniff.spec.whatwg.org/#parsable-mime-type"}, "68bf3d31": {"dfnID":"68bf3d31","dfnText":"a","external":true,"refSections":[{"refs":[{"id":"ref-for-the-a-element"},{"id":"ref-for-the-a-element\u2460"}],"title":"10. Requirements and Use Cases"}],"url":"https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element"}, "6b6bb798": {"dfnID":"6b6bb798","dfnText":"enqueue","external":true,"refSections":[{"refs":[{"id":"ref-for-readablestream-enqueue"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://streams.spec.whatwg.org/#readablestream-enqueue"}, "6f2dfa22": {"dfnID":"6f2dfa22","dfnText":"ASCII lowercase","external":true,"refSections":[{"refs":[{"id":"ref-for-ascii-lowercase"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-ascii-lowercase\u2460"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-ascii-lowercase\u2461"}],"title":"4.1. Constructor"}],"url":"https://infra.spec.whatwg.org/#ascii-lowercase"}, "7393da89": {"dfnID":"7393da89","dfnText":"same origin","external":true,"refSections":[{"refs":[{"id":"ref-for-same-origin"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://html.spec.whatwg.org/multipage/browsers.html#same-origin"}, "742b8bae": {"dfnID":"742b8bae","dfnText":"read all bytes","external":true,"refSections":[{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-all-bytes"}],"title":"3.3.3. The text() method"},{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-all-bytes\u2460"}],"title":"3.3.4. The arrayBuffer() method"},{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-all-bytes\u2461"}],"title":"3.3.5. The bytes() method"},{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-all-bytes\u2462"}],"title":"6.5.1.2. The readAsText()"},{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-all-bytes\u2463"}],"title":"6.5.1.3. The readAsDataURL() method"},{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-all-bytes\u2464"}],"title":"6.5.1.4. The readAsArrayBuffer() method"},{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-all-bytes\u2465"}],"title":"6.5.1.5. The readAsBinaryString() method"}],"url":"https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes"}, "75bee4d5": {"dfnID":"75bee4d5","dfnText":"position variable","external":true,"refSections":[{"refs":[{"id":"ref-for-string-position-variable"}],"title":"3.1.1. Constructor Parameters"}],"url":"https://infra.spec.whatwg.org/#string-position-variable"}, "76919410": {"dfnID":"76919410","dfnText":"obtain a storage key for non-storage purposes","external":true,"refSections":[{"refs":[{"id":"ref-for-obtain-a-storage-key-for-non-storage-purposes"},{"id":"ref-for-obtain-a-storage-key-for-non-storage-purposes\u2460"}],"title":"8.3.2. Access restrictions on blob URLs"}],"url":"https://storage.spec.whatwg.org/#obtain-a-storage-key-for-non-storage-purposes"}, "77b4c09a": {"dfnID":"77b4c09a","dfnText":"assert","external":true,"refSections":[{"refs":[{"id":"ref-for-assert"}],"title":"8.3. Dereferencing Model for blob URLs"}],"url":"https://infra.spec.whatwg.org/#assert"}, "797018a7": {"dfnID":"797018a7","dfnText":"InvalidStateError","external":true,"refSections":[{"refs":[{"id":"ref-for-invalidstateerror"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-invalidstateerror\u2460"}],"title":"6.2.3. Reading a File or Blob"}],"url":"https://webidl.spec.whatwg.org/#invalidstateerror"}, "7b0dc914": {"dfnID":"7b0dc914","dfnText":"ProgressEvent","external":true,"refSections":[{"refs":[{"id":"ref-for-progressevent"}],"title":"6.4. Events"},{"refs":[{"id":"ref-for-progressevent\u2460"},{"id":"ref-for-progressevent\u2461"},{"id":"ref-for-progressevent\u2462"},{"id":"ref-for-progressevent\u2463"},{"id":"ref-for-progressevent\u2464"},{"id":"ref-for-progressevent\u2465"}],"title":"6.4.1. Event Summary"}],"url":"https://xhr.spec.whatwg.org/#progressevent"}, "7d16decb": {"dfnID":"7d16decb","dfnText":"storage key","external":true,"refSections":[{"refs":[{"id":"ref-for-service-worker-registration-storage-key"}],"title":"8.3.2. Access restrictions on blob URLs"}],"url":"https://w3c.github.io/ServiceWorker/#service-worker-registration-storage-key"}, "7d4424b2": {"dfnID":"7d4424b2","dfnText":"remove","external":true,"refSections":[{"refs":[{"id":"ref-for-map-remove"}],"title":"8.2. Model"}],"url":"https://infra.spec.whatwg.org/#map-remove"}, "802b0fdd": {"dfnID":"802b0fdd","dfnText":"value","external":true,"refSections":[{"refs":[{"id":"ref-for-map-value"}],"title":"8.3.3. Lifetime of blob URLs"}],"url":"https://infra.spec.whatwg.org/#map-value"}, "83b269de": {"dfnID":"83b269de","dfnText":"HTMLInputElement","external":true,"refSections":[{"refs":[{"id":"ref-for-htmlinputelement"}],"title":"5.2. Methods and Parameters"}],"url":"https://html.spec.whatwg.org/multipage/input.html#htmlinputelement"}, "85394472": {"dfnID":"85394472","dfnText":"Document","external":true,"refSections":[{"refs":[{"id":"ref-for-document"}],"title":"8.3.3. Lifetime of blob URLs"}],"url":"https://dom.spec.whatwg.org/#document"}, "87fcd40c": {"dfnID":"87fcd40c","dfnText":"iframe","external":true,"refSections":[{"refs":[{"id":"ref-for-the-iframe-element"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element"}, "8855a9aa": {"dfnID":"8855a9aa","dfnText":"DOMString","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-DOMString"},{"id":"ref-for-idl-DOMString\u2460"},{"id":"ref-for-idl-DOMString\u2461"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-idl-DOMString\u2462"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-idl-DOMString\u2463"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-idl-DOMString\u2464"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-idl-DOMString\u2465"},{"id":"ref-for-idl-DOMString\u2466"},{"id":"ref-for-idl-DOMString\u2467"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-idl-DOMString\u2468"},{"id":"ref-for-idl-DOMString\u2460\u24ea"},{"id":"ref-for-idl-DOMString\u2460\u2460"},{"id":"ref-for-idl-DOMString\u2460\u2461"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-idl-DOMString\u2460\u2462"},{"id":"ref-for-idl-DOMString\u2460\u2463"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://webidl.spec.whatwg.org/#idl-DOMString"}, "888d7c65": {"dfnID":"888d7c65","dfnText":"deserialization steps","external":true,"refSections":[{"refs":[{"id":"ref-for-deserialization-steps"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-deserialization-steps\u2460"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-deserialization-steps\u2461"}],"title":"5. The FileList Interface"}],"url":"https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps"}, "889e932f": {"dfnID":"889e932f","dfnText":"Exposed","external":true,"refSections":[{"refs":[{"id":"ref-for-Exposed"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-Exposed\u2460"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-Exposed\u2461"}],"title":"5. The FileList Interface"},{"refs":[{"id":"ref-for-Exposed\u2462"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-Exposed\u2463"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-Exposed\u2464"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://webidl.spec.whatwg.org/#Exposed"}, "8d831b4d": {"dfnID":"8d831b4d","dfnText":"equal","external":true,"refSections":[{"refs":[{"id":"ref-for-storage-key-equal"}],"title":"8.3.2. Access restrictions on blob URLs"}],"url":"https://storage.spec.whatwg.org/#storage-key-equal"}, "8ddcd9b8": {"dfnID":"8ddcd9b8","dfnText":"getting an encoding","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-encoding-get"},{"id":"ref-for-concept-encoding-get\u2460"},{"id":"ref-for-concept-encoding-get\u2461"}],"title":"6.3. Packaging data"}],"url":"https://encoding.spec.whatwg.org/#concept-encoding-get"}, "915aff5e": {"dfnID":"915aff5e","dfnText":"code point","external":true,"refSections":[{"refs":[{"id":"ref-for-code-point"},{"id":"ref-for-code-point\u2460"},{"id":"ref-for-code-point\u2461"},{"id":"ref-for-code-point\u2462"},{"id":"ref-for-code-point\u2463"},{"id":"ref-for-code-point\u2464"}],"title":"3.1.1. Constructor Parameters"}],"url":"https://infra.spec.whatwg.org/#code-point"}, "92d13070": {"dfnID":"92d13070","dfnText":"get a copy of the buffer source","external":true,"refSections":[{"refs":[{"id":"ref-for-dfn-get-buffer-source-copy"}],"title":"3.1.1. Constructor Parameters"}],"url":"https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy"}, "95d7775a": {"dfnID":"95d7775a","dfnText":"Uint8Array","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-Uint8Array"},{"id":"ref-for-idl-Uint8Array\u2460"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-idl-Uint8Array\u2461"}],"title":"3.3.5. The bytes() method"}],"url":"https://webidl.spec.whatwg.org/#idl-Uint8Array"}, "9a517a7d": {"dfnID":"9a517a7d","dfnText":"queue a task","external":true,"refSections":[{"refs":[{"id":"ref-for-queue-a-task"}],"title":"6.1. The File Reading Task Source"},{"refs":[{"id":"ref-for-queue-a-task\u2460"},{"id":"ref-for-queue-a-task\u2461"},{"id":"ref-for-queue-a-task\u2462"},{"id":"ref-for-queue-a-task\u2463"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-queue-a-task\u2464"}],"title":"6.2.3.5. The abort() method"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task"}, "9aeb0a82": {"dfnID":"9aeb0a82","dfnText":"long long","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-long-long"},{"id":"ref-for-idl-long-long\u2460"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-idl-long-long\u2461"},{"id":"ref-for-idl-long-long\u2462"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-idl-long-long\u2463"}],"title":"4.2. Attributes"}],"url":"https://webidl.spec.whatwg.org/#idl-long-long"}, "9c4c1e66": {"dfnID":"9c4c1e66","dfnText":"relevant settings object","external":true,"refSections":[{"refs":[{"id":"ref-for-relevant-settings-object"}],"title":"8.3.3. Lifetime of blob URLs"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object"}, "9cce47fd": {"dfnID":"9cce47fd","dfnText":"sequence","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-sequence"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-idl-sequence\u2460"}],"title":"4. The File Interface"}],"url":"https://webidl.spec.whatwg.org/#idl-sequence"}, "9d386f55": {"dfnID":"9d386f55","dfnText":"event handler event type","external":true,"refSections":[{"refs":[{"id":"ref-for-event-handler-event-type"},{"id":"ref-for-event-handler-event-type\u2460"}],"title":"6.2.1. Event Handler Content Attributes"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type"}, "9eda9b58": {"dfnID":"9eda9b58","dfnText":"NotFoundError","external":true,"refSections":[{"refs":[{"id":"ref-for-notfounderror"},{"id":"ref-for-notfounderror\u2460"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-notfounderror\u2461"}],"title":"7. Errors and Exceptions"},{"refs":[{"id":"ref-for-notfounderror\u2462"},{"id":"ref-for-notfounderror\u2463"},{"id":"ref-for-notfounderror\u2464"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"https://webidl.spec.whatwg.org/#notfounderror"}, "BlobURLStore": {"dfnID":"BlobURLStore","dfnText":"blob URL store","external":false,"refSections":[{"refs":[{"id":"ref-for-BlobURLStore"},{"id":"ref-for-BlobURLStore\u2460"},{"id":"ref-for-BlobURLStore\u2461"},{"id":"ref-for-BlobURLStore\u2462"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-BlobURLStore\u2463"}],"title":"8.3. Dereferencing Model for blob URLs"},{"refs":[{"id":"ref-for-BlobURLStore\u2464"}],"title":"8.3.1. Origin of blob URLs"},{"refs":[{"id":"ref-for-BlobURLStore\u2465"}],"title":"8.3.3. Lifetime of blob URLs"},{"refs":[{"id":"ref-for-BlobURLStore\u2466"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"#BlobURLStore"}, "FileLockFR": {"dfnID":"FileLockFR","dfnText":"FileLock","external":false,"refSections":[{"refs":[{"id":"ref-for-FileLockFR"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#FileLockFR"}, "NotFoundFR": {"dfnID":"NotFoundFR","dfnText":"NotFound","external":false,"refSections":[{"refs":[{"id":"ref-for-NotFoundFR"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#NotFoundFR"}, "SnapshotStateFR": {"dfnID":"SnapshotStateFR","dfnText":"SnapshotState","external":false,"refSections":[{"refs":[{"id":"ref-for-SnapshotStateFR"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#SnapshotStateFR"}, "TooManyReadsFR": {"dfnID":"TooManyReadsFR","dfnText":"TooManyReads","external":false,"refSections":[{"refs":[{"id":"ref-for-TooManyReadsFR"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#TooManyReadsFR"}, "UnixEpoch": {"dfnID":"UnixEpoch","dfnText":"Unix Epoch","external":false,"refSections":[{"refs":[{"id":"ref-for-UnixEpoch"},{"id":"ref-for-UnixEpoch\u2460"}],"title":"4.1. Constructor"},{"refs":[{"id":"ref-for-UnixEpoch\u2461"},{"id":"ref-for-UnixEpoch\u2462"}],"title":"4.2. Attributes"}],"url":"#UnixEpoch"}, "UnsafeFileFR": {"dfnID":"UnsafeFileFR","dfnText":"UnsafeFile","external":false,"refSections":[{"refs":[{"id":"ref-for-UnsafeFileFR"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#UnsafeFileFR"}, "a33db89a": {"dfnID":"a33db89a","dfnText":"fetch","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-fetch"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-concept-fetch\u2460"}],"title":"8.4.1. Examples of blob URL Creation and Revocation"}],"url":"https://fetch.spec.whatwg.org/#concept-fetch"}, "a72449dd": {"dfnID":"a72449dd","dfnText":"in parallel","external":true,"refSections":[{"refs":[{"id":"ref-for-in-parallel"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-in-parallel\u2460"}],"title":"6.2. The FileReader API"}],"url":"https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel"}, "ad191408": {"dfnID":"ad191408","dfnText":"read a chunk","external":true,"refSections":[{"refs":[{"id":"ref-for-readablestreamdefaultreader-read-a-chunk"},{"id":"ref-for-readablestreamdefaultreader-read-a-chunk\u2460"}],"title":"6.2. The FileReader API"}],"url":"https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-a-chunk"}, "add-an-entry": {"dfnID":"add-an-entry","dfnText":"\nadd an entry to the blob URL store","external":false,"refSections":[{"refs":[{"id":"ref-for-add-an-entry"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"#add-an-entry"}, "asynchronous-read-methods": {"dfnID":"asynchronous-read-methods","dfnText":"asynchronous read methods","external":false,"refSections":[{"refs":[{"id":"ref-for-asynchronous-read-methods"}],"title":"7. Errors and Exceptions"}],"url":"#asynchronous-read-methods"}, "b0d7f3c3": {"dfnID":"b0d7f3c3","dfnText":"USVString","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-USVString"},{"id":"ref-for-idl-USVString\u2460"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-idl-USVString\u2461"},{"id":"ref-for-idl-USVString\u2462"},{"id":"ref-for-idl-USVString\u2463"}],"title":"3.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-idl-USVString\u2464"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-idl-USVString\u2465"},{"id":"ref-for-idl-USVString\u2466"}],"title":"4.1.1. Constructor Parameters"}],"url":"https://webidl.spec.whatwg.org/#idl-USVString"}, "b0fcb8d7": {"dfnID":"b0fcb8d7","dfnText":"UTF-8 decode","external":true,"refSections":[{"refs":[{"id":"ref-for-utf-8-decode"}],"title":"3.3.3. The text() method"}],"url":"https://encoding.spec.whatwg.org/#utf-8-decode"}, "b1cd2079": {"dfnID":"b1cd2079","dfnText":"Date","external":true,"refSections":[{"refs":[{"id":"ref-for-sec-date-constructor"},{"id":"ref-for-sec-date-constructor\u2460"}],"title":"4.1. Constructor"}],"url":"http://tc39.github.io/ecma262/#sec-date-constructor"}, "b410a6ef": {"dfnID":"b410a6ef","dfnText":"ASCII serialization of an origin","external":true,"refSections":[{"refs":[{"id":"ref-for-ascii-serialisation-of-an-origin"}],"title":"8.2. Model"}],"url":"https://html.spec.whatwg.org/multipage/browsers.html#ascii-serialisation-of-an-origin"}, "b4cfa5ce": {"dfnID":"b4cfa5ce","dfnText":"throw","external":true,"refSections":[{"refs":[{"id":"ref-for-dfn-throw"},{"id":"ref-for-dfn-throw\u2460"},{"id":"ref-for-dfn-throw\u2461"},{"id":"ref-for-dfn-throw\u2462"}],"title":"7.1. Throwing an Exception or Returning an Error"},{"refs":[{"id":"ref-for-dfn-throw\u2463"}],"title":"9. Security and Privacy Considerations"}],"url":"https://webidl.spec.whatwg.org/#dfn-throw"}, "bdbd19d1": {"dfnID":"bdbd19d1","dfnText":"Promise","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-promise"},{"id":"ref-for-idl-promise\u2460"},{"id":"ref-for-idl-promise\u2461"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://webidl.spec.whatwg.org/#idl-promise"}, "bffb633e": {"dfnID":"bffb633e","dfnText":"UTF-8","external":true,"refSections":[{"refs":[{"id":"ref-for-utf-8"}],"title":"6.3. Packaging data"}],"url":"https://encoding.spec.whatwg.org/#utf-8"}, "blob-get-stream": {"dfnID":"blob-get-stream","dfnText":"get stream","external":false,"refSections":[{"refs":[{"id":"ref-for-blob-get-stream"}],"title":"3.3.2. The stream() method"},{"refs":[{"id":"ref-for-blob-get-stream\u2460"}],"title":"3.3.3. The text() method"},{"refs":[{"id":"ref-for-blob-get-stream\u2461"}],"title":"3.3.4. The arrayBuffer() method"},{"refs":[{"id":"ref-for-blob-get-stream\u2462"}],"title":"3.3.5. The bytes() method"},{"refs":[{"id":"ref-for-blob-get-stream\u2463"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-blob-get-stream\u2464"}],"title":"6.5.1.2. The readAsText()"},{"refs":[{"id":"ref-for-blob-get-stream\u2465"}],"title":"6.5.1.3. The readAsDataURL() method"},{"refs":[{"id":"ref-for-blob-get-stream\u2466"}],"title":"6.5.1.4. The readAsArrayBuffer() method"},{"refs":[{"id":"ref-for-blob-get-stream\u2467"}],"title":"6.5.1.5. The readAsBinaryString() method"},{"refs":[{"id":"ref-for-blob-get-stream\u2468"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#blob-get-stream"}, "blob-package-data": {"dfnID":"blob-package-data","dfnText":"package data","external":false,"refSections":[{"refs":[{"id":"ref-for-blob-package-data"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-blob-package-data\u2460"},{"id":"ref-for-blob-package-data\u2461"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-blob-package-data\u2462"}],"title":"6.5.1.2. The readAsText()"},{"refs":[{"id":"ref-for-blob-package-data\u2463"}],"title":"6.5.1.3. The readAsDataURL() method"},{"refs":[{"id":"ref-for-blob-package-data\u2464"}],"title":"6.5.1.4. The readAsArrayBuffer() method"},{"refs":[{"id":"ref-for-blob-package-data\u2465"}],"title":"6.5.1.5. The readAsBinaryString() method"}],"url":"#blob-package-data"}, "blob-url": {"dfnID":"blob-url","dfnText":"blob URLs","external":false,"refSections":[{"refs":[{"id":"ref-for-blob-url"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-blob-url\u2460"},{"id":"ref-for-blob-url\u2461"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-blob-url\u2462"}],"title":"8.3. Dereferencing Model for blob URLs"},{"refs":[{"id":"ref-for-blob-url\u2463"},{"id":"ref-for-blob-url\u2464"},{"id":"ref-for-blob-url\u2465"}],"title":"8.3.2. Access restrictions on blob URLs"},{"refs":[{"id":"ref-for-blob-url\u2466"},{"id":"ref-for-blob-url\u2467"},{"id":"ref-for-blob-url\u2468"},{"id":"ref-for-blob-url\u2460\u24ea"}],"title":"8.4. Creating and Revoking a blob URL"},{"refs":[{"id":"ref-for-blob-url\u2460\u2460"},{"id":"ref-for-blob-url\u2460\u2461"},{"id":"ref-for-blob-url\u2460\u2462"},{"id":"ref-for-blob-url\u2460\u2463"},{"id":"ref-for-blob-url\u2460\u2464"},{"id":"ref-for-blob-url\u2460\u2465"}],"title":"8.4.1. Examples of blob URL Creation and Revocation"},{"refs":[{"id":"ref-for-blob-url\u2460\u2466"}],"title":"9. Security and Privacy Considerations"}],"url":"#blob-url"}, "blob-url-entry": {"dfnID":"blob-url-entry","dfnText":"blob URL entry","external":false,"refSections":[{"refs":[{"id":"ref-for-blob-url-entry"},{"id":"ref-for-blob-url-entry\u2460"},{"id":"ref-for-blob-url-entry\u2461"},{"id":"ref-for-blob-url-entry\u2462"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-blob-url-entry\u2463"}],"title":"8.3.2. Access restrictions on blob URLs"},{"refs":[{"id":"ref-for-blob-url-entry\u2464"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"#blob-url-entry"}, "blob-url-entry-environment": {"dfnID":"blob-url-entry-environment","dfnText":"environment","external":false,"refSections":[{"refs":[{"id":"ref-for-blob-url-entry-environment"}],"title":"8.3.2. Access restrictions on blob URLs"},{"refs":[{"id":"ref-for-blob-url-entry-environment\u2460"}],"title":"8.3.3. Lifetime of blob URLs"}],"url":"#blob-url-entry-environment"}, "blob-url-entry-object": {"dfnID":"blob-url-entry-object","dfnText":"object","external":false,"refSections":[{"refs":[{"id":"ref-for-blob-url-entry-object"},{"id":"ref-for-blob-url-entry-object\u2460"},{"id":"ref-for-blob-url-entry-object\u2461"}],"title":"8.2. Model"}],"url":"#blob-url-entry-object"}, "blob-url-obtain-object": {"dfnID":"blob-url-obtain-object","dfnText":"obtain a blob object","external":false,"refSections":[{"refs":[{"id":"ref-for-blob-url-obtain-object"}],"title":"8.2. Model"}],"url":"#blob-url-obtain-object"}, "blob-url-resolve": {"dfnID":"blob-url-resolve","dfnText":"resolve a blob URL","external":false,"refSections":[],"url":"#blob-url-resolve"}, "c0350ab0": {"dfnID":"c0350ab0","dfnText":"set up with byte reading support","external":true,"refSections":[{"refs":[{"id":"ref-for-readablestream-set-up-with-byte-reading-support"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://streams.spec.whatwg.org/#readablestream-set-up-with-byte-reading-support"}, "c0868016": {"dfnID":"c0868016","dfnText":"path","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-url-path"}],"title":"8.2. Model"}],"url":"https://url.spec.whatwg.org/#concept-url-path"}, "c187d599": {"dfnID":"c187d599","dfnText":"sub-deserialization","external":true,"refSections":[{"refs":[{"id":"ref-for-sub-deserialization"}],"title":"5. The FileList Interface"}],"url":"https://html.spec.whatwg.org/multipage/structured-data.html#sub-deserialization"}, "c3b2d08c": {"dfnID":"c3b2d08c","dfnText":"task source","external":true,"refSections":[{"refs":[{"id":"ref-for-task-source"}],"title":"6.1. The File Reading Task Source"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#task-source"}, "c3e881ef": {"dfnID":"c3e881ef","dfnText":"SecurityError","external":true,"refSections":[{"refs":[{"id":"ref-for-securityerror"}],"title":"7. Errors and Exceptions"},{"refs":[{"id":"ref-for-securityerror\u2460"},{"id":"ref-for-securityerror\u2461"},{"id":"ref-for-securityerror\u2462"}],"title":"7.1. Throwing an Exception or Returning an Error"},{"refs":[{"id":"ref-for-securityerror\u2463"},{"id":"ref-for-securityerror\u2464"}],"title":"9. Security and Privacy Considerations"}],"url":"https://webidl.spec.whatwg.org/#securityerror"}, "c49c2ced": {"dfnID":"c49c2ced","dfnText":"download","external":true,"refSections":[{"refs":[{"id":"ref-for-attr-hyperlink-download"},{"id":"ref-for-attr-hyperlink-download\u2460"}],"title":"10. Requirements and Use Cases"}],"url":"https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download"}, "c807e273": {"dfnID":"c807e273","dfnText":"NewObject","external":true,"refSections":[{"refs":[{"id":"ref-for-NewObject"},{"id":"ref-for-NewObject\u2460"},{"id":"ref-for-NewObject\u2461"},{"id":"ref-for-NewObject\u2462"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://webidl.spec.whatwg.org/#NewObject"}, "c8b89a7b": {"dfnID":"c8b89a7b","dfnText":"Array","external":true,"refSections":[{"refs":[{"id":"ref-for-sec-array-constructor"},{"id":"ref-for-sec-array-constructor\u2460"}],"title":"5. The FileList Interface"}],"url":"http://tc39.github.io/ecma262/#sec-array-constructor"}, "ca3ca4ae": {"dfnID":"ca3ca4ae","dfnText":"URL parser","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-url-parser"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-concept-url-parser\u2460"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://url.spec.whatwg.org/#concept-url-parser"}, "cc6d9aed": {"dfnID":"cc6d9aed","dfnText":"event handler content attribute","external":true,"refSections":[{"refs":[{"id":"ref-for-event-handler-content-attributes"},{"id":"ref-for-event-handler-content-attributes\u2460"}],"title":"6.2.1. Event Handler Content Attributes"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-content-attributes"}, "cfc67fdc": {"dfnID":"cfc67fdc","dfnText":"empty host","external":true,"refSections":[{"refs":[{"id":"ref-for-empty-host"}],"title":"8.2. Model"}],"url":"https://url.spec.whatwg.org/#empty-host"}, "check-for-same-partition-blob-url-usage": {"dfnID":"check-for-same-partition-blob-url-usage","dfnText":"check for same-partition blob URL usage","external":false,"refSections":[{"refs":[{"id":"ref-for-check-for-same-partition-blob-url-usage"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-check-for-same-partition-blob-url-usage\u2460"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"#check-for-same-partition-blob-url-usage"}, "convert-line-endings-to-native": {"dfnID":"convert-line-endings-to-native","dfnText":"\nconvert line endings to native","external":false,"refSections":[{"refs":[{"id":"ref-for-convert-line-endings-to-native"},{"id":"ref-for-convert-line-endings-to-native\u2460"}],"title":"3.1.1. Constructor Parameters"}],"url":"#convert-line-endings-to-native"}, "d06b2b8c": {"dfnID":"d06b2b8c","dfnText":"XMLHttpRequest","external":true,"refSections":[{"refs":[{"id":"ref-for-xmlhttprequest"}],"title":"Unnumbered Section"}],"url":"https://xhr.spec.whatwg.org/#xmlhttprequest"}, "d72dabca": {"dfnID":"d72dabca","dfnText":"parse a MIME type","external":true,"refSections":[{"refs":[{"id":"ref-for-parse-a-mime-type"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-parse-a-mime-type\u2460"}],"title":"6.3. Packaging data"}],"url":"https://mimesniff.spec.whatwg.org/#parse-a-mime-type"}, "d76ab844": {"dfnID":"d76ab844","dfnText":"sub-serialization","external":true,"refSections":[{"refs":[{"id":"ref-for-sub-serialization"}],"title":"5. The FileList Interface"}],"url":"https://html.spec.whatwg.org/multipage/structured-data.html#sub-serialization"}, "d7d642a2": {"dfnID":"d7d642a2","dfnText":"input","external":true,"refSections":[{"refs":[{"id":"ref-for-the-input-element"}],"title":"Unnumbered Section"}],"url":"https://html.spec.whatwg.org/multipage/input.html#the-input-element"}, "dca2de17": {"dfnID":"dca2de17","dfnText":"DOMException","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-DOMException"},{"id":"ref-for-idl-DOMException\u2460"},{"id":"ref-for-idl-DOMException\u2461"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-idl-DOMException\u2462"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"https://webidl.spec.whatwg.org/#idl-DOMException"}, "dcffbccd": {"dfnID":"dcffbccd","dfnText":"URL","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-url"}],"title":"8. A URL for Blob and MediaSource reference"},{"refs":[{"id":"ref-for-concept-url\u2460"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-concept-url\u2461"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-concept-url\u2462"}],"title":"8.3. Dereferencing Model for blob URLs"}],"url":"https://url.spec.whatwg.org/#concept-url"}, "dfn-BPtype": {"dfnID":"dfn-BPtype","dfnText":"type","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-BPtype"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-BPtype\u2460"},{"id":"ref-for-dfn-BPtype\u2461"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-dfn-BPtype\u2462"},{"id":"ref-for-dfn-BPtype\u2463"}],"title":"4.1. Constructor"}],"url":"#dfn-BPtype"}, "dfn-Blob": {"dfnID":"dfn-Blob","dfnText":"Blob","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-Blob\u2464"},{"id":"ref-for-dfn-Blob\u2465"},{"id":"ref-for-dfn-Blob\u2466"}],"title":"1. Introduction"},{"refs":[{"id":"ref-for-dfn-Blob\u2467"},{"id":"ref-for-dfn-Blob\u2468"},{"id":"ref-for-dfn-Blob\u2460\u24ea"},{"id":"ref-for-dfn-Blob\u2460\u2460"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-dfn-Blob\u2460\u2461"},{"id":"ref-for-dfn-Blob\u2460\u2462"},{"id":"ref-for-dfn-Blob\u2460\u2463"},{"id":"ref-for-dfn-Blob\u2460\u2464"},{"id":"ref-for-dfn-Blob\u2460\u2465"},{"id":"ref-for-dfn-Blob\u2460\u2466"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-Blob\u2460\u2467"},{"id":"ref-for-dfn-Blob\u2460\u2468"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-dfn-Blob\u2461\u24ea"},{"id":"ref-for-dfn-Blob\u2461\u2460"},{"id":"ref-for-dfn-Blob\u2461\u2461"},{"id":"ref-for-dfn-Blob\u2461\u2462"},{"id":"ref-for-dfn-Blob\u2461\u2463"},{"id":"ref-for-dfn-Blob\u2461\u2464"}],"title":"3.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-dfn-Blob\u2461\u2465"},{"id":"ref-for-dfn-Blob\u2461\u2466"},{"id":"ref-for-dfn-Blob\u2461\u2467"},{"id":"ref-for-dfn-Blob\u2461\u2468"},{"id":"ref-for-dfn-Blob\u2462\u24ea"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-dfn-Blob\u2462\u2460"},{"id":"ref-for-dfn-Blob\u2462\u2461"}],"title":"3.3.1. The slice() method"},{"refs":[{"id":"ref-for-dfn-Blob\u2462\u2462"},{"id":"ref-for-dfn-Blob\u2462\u2463"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-Blob\u2462\u2464"}],"title":"4.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-dfn-Blob\u2462\u2465"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-dfn-Blob\u2462\u2466"}],"title":"6.1. The File Reading Task Source"},{"refs":[{"id":"ref-for-dfn-Blob\u2462\u2467"},{"id":"ref-for-dfn-Blob\u2462\u2468"},{"id":"ref-for-dfn-Blob\u2463\u24ea"},{"id":"ref-for-dfn-Blob\u2463\u2460"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-Blob\u2463\u2461"},{"id":"ref-for-dfn-Blob\u2463\u2462"},{"id":"ref-for-dfn-Blob\u2463\u2463"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-dfn-Blob\u2463\u2464"}],"title":"6.3. Packaging data"},{"refs":[{"id":"ref-for-dfn-Blob\u2463\u2465"}],"title":"6.5. Reading on Threads"},{"refs":[{"id":"ref-for-dfn-Blob\u2463\u2466"},{"id":"ref-for-dfn-Blob\u2463\u2467"},{"id":"ref-for-dfn-Blob\u2463\u2468"},{"id":"ref-for-dfn-Blob\u2464\u24ea"},{"id":"ref-for-dfn-Blob\u2464\u2460"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-dfn-Blob\u2464\u2461"},{"id":"ref-for-dfn-Blob\u2464\u2462"},{"id":"ref-for-dfn-Blob\u2464\u2463"}],"title":"7. Errors and Exceptions"},{"refs":[{"id":"ref-for-dfn-Blob\u2464\u2464"},{"id":"ref-for-dfn-Blob\u2464\u2465"},{"id":"ref-for-dfn-Blob\u2464\u2466"},{"id":"ref-for-dfn-Blob\u2464\u2467"},{"id":"ref-for-dfn-Blob\u2464\u2468"},{"id":"ref-for-dfn-Blob\u2465\u24ea"}],"title":"7.1. Throwing an Exception or Returning an Error"},{"refs":[{"id":"ref-for-dfn-Blob\u2465\u2460"}],"title":"8. A URL for Blob and MediaSource reference"},{"refs":[{"id":"ref-for-dfn-Blob\u2465\u2461"},{"id":"ref-for-dfn-Blob\u2465\u2462"},{"id":"ref-for-dfn-Blob\u2465\u2463"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-dfn-Blob\u2465\u2464"}],"title":"8.2. Model"},{"refs":[{"id":"ref-for-dfn-Blob\u2465\u2465"}],"title":"8.4. Creating and Revoking a blob URL"},{"refs":[{"id":"ref-for-dfn-Blob\u2465\u2466"}],"title":"8.4.1. Examples of blob URL Creation and Revocation"}],"url":"#dfn-Blob"}, "dfn-BlobPropertyBag": {"dfnID":"dfn-BlobPropertyBag","dfnText":"BlobPropertyBag","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-BlobPropertyBag"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-BlobPropertyBag\u2460"},{"id":"ref-for-dfn-BlobPropertyBag\u2461"}],"title":"3.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-dfn-BlobPropertyBag\u2462"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-BlobPropertyBag\u2463"}],"title":"4.1.1. Constructor Parameters"}],"url":"#dfn-BlobPropertyBag"}, "dfn-FPdate": {"dfnID":"dfn-FPdate","dfnText":"lastModified","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-FPdate"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-FPdate\u2460"},{"id":"ref-for-dfn-FPdate\u2461"},{"id":"ref-for-dfn-FPdate\u2462"}],"title":"4.1. Constructor"}],"url":"#dfn-FPdate"}, "dfn-FilePropertyBag": {"dfnID":"dfn-FilePropertyBag","dfnText":"FilePropertyBag","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-FilePropertyBag"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-FilePropertyBag\u2460"}],"title":"4.1. Constructor"},{"refs":[{"id":"ref-for-dfn-FilePropertyBag\u2461"}],"title":"4.1.1. Constructor Parameters"}],"url":"#dfn-FilePropertyBag"}, "dfn-FileReaderSync": {"dfnID":"dfn-FileReaderSync","dfnText":"FileReaderSync","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-FileReaderSync"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-dfn-FileReaderSync\u2460"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-dfn-FileReaderSync\u2461"},{"id":"ref-for-dfn-FileReaderSync\u2462"}],"title":"6.2.3. Reading a File or Blob"},{"refs":[{"id":"ref-for-dfn-FileReaderSync\u2463"}],"title":"6.5. Reading on Threads"},{"refs":[{"id":"ref-for-dfn-FileReaderSync\u2464"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-dfn-FileReaderSync\u2465"}],"title":"6.5.1.1. Constructors"}],"url":"#dfn-FileReaderSync"}, "dfn-abort": {"dfnID":"dfn-abort","dfnText":"abort()","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-abort"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-dfn-abort\u2460"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-abort\u2461"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-dfn-abort\u2462"}],"title":"6.2.3.5. The abort() method"},{"refs":[{"id":"ref-for-dfn-abort\u2463"}],"title":"6.4.1. Event Summary"},{"refs":[{"id":"ref-for-dfn-abort\u2464"}],"title":"6.4.2. Summary of Event Invariants"}],"url":"#dfn-abort"}, "dfn-abort-event": {"dfnID":"dfn-abort-event","dfnText":"abort","external":false,"refSections":[],"url":"#dfn-abort-event"}, "dfn-blobParts": {"dfnID":"dfn-blobParts","dfnText":"blobParts","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-blobParts"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-blobParts\u2460"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-dfn-blobParts\u2461"}],"title":"3.1.1. Constructor Parameters"}],"url":"#dfn-blobParts"}, "dfn-createObjectURL": {"dfnID":"dfn-createObjectURL","dfnText":"createObjectURL(obj)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-createObjectURL"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-dfn-createObjectURL\u2460"}],"title":"8.4. Creating and Revoking a blob URL"},{"refs":[{"id":"ref-for-dfn-createObjectURL\u2461"}],"title":"8.4.1. Examples of blob URL Creation and Revocation"}],"url":"#dfn-createObjectURL"}, "dfn-error-event": {"dfnID":"dfn-error-event","dfnText":"error","external":false,"refSections":[],"url":"#dfn-error-event"}, "dfn-file": {"dfnID":"dfn-file","dfnText":"File","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-file\u2462"},{"id":"ref-for-dfn-file\u2463"},{"id":"ref-for-dfn-file\u2464"}],"title":"1. Introduction"},{"refs":[{"id":"ref-for-dfn-file\u2465"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-file\u2466"},{"id":"ref-for-dfn-file\u2467"}],"title":"3.3.1. The slice() method"},{"refs":[{"id":"ref-for-dfn-file\u2468"},{"id":"ref-for-dfn-file\u2460\u24ea"},{"id":"ref-for-dfn-file\u2460\u2460"},{"id":"ref-for-dfn-file\u2460\u2461"},{"id":"ref-for-dfn-file\u2460\u2462"},{"id":"ref-for-dfn-file\u2460\u2463"},{"id":"ref-for-dfn-file\u2460\u2464"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-file\u2460\u2465"},{"id":"ref-for-dfn-file\u2460\u2466"}],"title":"4.1. Constructor"},{"refs":[{"id":"ref-for-dfn-file\u2460\u2467"}],"title":"4.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-dfn-file\u2460\u2468"},{"id":"ref-for-dfn-file\u2461\u24ea"},{"id":"ref-for-dfn-file\u2461\u2460"},{"id":"ref-for-dfn-file\u2461\u2461"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-dfn-file\u2461\u2462"},{"id":"ref-for-dfn-file\u2461\u2463"}],"title":"5. The FileList Interface"},{"refs":[{"id":"ref-for-dfn-file\u2461\u2464"},{"id":"ref-for-dfn-file\u2461\u2465"},{"id":"ref-for-dfn-file\u2461\u2466"},{"id":"ref-for-dfn-file\u2461\u2467"},{"id":"ref-for-dfn-file\u2461\u2468"}],"title":"5.2. Methods and Parameters"},{"refs":[{"id":"ref-for-dfn-file\u2462\u24ea"}],"title":"6.1. The File Reading Task Source"},{"refs":[{"id":"ref-for-dfn-file\u2462\u2460"},{"id":"ref-for-dfn-file\u2462\u2461"},{"id":"ref-for-dfn-file\u2462\u2462"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-dfn-file\u2462\u2463"}],"title":"6.5. Reading on Threads"},{"refs":[{"id":"ref-for-dfn-file\u2462\u2464"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-dfn-file\u2462\u2465"},{"id":"ref-for-dfn-file\u2462\u2466"},{"id":"ref-for-dfn-file\u2462\u2467"}],"title":"7. Errors and Exceptions"},{"refs":[{"id":"ref-for-dfn-file\u2462\u2468"},{"id":"ref-for-dfn-file\u2463\u24ea"},{"id":"ref-for-dfn-file\u2463\u2460"},{"id":"ref-for-dfn-file\u2463\u2461"},{"id":"ref-for-dfn-file\u2463\u2462"},{"id":"ref-for-dfn-file\u2463\u2463"}],"title":"7.1. Throwing an Exception or Returning an Error"},{"refs":[{"id":"ref-for-dfn-file\u2463\u2464"}],"title":"10. Requirements and Use Cases"}],"url":"#dfn-file"}, "dfn-fileBits": {"dfnID":"dfn-fileBits","dfnText":"fileBits","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-fileBits"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-fileBits\u2460"}],"title":"4.1. Constructor"}],"url":"#dfn-fileBits"}, "dfn-fileName": {"dfnID":"dfn-fileName","dfnText":"fileName","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-fileName"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-fileName\u2460"}],"title":"4.1. Constructor"}],"url":"#dfn-fileName"}, "dfn-filelist": {"dfnID":"dfn-filelist","dfnText":"FileList","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-filelist\u2460"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-dfn-filelist\u2461"},{"id":"ref-for-dfn-filelist\u2462"},{"id":"ref-for-dfn-filelist\u2463"}],"title":"5. The FileList Interface"},{"refs":[{"id":"ref-for-dfn-filelist\u2464"}],"title":"5.1. Attributes"},{"refs":[{"id":"ref-for-dfn-filelist\u2465"},{"id":"ref-for-dfn-filelist\u2466"},{"id":"ref-for-dfn-filelist\u2467"},{"id":"ref-for-dfn-filelist\u2468"},{"id":"ref-for-dfn-filelist\u2460\u24ea"},{"id":"ref-for-dfn-filelist\u2460\u2460"}],"title":"5.2. Methods and Parameters"},{"refs":[{"id":"ref-for-dfn-filelist\u2460\u2461"}],"title":"9. Security and Privacy Considerations"}],"url":"#dfn-filelist"}, "dfn-filereader": {"dfnID":"dfn-filereader","dfnText":"FileReader","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-filereader\u2460"}],"title":"1. Introduction"},{"refs":[{"id":"ref-for-dfn-filereader\u2461"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-dfn-filereader\u2462"}],"title":"3.3.3. The text() method"},{"refs":[{"id":"ref-for-dfn-filereader\u2463"},{"id":"ref-for-dfn-filereader\u2464"},{"id":"ref-for-dfn-filereader\u2465"},{"id":"ref-for-dfn-filereader\u2466"},{"id":"ref-for-dfn-filereader\u2467"},{"id":"ref-for-dfn-filereader\u2468"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-filereader\u2460\u24ea"}],"title":"6.2.1. Event Handler Content Attributes"},{"refs":[{"id":"ref-for-dfn-filereader\u2460\u2460"},{"id":"ref-for-dfn-filereader\u2460\u2461"},{"id":"ref-for-dfn-filereader\u2460\u2462"},{"id":"ref-for-dfn-filereader\u2460\u2463"},{"id":"ref-for-dfn-filereader\u2460\u2464"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-dfn-filereader\u2460\u2465"},{"id":"ref-for-dfn-filereader\u2460\u2466"},{"id":"ref-for-dfn-filereader\u2460\u2467"}],"title":"6.2.3. Reading a File or Blob"},{"refs":[{"id":"ref-for-dfn-filereader\u2460\u2468"},{"id":"ref-for-dfn-filereader\u2461\u24ea"}],"title":"6.4. Events"},{"refs":[{"id":"ref-for-dfn-filereader\u2461\u2460"}],"title":"6.4.1. Event Summary"},{"refs":[{"id":"ref-for-dfn-filereader\u2461\u2461"}],"title":"6.5. Reading on Threads"},{"refs":[{"id":"ref-for-dfn-filereader\u2461\u2462"}],"title":"7.1. Throwing an Exception or Returning an Error"},{"refs":[{"id":"ref-for-dfn-filereader\u2461\u2463"}],"title":"9. Security and Privacy Considerations"}],"url":"#dfn-filereader"}, "dfn-index": {"dfnID":"dfn-index","dfnText":"index","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-index"}],"title":"5. The FileList Interface"}],"url":"#dfn-index"}, "dfn-item": {"dfnID":"dfn-item","dfnText":"item(index)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-item"}],"title":"5. The FileList Interface"}],"url":"#dfn-item"}, "dfn-lastModified": {"dfnID":"dfn-lastModified","dfnText":"lastModified","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-lastModified"},{"id":"ref-for-dfn-lastModified\u2460"},{"id":"ref-for-dfn-lastModified\u2461"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-lastModified\u2462"}],"title":"4.1. Constructor"}],"url":"#dfn-lastModified"}, "dfn-length": {"dfnID":"dfn-length","dfnText":"length","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-length"}],"title":"5. The FileList Interface"}],"url":"#dfn-length"}, "dfn-load-event": {"dfnID":"dfn-load-event","dfnText":"load","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-load-event"},{"id":"ref-for-dfn-load-event\u2460"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-load-event\u2461"}],"title":"6.2.1. Event Handler Content Attributes"},{"refs":[{"id":"ref-for-dfn-load-event\u2462"},{"id":"ref-for-dfn-load-event\u2463"},{"id":"ref-for-dfn-load-event\u2464"},{"id":"ref-for-dfn-load-event\u2465"}],"title":"6.4.2. Summary of Event Invariants"}],"url":"#dfn-load-event"}, "dfn-loadend-event": {"dfnID":"dfn-loadend-event","dfnText":"loadend","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-loadend-event"},{"id":"ref-for-dfn-loadend-event\u2460"},{"id":"ref-for-dfn-loadend-event\u2461"},{"id":"ref-for-dfn-loadend-event\u2462"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-loadend-event\u2463"}],"title":"6.2.1. Event Handler Content Attributes"},{"refs":[{"id":"ref-for-dfn-loadend-event\u2464"}],"title":"6.2.3.5. The abort() method"},{"refs":[{"id":"ref-for-dfn-loadend-event\u2465"},{"id":"ref-for-dfn-loadend-event\u2466"},{"id":"ref-for-dfn-loadend-event\u2467"}],"title":"6.4.2. Summary of Event Invariants"}],"url":"#dfn-loadend-event"}, "dfn-loadstart-event": {"dfnID":"dfn-loadstart-event","dfnText":"loadstart","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-loadstart-event"},{"id":"ref-for-dfn-loadstart-event\u2460"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-loadstart-event\u2461"}],"title":"6.2.1. Event Handler Content Attributes"},{"refs":[{"id":"ref-for-dfn-loadstart-event\u2462"},{"id":"ref-for-dfn-loadstart-event\u2463"},{"id":"ref-for-dfn-loadstart-event\u2464"}],"title":"6.4.2. Summary of Event Invariants"}],"url":"#dfn-loadstart-event"}, "dfn-name": {"dfnID":"dfn-name","dfnText":"name","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-name"},{"id":"ref-for-dfn-name\u2460"},{"id":"ref-for-dfn-name\u2461"},{"id":"ref-for-dfn-name\u2462"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-name\u2463"}],"title":"4.1. Constructor"}],"url":"#dfn-name"}, "dfn-onabort": {"dfnID":"dfn-onabort","dfnText":"onabort","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-onabort"}],"title":"6.2. The FileReader API"}],"url":"#dfn-onabort"}, "dfn-onerror": {"dfnID":"dfn-onerror","dfnText":"onerror","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-onerror"}],"title":"6.2. The FileReader API"}],"url":"#dfn-onerror"}, "dfn-onload": {"dfnID":"dfn-onload","dfnText":"onload","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-onload"}],"title":"6.2. The FileReader API"}],"url":"#dfn-onload"}, "dfn-onloadend": {"dfnID":"dfn-onloadend","dfnText":"onloadend","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-onloadend"}],"title":"6.2. The FileReader API"}],"url":"#dfn-onloadend"}, "dfn-onloadstart": {"dfnID":"dfn-onloadstart","dfnText":"onloadstart","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-onloadstart"}],"title":"6.2. The FileReader API"}],"url":"#dfn-onloadstart"}, "dfn-onprogress": {"dfnID":"dfn-onprogress","dfnText":"onprogress","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-onprogress"}],"title":"6.2. The FileReader API"}],"url":"#dfn-onprogress"}, "dfn-progress-event": {"dfnID":"dfn-progress-event","dfnText":"progress","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-progress-event"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-progress-event\u2460"}],"title":"6.2.1. Event Handler Content Attributes"},{"refs":[{"id":"ref-for-dfn-progress-event\u2461"},{"id":"ref-for-dfn-progress-event\u2462"},{"id":"ref-for-dfn-progress-event\u2463"}],"title":"6.4.2. Summary of Event Invariants"}],"url":"#dfn-progress-event"}, "dfn-readAsArrayBuffer": {"dfnID":"dfn-readAsArrayBuffer","dfnText":"readAsArrayBuffer(blob)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsArrayBuffer"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-readAsArrayBuffer\u2460"}],"title":"6.2.3. Reading a File or Blob"},{"refs":[{"id":"ref-for-dfn-readAsArrayBuffer\u2461"}],"title":"6.2.3.3. The readAsArrayBuffer()"},{"refs":[{"id":"ref-for-dfn-readAsArrayBuffer\u2462"}],"title":"6.2.3.4. The readAsBinaryString() method"}],"url":"#dfn-readAsArrayBuffer"}, "dfn-readAsArrayBufferSync": {"dfnID":"dfn-readAsArrayBufferSync","dfnText":"readAsArrayBuffer(blob)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsArrayBufferSync"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-dfn-readAsArrayBufferSync\u2460"}],"title":"6.5.1.4. The readAsArrayBuffer() method"},{"refs":[{"id":"ref-for-dfn-readAsArrayBufferSync\u2461"}],"title":"6.5.1.5. The readAsBinaryString() method"}],"url":"#dfn-readAsArrayBufferSync"}, "dfn-readAsBinaryString": {"dfnID":"dfn-readAsBinaryString","dfnText":"readAsBinaryString(blob)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsBinaryString"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-readAsBinaryString\u2460"}],"title":"6.2.3. Reading a File or Blob"},{"refs":[{"id":"ref-for-dfn-readAsBinaryString\u2461"},{"id":"ref-for-dfn-readAsBinaryString\u2462"}],"title":"6.2.3.4. The readAsBinaryString() method"}],"url":"#dfn-readAsBinaryString"}, "dfn-readAsBinaryStringSync": {"dfnID":"dfn-readAsBinaryStringSync","dfnText":"readAsBinaryString(blob)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsBinaryStringSync"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-dfn-readAsBinaryStringSync\u2460"},{"id":"ref-for-dfn-readAsBinaryStringSync\u2461"}],"title":"6.5.1.5. The readAsBinaryString() method"}],"url":"#dfn-readAsBinaryStringSync"}, "dfn-readAsDataURL": {"dfnID":"dfn-readAsDataURL","dfnText":"readAsDataURL(blob)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsDataURL"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-readAsDataURL\u2460"}],"title":"6.2.3. Reading a File or Blob"},{"refs":[{"id":"ref-for-dfn-readAsDataURL\u2461"}],"title":"6.2.3.1. The readAsDataURL() method"}],"url":"#dfn-readAsDataURL"}, "dfn-readAsDataURLSync": {"dfnID":"dfn-readAsDataURLSync","dfnText":"readAsDataURL(blob)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsDataURLSync"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-dfn-readAsDataURLSync\u2460"}],"title":"6.5.1.3. The readAsDataURL() method"}],"url":"#dfn-readAsDataURLSync"}, "dfn-readAsText": {"dfnID":"dfn-readAsText","dfnText":"readAsText(blob, encoding)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsText"}],"title":"3.3.3. The text() method"},{"refs":[{"id":"ref-for-dfn-readAsText\u2460"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-readAsText\u2461"}],"title":"6.2.3. Reading a File or Blob"},{"refs":[{"id":"ref-for-dfn-readAsText\u2462"}],"title":"6.2.3.2. The readAsText() method"}],"url":"#dfn-readAsText"}, "dfn-readAsTextSync": {"dfnID":"dfn-readAsTextSync","dfnText":"readAsText(blob, encoding)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-readAsTextSync"}],"title":"6.5.1. The FileReaderSync API"},{"refs":[{"id":"ref-for-dfn-readAsTextSync\u2460"}],"title":"6.5.1.2. The readAsText()"}],"url":"#dfn-readAsTextSync"}, "dfn-revokeObjectURL": {"dfnID":"dfn-revokeObjectURL","dfnText":"revokeObjectURL(url)","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-revokeObjectURL"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-dfn-revokeObjectURL\u2460"},{"id":"ref-for-dfn-revokeObjectURL\u2461"}],"title":"8.4. Creating and Revoking a blob URL"},{"refs":[{"id":"ref-for-dfn-revokeObjectURL\u2462"},{"id":"ref-for-dfn-revokeObjectURL\u2463"}],"title":"8.4.1. Examples of blob URL Creation and Revocation"}],"url":"#dfn-revokeObjectURL"}, "dfn-size": {"dfnID":"dfn-size","dfnText":"size","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-size"},{"id":"ref-for-dfn-size\u2460"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-dfn-size\u2461"},{"id":"ref-for-dfn-size\u2462"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-size\u2463"},{"id":"ref-for-dfn-size\u2464"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-dfn-size\u2465"}],"title":"4.1. Constructor"}],"url":"#dfn-size"}, "dfn-slice": {"dfnID":"dfn-slice","dfnText":"slice()","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-slice"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-slice\u2460"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-dfn-slice\u2461"},{"id":"ref-for-dfn-slice\u2462"}],"title":"3.3.1. The slice() method"}],"url":"#dfn-slice"}, "dfn-type": {"dfnID":"dfn-type","dfnText":"type","external":false,"refSections":[{"refs":[{"id":"ref-for-dfn-type"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-dfn-type\u2460"},{"id":"ref-for-dfn-type\u2461"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dfn-type\u2462"},{"id":"ref-for-dfn-type\u2463"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-dfn-type\u2464"},{"id":"ref-for-dfn-type\u2465"}],"title":"3.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-dfn-type\u2466"},{"id":"ref-for-dfn-type\u2467"},{"id":"ref-for-dfn-type\u2468"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-dfn-type\u2460\u24ea"}],"title":"3.3.1. The slice() method"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2460"},{"id":"ref-for-dfn-type\u2460\u2461"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2462"}],"title":"4.1. Constructor"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2463"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2464"}],"title":"6.3. Packaging data"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2465"}],"title":"6.5.1.2. The readAsText()"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2466"}],"title":"6.5.1.3. The readAsDataURL() method"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2467"}],"title":"6.5.1.4. The readAsArrayBuffer() method"},{"refs":[{"id":"ref-for-dfn-type\u2460\u2468"}],"title":"6.5.1.5. The readAsBinaryString() method"}],"url":"#dfn-type"}, "dom-blob-arraybuffer": {"dfnID":"dom-blob-arraybuffer","dfnText":"arrayBuffer()","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-blob-arraybuffer"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dom-blob-arraybuffer\u2460"}],"title":"3.3.4. The arrayBuffer() method"}],"url":"#dom-blob-arraybuffer"}, "dom-blob-blob": {"dfnID":"dom-blob-blob","dfnText":"constructor","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-blob-blob"},{"id":"ref-for-dom-blob-blob\u2460"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-dom-blob-blob\u2461"}],"title":"3.1.1. Constructor Parameters"}],"url":"#dom-blob-blob"}, "dom-blob-blob-blobparts-options-options": {"dfnID":"dom-blob-blob-blobparts-options-options","dfnText":"options","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-blob-blob-blobparts-options-options"},{"id":"ref-for-dom-blob-blob-blobparts-options-options\u2460"}],"title":"3.1. Constructors"}],"url":"#dom-blob-blob-blobparts-options-options"}, "dom-blob-bytes": {"dfnID":"dom-blob-bytes","dfnText":"bytes()","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-blob-bytes"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dom-blob-bytes\u2460"}],"title":"3.3.5. The bytes() method"}],"url":"#dom-blob-bytes"}, "dom-blob-slice-start-end-contenttype-contenttype": {"dfnID":"dom-blob-slice-start-end-contenttype-contenttype","dfnText":"contentType","external":false,"refSections":[],"url":"#dom-blob-slice-start-end-contenttype-contenttype"}, "dom-blob-slice-start-end-contenttype-end": {"dfnID":"dom-blob-slice-start-end-contenttype-end","dfnText":"end","external":false,"refSections":[],"url":"#dom-blob-slice-start-end-contenttype-end"}, "dom-blob-slice-start-end-contenttype-start": {"dfnID":"dom-blob-slice-start-end-contenttype-start","dfnText":"start","external":false,"refSections":[],"url":"#dom-blob-slice-start-end-contenttype-start"}, "dom-blob-stream": {"dfnID":"dom-blob-stream","dfnText":"stream()","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-blob-stream"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dom-blob-stream\u2460"}],"title":"3.3.2. The stream() method"}],"url":"#dom-blob-stream"}, "dom-blob-text": {"dfnID":"dom-blob-text","dfnText":"text()","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-blob-text"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dom-blob-text\u2460"}],"title":"3.3.3. The text() method"}],"url":"#dom-blob-text"}, "dom-blobpropertybag-endings": {"dfnID":"dom-blobpropertybag-endings","dfnText":"endings","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-blobpropertybag-endings"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-dom-blobpropertybag-endings\u2460"}],"title":"3.1.1. Constructor Parameters"}],"url":"#dom-blobpropertybag-endings"}, "dom-endingtype-native": {"dfnID":"dom-endingtype-native","dfnText":"\"native\"","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-endingtype-native"},{"id":"ref-for-dom-endingtype-native\u2460"},{"id":"ref-for-dom-endingtype-native\u2461"}],"title":"3.1.1. Constructor Parameters"}],"url":"#dom-endingtype-native"}, "dom-endingtype-transparent": {"dfnID":"dom-endingtype-transparent","dfnText":"\"transparent\"","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-endingtype-transparent"},{"id":"ref-for-dom-endingtype-transparent\u2460"}],"title":"3.1.1. Constructor Parameters"}],"url":"#dom-endingtype-transparent"}, "dom-file-file": {"dfnID":"dom-file-file","dfnText":"constructor","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-file-file"}],"title":"4.1. Constructor"},{"refs":[{"id":"ref-for-dom-file-file\u2460"}],"title":"4.1.1. Constructor Parameters"}],"url":"#dom-file-file"}, "dom-file-file-filebits-filename-options-options": {"dfnID":"dom-file-file-filebits-filename-options-options","dfnText":"options","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-file-file-filebits-filename-options-options"}],"title":"4.1. Constructor"}],"url":"#dom-file-file-filebits-filename-options-options"}, "dom-filereader-done": {"dfnID":"dom-filereader-done","dfnText":"DONE","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-filereader-done"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dom-filereader-done\u2460"},{"id":"ref-for-dom-filereader-done\u2461"}],"title":"6.2.2. FileReader States"}],"url":"#dom-filereader-done"}, "dom-filereader-empty": {"dfnID":"dom-filereader-empty","dfnText":"EMPTY","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-filereader-empty"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dom-filereader-empty\u2460"}],"title":"6.2.2. FileReader States"}],"url":"#dom-filereader-empty"}, "dom-filereader-error": {"dfnID":"dom-filereader-error","dfnText":"error","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-filereader-error"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-dom-filereader-error\u2460"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dom-filereader-error\u2461"},{"id":"ref-for-dom-filereader-error\u2462"},{"id":"ref-for-dom-filereader-error\u2463"},{"id":"ref-for-dom-filereader-error\u2464"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#dom-filereader-error"}, "dom-filereader-loading": {"dfnID":"dom-filereader-loading","dfnText":"LOADING","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-filereader-loading"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dom-filereader-loading\u2460"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-dom-filereader-loading\u2461"}],"title":"6.2.3. Reading a File or Blob"}],"url":"#dom-filereader-loading"}, "dom-filereader-readasarraybuffer-blob-blob": {"dfnID":"dom-filereader-readasarraybuffer-blob-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereader-readasarraybuffer-blob-blob"}, "dom-filereader-readasbinarystring-blob-blob": {"dfnID":"dom-filereader-readasbinarystring-blob-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereader-readasbinarystring-blob-blob"}, "dom-filereader-readasdataurl-blob-blob": {"dfnID":"dom-filereader-readasdataurl-blob-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereader-readasdataurl-blob-blob"}, "dom-filereader-readastext-blob-encoding-blob": {"dfnID":"dom-filereader-readastext-blob-encoding-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereader-readastext-blob-encoding-blob"}, "dom-filereader-readastext-blob-encoding-encoding": {"dfnID":"dom-filereader-readastext-blob-encoding-encoding","dfnText":"encoding","external":false,"refSections":[],"url":"#dom-filereader-readastext-blob-encoding-encoding"}, "dom-filereader-readystate": {"dfnID":"dom-filereader-readystate","dfnText":"readyState","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-filereader-readystate"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-dom-filereader-readystate\u2460"},{"id":"ref-for-dom-filereader-readystate\u2461"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-dom-filereader-readystate\u2462"}],"title":"6.2.3. Reading a File or Blob"}],"url":"#dom-filereader-readystate"}, "dom-filereader-result": {"dfnID":"dom-filereader-result","dfnText":"result","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-filereader-result"}],"title":"6.2. The FileReader API"}],"url":"#dom-filereader-result"}, "dom-filereadersync-filereadersync": {"dfnID":"dom-filereadersync-filereadersync","dfnText":"constructor","external":false,"refSections":[{"refs":[{"id":"ref-for-dom-filereadersync-filereadersync"}],"title":"6.5.1.1. Constructors"}],"url":"#dom-filereadersync-filereadersync"}, "dom-filereadersync-readasarraybuffer-blob-blob": {"dfnID":"dom-filereadersync-readasarraybuffer-blob-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereadersync-readasarraybuffer-blob-blob"}, "dom-filereadersync-readasbinarystring-blob-blob": {"dfnID":"dom-filereadersync-readasbinarystring-blob-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereadersync-readasbinarystring-blob-blob"}, "dom-filereadersync-readasdataurl-blob-blob": {"dfnID":"dom-filereadersync-readasdataurl-blob-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereadersync-readasdataurl-blob-blob"}, "dom-filereadersync-readastext-blob-encoding-blob": {"dfnID":"dom-filereadersync-readastext-blob-encoding-blob","dfnText":"blob","external":false,"refSections":[],"url":"#dom-filereadersync-readastext-blob-encoding-blob"}, "dom-filereadersync-readastext-blob-encoding-encoding": {"dfnID":"dom-filereadersync-readastext-blob-encoding-encoding","dfnText":"encoding","external":false,"refSections":[],"url":"#dom-filereadersync-readastext-blob-encoding-encoding"}, "dom-url-createobjecturl-obj-obj": {"dfnID":"dom-url-createobjecturl-obj-obj","dfnText":"obj","external":false,"refSections":[],"url":"#dom-url-createobjecturl-obj-obj"}, "dom-url-revokeobjecturl-url-url": {"dfnID":"dom-url-revokeobjecturl-url-url","dfnText":"url","external":false,"refSections":[],"url":"#dom-url-revokeobjecturl-url-url"}, "e031fa01": {"dfnID":"e031fa01","dfnText":"supported property indices","external":true,"refSections":[{"refs":[{"id":"ref-for-dfn-supported-property-indices"}],"title":"5.2. Methods and Parameters"}],"url":"https://webidl.spec.whatwg.org/#dfn-supported-property-indices"}, "e270bd2a": {"dfnID":"e270bd2a","dfnText":"task","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-task"},{"id":"ref-for-concept-task\u2460"}],"title":"6.2.3.5. The abort() method"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-task"}, "e97a9688": {"dfnID":"e97a9688","dfnText":"unsigned long","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-unsigned-long"},{"id":"ref-for-idl-unsigned-long\u2460"}],"title":"5. The FileList Interface"},{"refs":[{"id":"ref-for-idl-unsigned-long\u2461"}],"title":"5.1. Attributes"}],"url":"https://webidl.spec.whatwg.org/#idl-unsigned-long"}, "e99bd18e": {"dfnID":"e99bd18e","dfnText":"relevant global object","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-relevant-global"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-global"}, "eb1b1af3": {"dfnID":"eb1b1af3","dfnText":"network error","external":true,"refSections":[{"refs":[{"id":"ref-for-concept-network-error"},{"id":"ref-for-concept-network-error\u2460"},{"id":"ref-for-concept-network-error\u2461"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://fetch.spec.whatwg.org/#concept-network-error"}, "eb5c4be3": {"dfnID":"eb5c4be3","dfnText":"Serializable","external":true,"refSections":[{"refs":[{"id":"ref-for-serializable"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-serializable\u2460"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-serializable\u2461"}],"title":"5. The FileList Interface"}],"url":"https://html.spec.whatwg.org/multipage/structured-data.html#serializable"}, "ef28f15d": {"dfnID":"ef28f15d","dfnText":"get a reader","external":true,"refSections":[{"refs":[{"id":"ref-for-readablestream-get-a-reader"}],"title":"3.3.3. The text() method"},{"refs":[{"id":"ref-for-readablestream-get-a-reader\u2460"}],"title":"3.3.4. The arrayBuffer() method"},{"refs":[{"id":"ref-for-readablestream-get-a-reader\u2461"}],"title":"3.3.5. The bytes() method"},{"refs":[{"id":"ref-for-readablestream-get-a-reader\u2462"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-readablestream-get-a-reader\u2463"}],"title":"6.5.1.2. The readAsText()"},{"refs":[{"id":"ref-for-readablestream-get-a-reader\u2464"}],"title":"6.5.1.3. The readAsDataURL() method"},{"refs":[{"id":"ref-for-readablestream-get-a-reader\u2465"}],"title":"6.5.1.4. The readAsArrayBuffer() method"},{"refs":[{"id":"ref-for-readablestream-get-a-reader\u2466"}],"title":"6.5.1.5. The readAsBinaryString() method"}],"url":"https://streams.spec.whatwg.org/#readablestream-get-a-reader"}, "enumdef-endingtype": {"dfnID":"enumdef-endingtype","dfnText":"EndingType","external":false,"refSections":[{"refs":[{"id":"ref-for-enumdef-endingtype"}],"title":"3. The Blob Interface and Binary Data"}],"url":"#enumdef-endingtype"}, "f06432d7": {"dfnID":"f06432d7","dfnText":"URL","external":true,"refSections":[{"refs":[{"id":"ref-for-url"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-url\u2460"},{"id":"ref-for-url\u2461"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"https://url.spec.whatwg.org/#url"}, "f0811ff8": {"dfnID":"f0811ff8","dfnText":"img","external":true,"refSections":[{"refs":[{"id":"ref-for-the-img-element"}],"title":"8.1. Introduction"},{"refs":[{"id":"ref-for-the-img-element\u2460"}],"title":"8.4.1. Examples of blob URL Creation and Revocation"}],"url":"https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element"}, "f0951476": {"dfnID":"f0951476","dfnText":"EventHandler","external":true,"refSections":[{"refs":[{"id":"ref-for-eventhandler"},{"id":"ref-for-eventhandler\u2460"},{"id":"ref-for-eventhandler\u2461"},{"id":"ref-for-eventhandler\u2462"},{"id":"ref-for-eventhandler\u2463"},{"id":"ref-for-eventhandler\u2464"}],"title":"6.2. The FileReader API"}],"url":"https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"}, "f14b47b8": {"dfnID":"f14b47b8","dfnText":"unsigned long long","external":true,"refSections":[{"refs":[{"id":"ref-for-idl-unsigned-long-long"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-idl-unsigned-long-long\u2460"}],"title":"3.2. Attributes"}],"url":"https://webidl.spec.whatwg.org/#idl-unsigned-long-long"}, "f32dc6c1": {"dfnID":"f32dc6c1","dfnText":"serialization steps","external":true,"refSections":[{"refs":[{"id":"ref-for-serialization-steps"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-serialization-steps\u2460"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-serialization-steps\u2461"}],"title":"5. The FileList Interface"}],"url":"https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps"}, "f5354b9d": {"dfnID":"f5354b9d","dfnText":"byte","external":true,"refSections":[{"refs":[{"id":"ref-for-byte"},{"id":"ref-for-byte\u2460"},{"id":"ref-for-byte\u2461"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-byte\u2462"},{"id":"ref-for-byte\u2463"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-byte\u2464"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-byte\u2465"},{"id":"ref-for-byte\u2466"},{"id":"ref-for-byte\u2467"}],"title":"3.2. Attributes"},{"refs":[{"id":"ref-for-byte\u2468"},{"id":"ref-for-byte\u2460\u24ea"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-byte\u2460\u2460"},{"id":"ref-for-byte\u2460\u2461"}],"title":"4.1. Constructor"}],"url":"https://infra.spec.whatwg.org/#byte"}, "f89c7d0d": {"dfnID":"f89c7d0d","dfnText":"Clamp","external":true,"refSections":[{"refs":[{"id":"ref-for-Clamp"},{"id":"ref-for-Clamp\u2460"}],"title":"3. The Blob Interface and Binary Data"}],"url":"https://webidl.spec.whatwg.org/#Clamp"}, "failureReason": {"dfnID":"failureReason","dfnText":"failure reason","external":false,"refSections":[{"refs":[{"id":"ref-for-failureReason"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-failureReason\u2460"},{"id":"ref-for-failureReason\u2461"},{"id":"ref-for-failureReason\u2462"},{"id":"ref-for-failureReason\u2463"},{"id":"ref-for-failureReason\u2464"},{"id":"ref-for-failureReason\u2465"},{"id":"ref-for-failureReason\u2466"},{"id":"ref-for-failureReason\u2467"},{"id":"ref-for-failureReason\u2468"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#failureReason"}, "fc5a3214": {"dfnID":"fc5a3214","dfnText":"parameters","external":true,"refSections":[{"refs":[{"id":"ref-for-parameters"}],"title":"6.3. Packaging data"}],"url":"https://mimesniff.spec.whatwg.org/#parameters"}, "file-error-read": {"dfnID":"file-error-read","dfnText":"File read errors","external":false,"refSections":[{"refs":[{"id":"ref-for-file-error-read"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-file-error-read\u2460"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-file-error-read\u2461"}],"title":"6.4.1. Event Summary"}],"url":"#file-error-read"}, "file-type-guidelines": {"dfnID":"file-type-guidelines","dfnText":"file type guidelines","external":false,"refSections":[{"refs":[{"id":"ref-for-file-type-guidelines"}],"title":"3.2. Attributes"}],"url":"#file-type-guidelines"}, "fileReadingTaskSource": {"dfnID":"fileReadingTaskSource","dfnText":"file reading task source","external":false,"refSections":[{"refs":[{"id":"ref-for-fileReadingTaskSource"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-fileReadingTaskSource\u2460"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-fileReadingTaskSource\u2461"}],"title":"6.2.3.5. The abort() method"}],"url":"#fileReadingTaskSource"}, "filereader-error": {"dfnID":"filereader-error","dfnText":"error","external":false,"refSections":[{"refs":[{"id":"ref-for-filereader-error"},{"id":"ref-for-filereader-error\u2460"},{"id":"ref-for-filereader-error\u2461"},{"id":"ref-for-filereader-error\u2462"}],"title":"6.2. The FileReader API"}],"url":"#filereader-error"}, "filereader-result": {"dfnID":"filereader-result","dfnText":"result","external":false,"refSections":[{"refs":[{"id":"ref-for-filereader-result"},{"id":"ref-for-filereader-result\u2460"},{"id":"ref-for-filereader-result\u2461"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-filereader-result\u2462"},{"id":"ref-for-filereader-result\u2463"}],"title":"6.2.3.5. The abort() method"}],"url":"#filereader-result"}, "filereader-state": {"dfnID":"filereader-state","dfnText":"state","external":false,"refSections":[{"refs":[{"id":"ref-for-filereader-state"},{"id":"ref-for-filereader-state\u2460"},{"id":"ref-for-filereader-state\u2461"},{"id":"ref-for-filereader-state\u2462"},{"id":"ref-for-filereader-state\u2463"},{"id":"ref-for-filereader-state\u2464"},{"id":"ref-for-filereader-state\u2465"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-filereader-state\u2466"},{"id":"ref-for-filereader-state\u2467"},{"id":"ref-for-filereader-state\u2468"},{"id":"ref-for-filereader-state\u2460\u24ea"},{"id":"ref-for-filereader-state\u2460\u2460"}],"title":"6.2.3.5. The abort() method"}],"url":"#filereader-state"}, "filereaderConstrctr": {"dfnID":"filereaderConstrctr","dfnText":"FileReader()","external":false,"refSections":[{"refs":[{"id":"ref-for-filereaderConstrctr"}],"title":"6.2. The FileReader API"}],"url":"#filereaderConstrctr"}, "fire-a-progress-event": {"dfnID":"fire-a-progress-event","dfnText":"fire a progress event","external":false,"refSections":[{"refs":[{"id":"ref-for-fire-a-progress-event"},{"id":"ref-for-fire-a-progress-event\u2460"},{"id":"ref-for-fire-a-progress-event\u2461"},{"id":"ref-for-fire-a-progress-event\u2462"},{"id":"ref-for-fire-a-progress-event\u2463"},{"id":"ref-for-fire-a-progress-event\u2464"},{"id":"ref-for-fire-a-progress-event\u2465"}],"title":"6.2. The FileReader API"},{"refs":[{"id":"ref-for-fire-a-progress-event\u2466"},{"id":"ref-for-fire-a-progress-event\u2467"}],"title":"6.2.3.5. The abort() method"}],"url":"#fire-a-progress-event"}, "lifeTime": {"dfnID":"lifeTime","dfnText":"8.3.3. Lifetime of blob URLs","external":false,"refSections":[{"refs":[{"id":"ref-for-lifeTime"}],"title":"8.3.3. Lifetime of blob URLs"},{"refs":[{"id":"ref-for-lifeTime"}],"title":"8.4.1. Examples of blob URL Creation and Revocation"}],"url":"#lifeTime"}, "process-blob-parts": {"dfnID":"process-blob-parts","dfnText":"process blob parts","external":false,"refSections":[{"refs":[{"id":"ref-for-process-blob-parts"}],"title":"3.1. Constructors"},{"refs":[{"id":"ref-for-process-blob-parts\u2460"}],"title":"4.1. Constructor"}],"url":"#process-blob-parts"}, "read-method": {"dfnID":"read-method","dfnText":"read methods","external":false,"refSections":[{"refs":[{"id":"ref-for-read-method"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-read-method\u2460"},{"id":"ref-for-read-method\u2461"},{"id":"ref-for-read-method\u2462"},{"id":"ref-for-read-method\u2463"}],"title":"6.2.2. FileReader States"},{"refs":[{"id":"ref-for-read-method\u2464"}],"title":"6.2.3.5. The abort() method"},{"refs":[{"id":"ref-for-read-method\u2465"},{"id":"ref-for-read-method\u2466"},{"id":"ref-for-read-method\u2467"}],"title":"6.4.2. Summary of Event Invariants"}],"url":"#read-method"}, "read-method-sync": {"dfnID":"read-method-sync","dfnText":"synchronously read","external":false,"refSections":[{"refs":[{"id":"ref-for-read-method-sync"}],"title":"6.2.3. Reading a File or Blob"},{"refs":[{"id":"ref-for-read-method-sync\u2460"}],"title":"7. Errors and Exceptions"}],"url":"#read-method-sync"}, "readOperation": {"dfnID":"readOperation","dfnText":"read operation","external":false,"refSections":[{"refs":[{"id":"ref-for-readOperation"}],"title":"4.2. Attributes"},{"refs":[{"id":"ref-for-readOperation\u2460"}],"title":"6.2.3.1. The readAsDataURL() method"},{"refs":[{"id":"ref-for-readOperation\u2461"}],"title":"6.2.3.2. The readAsText() method"},{"refs":[{"id":"ref-for-readOperation\u2462"}],"title":"6.2.3.3. The readAsArrayBuffer()"},{"refs":[{"id":"ref-for-readOperation\u2463"}],"title":"6.2.3.4. The readAsBinaryString() method"},{"refs":[{"id":"ref-for-readOperation\u2464"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#readOperation"}, "removeTheEntry": {"dfnID":"removeTheEntry","dfnText":"\nremove an entry from the blob URL store","external":false,"refSections":[{"refs":[{"id":"ref-for-removeTheEntry"}],"title":"8.4. Creating and Revoking a blob URL"}],"url":"#removeTheEntry"}, "slice-blob": {"dfnID":"slice-blob","dfnText":"slice blob","external":false,"refSections":[{"refs":[{"id":"ref-for-slice-blob"},{"id":"ref-for-slice-blob\u2460"}],"title":"2. Terminology and Algorithms"},{"refs":[{"id":"ref-for-slice-blob\u2461"}],"title":"3.3.1. The slice() method"}],"url":"#slice-blob"}, "snapshot-state": {"dfnID":"snapshot-state","dfnText":"snapshot state","external":false,"refSections":[{"refs":[{"id":"ref-for-snapshot-state"},{"id":"ref-for-snapshot-state\u2460"},{"id":"ref-for-snapshot-state\u2461"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-snapshot-state\u2462"},{"id":"ref-for-snapshot-state\u2463"},{"id":"ref-for-snapshot-state\u2464"},{"id":"ref-for-snapshot-state\u2465"},{"id":"ref-for-snapshot-state\u2466"},{"id":"ref-for-snapshot-state\u2467"}],"title":"4. The File Interface"},{"refs":[{"id":"ref-for-snapshot-state\u2468"}],"title":"7. Errors and Exceptions"},{"refs":[{"id":"ref-for-snapshot-state\u2460\u24ea"},{"id":"ref-for-snapshot-state\u2460\u2460"}],"title":"7.1. Throwing an Exception or Returning an Error"}],"url":"#snapshot-state"}, "terminate-an-algorithm": {"dfnID":"terminate-an-algorithm","dfnText":"terminate an algorithm","external":false,"refSections":[{"refs":[{"id":"ref-for-terminate-an-algorithm"},{"id":"ref-for-terminate-an-algorithm\u2460"}],"title":"6.2.3.5. The abort() method"}],"url":"#terminate-an-algorithm"}, "typedefdef-blobpart": {"dfnID":"typedefdef-blobpart","dfnText":"BlobPart","external":false,"refSections":[{"refs":[{"id":"ref-for-typedefdef-blobpart"}],"title":"3. The Blob Interface and Binary Data"},{"refs":[{"id":"ref-for-typedefdef-blobpart\u2460"}],"title":"3.1.1. Constructor Parameters"},{"refs":[{"id":"ref-for-typedefdef-blobpart\u2461"}],"title":"4. The File Interface"}],"url":"#typedefdef-blobpart"}, "unicodeBlobURL": {"dfnID":"unicodeBlobURL","dfnText":"\ngenerate a new blob URL","external":false,"refSections":[{"refs":[{"id":"ref-for-unicodeBlobURL"}],"title":"8.2. Model"}],"url":"#unicodeBlobURL"}, }; document.addEventListener("DOMContentLoaded", ()=>{ genAllDfnPanels(); document.body.addEventListener("click", (e) => { // If not handled already, just hide all dfn panels. hideAllDfnPanels(); }); }); window.addEventListener("resize", () => { // Pin any visible dfn panel queryAll(".dfn-panel.on, .dfn-panel.activated").forEach(el=>positionDfnPanel(el)); }); function genAllDfnPanels() { for(const panelData of Object.values(dfnPanelData)) { const dfnID = panelData.dfnID; const dfn = document.getElementById(dfnID); if(!dfn) { console.log(`Can't find dfn#${dfnID}.`, panelData); continue; } dfn.panelData = panelData; insertDfnPopupAction(dfn); } } function genDfnPanel(dfn, { dfnID, url, dfnText, refSections, external }) { const dfnPanel = mk.aside({ class: "dfn-panel on", id: `infopanel-for-${dfnID}`, "data-for": dfnID, "aria-labelled-by":`infopaneltitle-for-${dfnID}`, }, mk.span({id:`infopaneltitle-for-${dfnID}`, style:"display:none"}, `Info about the '${dfnText}' ${external?"external":""} reference.`), mk.a({href:url, class:"dfn-link"}, url), refSections.length == 0 ? [] : mk.b({}, "Referenced in:"), mk.ul({}, ...refSections.map(section=> mk.li({}, ...section.refs.map((ref, refI)=> [ mk.a({ href: `#${ref.id}` }, (refI == 0) ? section.title : `(${refI + 1})` ), " ", ] ), ), ), ), genLinkingSyntaxes(dfn), ); dfnPanel.addEventListener('click', (event) => { if (event.target.nodeName == 'A') { scrollToTargetAndHighlight(event); pinDfnPanel(dfnPanel); } event.stopPropagation(); refocusOnTarget(event); }); dfnPanel.addEventListener('keydown', (event) => { if(event.keyCode == 27) { // Escape key hideDfnPanel({dfnPanel}); event.stopPropagation(); event.preventDefault(); } }); dfnPanel.dfn = dfn; dfn.dfnPanel = dfnPanel; return dfnPanel; } function hideAllDfnPanels() { // Delete the currently-active dfn panel. queryAll(".dfn-panel").forEach(dfnPanel=>hideDfnPanel({dfnPanel})); } function showDfnPanel(dfn) { hideAllDfnPanels(); // Only display one at a time. dfn.setAttribute("aria-expanded", "true"); const dfnPanel = genDfnPanel(dfn, dfn.panelData); // Give the dfn a unique tabindex, and then // give all the tabbable panel bits successive indexes. let tabIndex = 100; dfn.tabIndex = tabIndex++; const tabbable = dfnPanel.querySelectorAll(":is(a, button)"); for (const el of tabbable) { el.tabIndex = tabIndex++; } append(document.body, dfnPanel); positionDfnPanel(dfnPanel); } function positionDfnPanel(dfnPanel) { const dfn = dfnPanel.dfn; const dfnPos = getBounds(dfn); dfnPanel.style.top = dfnPos.bottom + "px"; dfnPanel.style.left = dfnPos.left + "px"; const panelPos = dfnPanel.getBoundingClientRect(); const panelMargin = 8; const maxRight = document.body.parentNode.clientWidth - panelMargin; if (panelPos.right > maxRight) { const overflowAmount = panelPos.right - maxRight; const newLeft = Math.max(panelMargin, dfnPos.left - overflowAmount); dfnPanel.style.left = newLeft + "px"; } } function pinDfnPanel(dfnPanel) { // Switch it to "activated" state, which pins it. dfnPanel.classList.add("activated"); dfnPanel.style.position = "fixed"; dfnPanel.style.left = null; dfnPanel.style.top = null; } function hideDfnPanel({dfn, dfnPanel}) { if(!dfnPanel) dfnPanel = dfn.dfnPanel; if(!dfn) dfn = dfnPanel.dfn; dfn.dfnPanel = undefined; dfnPanel.dfn = undefined; dfn.setAttribute("aria-expanded", "false"); dfn.tabIndex = undefined; dfnPanel.remove() } function toggleDfnPanel(dfn) { if(dfn.dfnPanel) { hideDfnPanel(dfn); } else { showDfnPanel(dfn); } } function insertDfnPopupAction(dfn) { dfn.setAttribute('role', 'button'); dfn.setAttribute('aria-expanded', 'false') dfn.tabIndex = 0; dfn.classList.add('has-dfn-panel'); dfn.addEventListener('click', (event) => { toggleDfnPanel(dfn); event.stopPropagation(); }); dfn.addEventListener('keypress', (event) => { const kc = event.keyCode; // 32->Space, 13->Enter if(kc == 32 || kc == 13) { toggleDfnPanel(dfn); event.stopPropagation(); event.preventDefault(); } }); } function refocusOnTarget(event) { const target = event.target; setTimeout(() => { // Refocus on the event.target element. // This is needed after browser scrolls to the destination. target.focus(); }); } // TODO: shared util // Returns the root-level absolute position {left and top} of element. function getBounds(el, relativeTo=document.body) { const relativeRect = relativeTo.getBoundingClientRect(); const elRect = el.getBoundingClientRect(); const top = elRect.top - relativeRect.top; const left = elRect.left - relativeRect.left; return { top, left, bottom: top + elRect.height, right: left + elRect.width, } } function scrollToTargetAndHighlight(event) { let hash = event.target.hash; if (hash) { hash = decodeURIComponent(hash.substring(1)); const dest = document.getElementById(hash); if (dest) { dest.classList.add('highlighted'); setTimeout(() => dest.classList.remove('highlighted'), 1000); } } } // Functions, divided by link type, that wrap an autolink's // contents with the appropriate outer syntax. // Alternately, a string naming another type they format // the same as. function needsFor(type) { switch(type) { case "descriptor": case "value": case "element-attr": case "attr-value": case "element-state": case "method": case "constructor": case "argument": case "attribute": case "const": case "dict-member": case "event": case "enum-value": case "stringifier": case "serializer": case "iterator": case "maplike": case "setlike": case "state": case "mode": case "context": case "facet": return true; default: return false; } } function refusesFor(type) { switch(type) { case "property": case "element": case "interface": case "namespace": case "callback": case "dictionary": case "enum": case "exception": case "typedef": case "http-header": case "permission": return true; default: return false; } } function linkFormatterFromType(type) { switch(type) { case 'scheme': case 'permission': case 'dfn': return (text) => `[=${text}=]`; case 'abstract-op': return (text) => `[\$${text}\$]`; case 'function': case 'at-rule': case 'selector': case 'value': return (text) => `''${text}''`; case 'http-header': return (text) => `[:${text}:]`; case 'interface': case 'constructor': case 'method': case 'argument': case 'attribute': case 'callback': case 'dictionary': case 'dict-member': case 'enum': case 'enum-value': case 'exception': case 'const': case 'typedef': case 'stringifier': case 'serializer': case 'iterator': case 'maplike': case 'setlike': case 'extended-attribute': case 'event': case 'idl': return (text) => `{{${text}}}`; case 'element-state': case 'element-attr': case 'attr-value': case 'element': return (element) => `<{${element}}>`; case 'grammar': return (text) => `${text} (within a <pre class=prod>)`; case 'type': return (text)=> `<<${text}>>`; case 'descriptor': case 'property': return (text) => `'${text}'`; default: return; }; }; function genLinkingSyntaxes(dfn) { if(dfn.tagName != "DFN") return; const type = dfn.getAttribute('data-dfn-type'); if(!type) { console.log(`<dfn> doesn't have a data-dfn-type:`, dfn); return []; } // Return a function that wraps link text based on the type const linkFormatter = linkFormatterFromType(type); if(!linkFormatter) { console.log(`<dfn> has an unknown data-dfn-type:`, dfn); return []; } let ltAlts; if(dfn.hasAttribute('data-lt')) { ltAlts = dfn.getAttribute('data-lt') .split("|") .map(x=>x.trim()); } else { ltAlts = [dfn.textContent.trim()]; } if(type == "type") { // lt of "<foo>", but "foo" is the interior; // <<foo/bar>> is how you write it with a for, // not <foo/<bar>> or whatever. for(var i = 0; i < ltAlts.length; i++) { const lt = ltAlts[i]; const match = /<(.*)>/.exec(lt); if(match) { ltAlts[i] = match[1]; } } } let forAlts; if(dfn.hasAttribute('data-dfn-for')) { forAlts = dfn.getAttribute('data-dfn-for') .split(",") .map(x=>x.trim()); } else { forAlts = ['']; } let linkingSyntaxes = []; if(!needsFor(type)) { for(const lt of ltAlts) { linkingSyntaxes.push(linkFormatter(lt)); } } if(!refusesFor(type)) { for(const f of forAlts) { linkingSyntaxes.push(linkFormatter(`${f}/${ltAlts[0]}`)) } } return [ mk.b({}, 'Possible linking syntaxes:'), mk.ul({}, ...linkingSyntaxes.map(link => { const copyLink = async () => await navigator.clipboard.writeText(link); return mk.li({}, mk.div({ class: 'link-item' }, mk.button({ class: 'copy-icon', title: 'Copy', type: 'button', _onclick: copyLink, tabindex: 0, }, mk.span({ class: 'icon' }) ), mk.span({}, link) ) ); }) ) ]; } } </script> <script>/* Boilerplate: script-position-annos */ "use strict"; { function repositionAnnoPanels(){ const panels = [...document.querySelectorAll("[data-anno-for]")]; hydratePanels(panels); let vSoFar = 0; for(const panel of panels.sort(cmpTops)) { if(panel.top < vSoFar) { panel.top = vSoFar; panel.style.top = vSoFar + "px"; } vSoFar = panel.top + panel.height + 15; } } function hydratePanels(panels) { const main = document.querySelector("main"); let mainRect; if(main) mainRect = main.getBoundingClientRect(); // First display them all, if they're not already visible. for(const panel of panels) { panel.classList.remove("unpositioned"); } // Measure them all for(const panel of panels) { const dfn = document.getElementById(panel.getAttribute("data-anno-for")); if(!dfn) { console.log("Can't find the annotation panel target:", panel); continue; } panel.dfn = dfn; panel.top = window.scrollY + dfn.getBoundingClientRect().top; let panelRect = panel.getBoundingClientRect(); panel.height = panelRect.height; if(main) { panel.overlappingMain = panelRect.left < mainRect.right; } else { panel.overlappingMain = false; } } // And finally position them for(const panel of panels) { const dfn = panel.dfn; if(!dfn) continue; panel.style.top = panel.top + "px"; panel.classList.toggle("overlapping-main", panel.overlappingMain); } } function cmpTops(a,b) { return a.top - b.top; } window.addEventListener("load", repositionAnnoPanels); window.addEventListener("resize", repositionAnnoPanels); } </script> <script>/* Boilerplate: script-ref-hints */ "use strict"; { let refsData = { "#BlobURLStore": {"displayText":"blob url store","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"blob url store","type":"dfn","url":"#BlobURLStore"}, "#FileLockFR": {"displayText":"filelock","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"filelock","type":"dfn","url":"#FileLockFR"}, "#NotFoundFR": {"displayText":"notfound","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"notfound","type":"dfn","url":"#NotFoundFR"}, "#SnapshotStateFR": {"displayText":"snapshotstate","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"snapshotstate","type":"dfn","url":"#SnapshotStateFR"}, "#TooManyReadsFR": {"displayText":"toomanyreads","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"toomanyreads","type":"dfn","url":"#TooManyReadsFR"}, "#UnixEpoch": {"displayText":"unix epoch","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"unix epoch","type":"dfn","url":"#UnixEpoch"}, "#UnsafeFileFR": {"displayText":"unsafefile","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"unsafefile","type":"dfn","url":"#UnsafeFileFR"}, "#add-an-entry": {"displayText":"adding an entry to the blob url store","export":true,"for_":["blob url store"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"adding an entry to the blob url store","type":"dfn","url":"#add-an-entry"}, "#asynchronous-read-methods": {"displayText":"asynchronous read method","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"asynchronous read method","type":"dfn","url":"#asynchronous-read-methods"}, "#blob-get-stream": {"displayText":"get stream","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"get stream","type":"dfn","url":"#blob-get-stream"}, "#blob-package-data": {"displayText":"package data","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"package data","type":"dfn","url":"#blob-package-data"}, "#blob-url": {"displayText":"blob url","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"blob url","type":"dfn","url":"#blob-url"}, "#blob-url-entry": {"displayText":"blob url entry","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"blob url entry","type":"dfn","url":"#blob-url-entry"}, "#blob-url-entry-environment": {"displayText":"environment","export":true,"for_":["blob URL entry"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"environment","type":"dfn","url":"#blob-url-entry-environment"}, "#blob-url-entry-object": {"displayText":"object","export":true,"for_":["blob URL entry"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"object","type":"dfn","url":"#blob-url-entry-object"}, "#blob-url-obtain-object": {"displayText":"obtain a blob object","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"obtain a blob object","type":"dfn","url":"#blob-url-obtain-object"}, "#check-for-same-partition-blob-url-usage": {"displayText":"check for same-partition blob url usage","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"check for same-partition blob url usage","type":"dfn","url":"#check-for-same-partition-blob-url-usage"}, "#convert-line-endings-to-native": {"displayText":"convert line endings to native","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"convert line endings to native","type":"dfn","url":"#convert-line-endings-to-native"}, "#dfn-BPtype": {"displayText":"type","export":true,"for_":["BlobPropertyBag"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"type","type":"dict-member","url":"#dfn-BPtype"}, "#dfn-Blob": {"displayText":"Blob","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"Blob","type":"interface","url":"#dfn-Blob"}, "#dfn-BlobPropertyBag": {"displayText":"BlobPropertyBag","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"BlobPropertyBag","type":"dictionary","url":"#dfn-BlobPropertyBag"}, "#dfn-FPdate": {"displayText":"lastModified","export":true,"for_":["FilePropertyBag"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"lastModified","type":"dict-member","url":"#dfn-FPdate"}, "#dfn-FilePropertyBag": {"displayText":"FilePropertyBag","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"FilePropertyBag","type":"dictionary","url":"#dfn-FilePropertyBag"}, "#dfn-FileReaderSync": {"displayText":"FileReaderSync","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"FileReaderSync","type":"interface","url":"#dfn-FileReaderSync"}, "#dfn-abort": {"displayText":"abort()","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"abort()","type":"method","url":"#dfn-abort"}, "#dfn-blobParts": {"displayText":"blobParts","export":true,"for_":["Blob/Blob(blobParts, options)"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"blobParts","type":"argument","url":"#dfn-blobParts"}, "#dfn-createObjectURL": {"displayText":"createObjectURL(obj)","export":true,"for_":["URL"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"createObjectURL(obj)","type":"method","url":"#dfn-createObjectURL"}, "#dfn-file": {"displayText":"File","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"File","type":"interface","url":"#dfn-file"}, "#dfn-fileBits": {"displayText":"fileBits","export":true,"for_":["File/File(fileBits, fileName, options)"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"fileBits","type":"argument","url":"#dfn-fileBits"}, "#dfn-fileName": {"displayText":"fileName","export":true,"for_":["File/File(fileBits, fileName, options)"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"fileName","type":"argument","url":"#dfn-fileName"}, "#dfn-filelist": {"displayText":"FileList","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"FileList","type":"interface","url":"#dfn-filelist"}, "#dfn-filereader": {"displayText":"FileReader","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"FileReader","type":"interface","url":"#dfn-filereader"}, "#dfn-index": {"displayText":"index","export":true,"for_":["FileList/item(index)"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"index","type":"argument","url":"#dfn-index"}, "#dfn-item": {"displayText":"item(index)","export":true,"for_":["FileList"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"item(index)","type":"method","url":"#dfn-item"}, "#dfn-lastModified": {"displayText":"lastModified","export":true,"for_":["File"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"lastModified","type":"attribute","url":"#dfn-lastModified"}, "#dfn-length": {"displayText":"length","export":true,"for_":["FileList"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"length","type":"attribute","url":"#dfn-length"}, "#dfn-load-event": {"displayText":"load","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"load","type":"event","url":"#dfn-load-event"}, "#dfn-loadend-event": {"displayText":"loadend","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"loadend","type":"event","url":"#dfn-loadend-event"}, "#dfn-loadstart-event": {"displayText":"loadstart","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"loadstart","type":"event","url":"#dfn-loadstart-event"}, "#dfn-name": {"displayText":"name","export":true,"for_":["File"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"name","type":"attribute","url":"#dfn-name"}, "#dfn-onabort": {"displayText":"onabort","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"onabort","type":"attribute","url":"#dfn-onabort"}, "#dfn-onerror": {"displayText":"onerror","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"onerror","type":"attribute","url":"#dfn-onerror"}, "#dfn-onload": {"displayText":"onload","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"onload","type":"attribute","url":"#dfn-onload"}, "#dfn-onloadend": {"displayText":"onloadend","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"onloadend","type":"attribute","url":"#dfn-onloadend"}, "#dfn-onloadstart": {"displayText":"onloadstart","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"onloadstart","type":"attribute","url":"#dfn-onloadstart"}, "#dfn-onprogress": {"displayText":"onprogress","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"onprogress","type":"attribute","url":"#dfn-onprogress"}, "#dfn-progress-event": {"displayText":"progress","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"progress","type":"event","url":"#dfn-progress-event"}, "#dfn-readAsArrayBuffer": {"displayText":"readAsArrayBuffer(blob)","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsArrayBuffer(blob)","type":"method","url":"#dfn-readAsArrayBuffer"}, "#dfn-readAsArrayBufferSync": {"displayText":"readAsArrayBuffer(blob)","export":true,"for_":["FileReaderSync"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsArrayBuffer(blob)","type":"method","url":"#dfn-readAsArrayBufferSync"}, "#dfn-readAsBinaryString": {"displayText":"readAsBinaryString(blob)","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsBinaryString(blob)","type":"method","url":"#dfn-readAsBinaryString"}, "#dfn-readAsBinaryStringSync": {"displayText":"readAsBinaryString(blob)","export":true,"for_":["FileReaderSync"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsBinaryString(blob)","type":"method","url":"#dfn-readAsBinaryStringSync"}, "#dfn-readAsDataURL": {"displayText":"readAsDataURL(blob)","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsDataURL(blob)","type":"method","url":"#dfn-readAsDataURL"}, "#dfn-readAsDataURLSync": {"displayText":"readAsDataURL(blob)","export":true,"for_":["FileReaderSync"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsDataURL(blob)","type":"method","url":"#dfn-readAsDataURLSync"}, "#dfn-readAsText": {"displayText":"readAsText(blob)","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsText(blob)","type":"method","url":"#dfn-readAsText"}, "#dfn-readAsTextSync": {"displayText":"readAsText(blob, encoding)","export":true,"for_":["FileReaderSync"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readAsText(blob, encoding)","type":"method","url":"#dfn-readAsTextSync"}, "#dfn-revokeObjectURL": {"displayText":"revokeObjectURL(url)","export":true,"for_":["URL"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"revokeObjectURL(url)","type":"method","url":"#dfn-revokeObjectURL"}, "#dfn-size": {"displayText":"size","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"size","type":"attribute","url":"#dfn-size"}, "#dfn-slice": {"displayText":"slice()","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"slice()","type":"method","url":"#dfn-slice"}, "#dfn-type": {"displayText":"type","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"type","type":"attribute","url":"#dfn-type"}, "#dom-blob-arraybuffer": {"displayText":"arrayBuffer()","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"arrayBuffer()","type":"method","url":"#dom-blob-arraybuffer"}, "#dom-blob-blob": {"displayText":"Blob()","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"Blob()","type":"constructor","url":"#dom-blob-blob"}, "#dom-blob-blob-blobparts-options-options": {"displayText":"options","export":true,"for_":["Blob/Blob()","Blob/Blob(blobParts)","Blob/Blob(blobParts, options)","Blob/constructor()","Blob/constructor(blobParts)","Blob/constructor(blobParts, options)"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"options","type":"argument","url":"#dom-blob-blob-blobparts-options-options"}, "#dom-blob-bytes": {"displayText":"bytes()","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"bytes()","type":"method","url":"#dom-blob-bytes"}, "#dom-blob-stream": {"displayText":"stream()","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"stream()","type":"method","url":"#dom-blob-stream"}, "#dom-blob-text": {"displayText":"text()","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"text()","type":"method","url":"#dom-blob-text"}, "#dom-blobpropertybag-endings": {"displayText":"endings","export":true,"for_":["BlobPropertyBag"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"endings","type":"dict-member","url":"#dom-blobpropertybag-endings"}, "#dom-endingtype-native": {"displayText":"\"native\"","export":true,"for_":["EndingType"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"\"native\"","type":"enum-value","url":"#dom-endingtype-native"}, "#dom-endingtype-transparent": {"displayText":"\"transparent\"","export":true,"for_":["EndingType"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"\"transparent\"","type":"enum-value","url":"#dom-endingtype-transparent"}, "#dom-file-file": {"displayText":"File(fileBits, fileName)","export":true,"for_":["File"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"File(fileBits, fileName)","type":"constructor","url":"#dom-file-file"}, "#dom-file-file-filebits-filename-options-options": {"displayText":"options","export":true,"for_":["File/File(fileBits, fileName)","File/File(fileBits, fileName, options)","File/constructor(fileBits, fileName)","File/constructor(fileBits, fileName, options)"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"options","type":"argument","url":"#dom-file-file-filebits-filename-options-options"}, "#dom-filereader-done": {"displayText":"DONE","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"DONE","type":"const","url":"#dom-filereader-done"}, "#dom-filereader-empty": {"displayText":"EMPTY","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"EMPTY","type":"const","url":"#dom-filereader-empty"}, "#dom-filereader-error": {"displayText":"error","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"error","type":"attribute","url":"#dom-filereader-error"}, "#dom-filereader-loading": {"displayText":"LOADING","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"LOADING","type":"const","url":"#dom-filereader-loading"}, "#dom-filereader-readystate": {"displayText":"readyState","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"readyState","type":"attribute","url":"#dom-filereader-readystate"}, "#dom-filereader-result": {"displayText":"result","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"result","type":"attribute","url":"#dom-filereader-result"}, "#dom-filereadersync-filereadersync": {"displayText":"FileReaderSync()","export":true,"for_":["FileReaderSync"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"FileReaderSync()","type":"constructor","url":"#dom-filereadersync-filereadersync"}, "#enumdef-endingtype": {"displayText":"EndingType","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"EndingType","type":"enum","url":"#enumdef-endingtype"}, "#failureReason": {"displayText":"failure reason","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"failure reason","type":"dfn","url":"#failureReason"}, "#file-error-read": {"displayText":"file read error","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"file read error","type":"dfn","url":"#file-error-read"}, "#file-type-guidelines": {"displayText":"file type guidelines","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"file type guidelines","type":"dfn","url":"#file-type-guidelines"}, "#fileReadingTaskSource": {"displayText":"file reading task source","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"file reading task source","type":"dfn","url":"#fileReadingTaskSource"}, "#filereader-error": {"displayText":"error","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"error","type":"dfn","url":"#filereader-error"}, "#filereader-result": {"displayText":"result","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"result","type":"dfn","url":"#filereader-result"}, "#filereader-state": {"displayText":"state","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"state","type":"dfn","url":"#filereader-state"}, "#filereaderConstrctr": {"displayText":"FileReader()","export":true,"for_":["FileReader"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"FileReader()","type":"constructor","url":"#filereaderConstrctr"}, "#fire-a-progress-event": {"displayText":"fire a progress event","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"fire a progress event","type":"dfn","url":"#fire-a-progress-event"}, "#process-blob-parts": {"displayText":"processing blob parts","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"processing blob parts","type":"dfn","url":"#process-blob-parts"}, "#read-method": {"displayText":"read method","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"read method","type":"dfn","url":"#read-method"}, "#read-method-sync": {"displayText":"synchronous read method","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"synchronous read method","type":"dfn","url":"#read-method-sync"}, "#readOperation": {"displayText":"read operation","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"read operation","type":"dfn","url":"#readOperation"}, "#removeTheEntry": {"displayText":"remove an entry from the blob url store","export":true,"for_":["blob url store"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"remove an entry from the blob url store","type":"dfn","url":"#removeTheEntry"}, "#slice-blob": {"displayText":"slice blob","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"slice blob","type":"dfn","url":"#slice-blob"}, "#snapshot-state": {"displayText":"snapshot state","export":true,"for_":["Blob"],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"snapshot state","type":"dfn","url":"#snapshot-state"}, "#terminate-an-algorithm": {"displayText":"terminate this algorithm","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"terminate this algorithm","type":"dfn","url":"#terminate-an-algorithm"}, "#typedefdef-blobpart": {"displayText":"BlobPart","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"BlobPart","type":"typedef","url":"#typedefdef-blobpart"}, "#unicodeBlobURL": {"displayText":"generating a new blob url","export":true,"for_":[],"level":"","normative":true,"shortname":"fileapi","spec":"fileapi","status":"local","text":"generating a new blob url","type":"dfn","url":"#unicodeBlobURL"}, "http://tc39.github.io/ecma262/#sec-array-constructor": {"displayText":"Array","export":true,"for_":[],"level":"262","normative":true,"shortname":"ecma","spec":"ecma-262","status":"anchor-block","text":"Array","type":"interface","url":"http://tc39.github.io/ecma262/#sec-array-constructor"}, "http://tc39.github.io/ecma262/#sec-date-constructor": {"displayText":"Date","export":true,"for_":[],"level":"262","normative":true,"shortname":"ecma","spec":"ecma-262","status":"anchor-block","text":"Date","type":"interface","url":"http://tc39.github.io/ecma262/#sec-date-constructor"}, "http://w3c.github.io/media-source/#mediasource": {"displayText":"MediaSource","export":true,"for_":[],"level":"","normative":true,"shortname":"media-source","spec":"media-source","status":"anchor-block","text":"MediaSource","type":"interface","url":"http://w3c.github.io/media-source/#mediasource"}, "https://dom.spec.whatwg.org/#concept-event-fire": {"displayText":"fire an event","export":true,"for_":[],"level":"1","normative":true,"shortname":"dom","spec":"dom","status":"current","text":"fire an event","type":"dfn","url":"https://dom.spec.whatwg.org/#concept-event-fire"}, "https://dom.spec.whatwg.org/#document": {"displayText":"Document","export":true,"for_":[],"level":"1","normative":true,"shortname":"dom","spec":"dom","status":"current","text":"Document","type":"interface","url":"https://dom.spec.whatwg.org/#document"}, "https://dom.spec.whatwg.org/#eventtarget": {"displayText":"EventTarget","export":true,"for_":[],"level":"1","normative":true,"shortname":"dom","spec":"dom","status":"current","text":"EventTarget","type":"interface","url":"https://dom.spec.whatwg.org/#eventtarget"}, "https://encoding.spec.whatwg.org/#concept-encoding-get": {"displayText":"getting an encoding","export":true,"for_":[],"level":"1","normative":true,"shortname":"encoding","spec":"encoding","status":"current","text":"getting an encoding","type":"dfn","url":"https://encoding.spec.whatwg.org/#concept-encoding-get"}, "https://encoding.spec.whatwg.org/#decode": {"displayText":"decode","export":true,"for_":[],"level":"1","normative":true,"shortname":"encoding","spec":"encoding","status":"current","text":"decode","type":"dfn","url":"https://encoding.spec.whatwg.org/#decode"}, "https://encoding.spec.whatwg.org/#utf-8": {"displayText":"UTF-8","export":true,"for_":[],"level":"1","normative":true,"shortname":"encoding","spec":"encoding","status":"current","text":"utf-8","type":"dfn","url":"https://encoding.spec.whatwg.org/#utf-8"}, "https://encoding.spec.whatwg.org/#utf-8-decode": {"displayText":"UTF-8 decode","export":true,"for_":[],"level":"1","normative":true,"shortname":"encoding","spec":"encoding","status":"current","text":"utf-8 decode","type":"dfn","url":"https://encoding.spec.whatwg.org/#utf-8-decode"}, "https://encoding.spec.whatwg.org/#utf-8-encode": {"displayText":"UTF-8 encode","export":true,"for_":[],"level":"1","normative":true,"shortname":"encoding","spec":"encoding","status":"current","text":"utf-8 encode","type":"dfn","url":"https://encoding.spec.whatwg.org/#utf-8-encode"}, "https://fetch.spec.whatwg.org/#concept-fetch": {"displayText":"fetch","export":true,"for_":[],"level":"1","normative":true,"shortname":"fetch","spec":"fetch","status":"current","text":"fetch","type":"dfn","url":"https://fetch.spec.whatwg.org/#concept-fetch"}, "https://fetch.spec.whatwg.org/#concept-network-error": {"displayText":"network error","export":true,"for_":[],"level":"1","normative":true,"shortname":"fetch","spec":"fetch","status":"current","text":"network error","type":"dfn","url":"https://fetch.spec.whatwg.org/#concept-network-error"}, "https://fetch.spec.whatwg.org/#dom-body-text": {"displayText":"text()","export":true,"for_":["Body"],"level":"1","normative":true,"shortname":"fetch","spec":"fetch","status":"current","text":"text()","type":"method","url":"https://fetch.spec.whatwg.org/#dom-body-text"}, "https://html.spec.whatwg.org/multipage/browsers.html#ascii-serialisation-of-an-origin": {"displayText":"ASCII serialization of an origin","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"ascii serialization of an origin","type":"dfn","url":"https://html.spec.whatwg.org/multipage/browsers.html#ascii-serialisation-of-an-origin"}, "https://html.spec.whatwg.org/multipage/browsers.html#same-origin": {"displayText":"same origin","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"same origin","type":"dfn","url":"https://html.spec.whatwg.org/multipage/browsers.html#same-origin"}, "https://html.spec.whatwg.org/multipage/dnd.html#datatransfer": {"displayText":"DataTransfer","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"DataTransfer","type":"interface","url":"https://html.spec.whatwg.org/multipage/dnd.html#datatransfer"}, "https://html.spec.whatwg.org/multipage/document-lifecycle.html#unloading-document-cleanup-steps": {"displayText":"unloading document cleanup steps","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"unloading document cleanup steps","type":"dfn","url":"https://html.spec.whatwg.org/multipage/document-lifecycle.html#unloading-document-cleanup-steps"}, "https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element": {"displayText":"img","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"img","type":"element","url":"https://html.spec.whatwg.org/multipage/embedded-content.html#the-img-element"}, "https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element": {"displayText":"iframe","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"iframe","type":"element","url":"https://html.spec.whatwg.org/multipage/iframe-embed-object.html#the-iframe-element"}, "https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel": {"displayText":"in parallel","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"in parallel","type":"dfn","url":"https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel"}, "https://html.spec.whatwg.org/multipage/input.html#htmlinputelement": {"displayText":"HTMLInputElement","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"HTMLInputElement","type":"interface","url":"https://html.spec.whatwg.org/multipage/input.html#htmlinputelement"}, "https://html.spec.whatwg.org/multipage/input.html#the-input-element": {"displayText":"input","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"input","type":"element","url":"https://html.spec.whatwg.org/multipage/input.html#the-input-element"}, "https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download": {"displayText":"download","export":true,"for_":["a","area"],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"download","type":"element-attr","url":"https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-download"}, "https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps": {"displayText":"deserialization steps","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"deserialization steps","type":"dfn","url":"https://html.spec.whatwg.org/multipage/structured-data.html#deserialization-steps"}, "https://html.spec.whatwg.org/multipage/structured-data.html#serializable": {"displayText":"Serializable","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"Serializable","type":"extended-attribute","url":"https://html.spec.whatwg.org/multipage/structured-data.html#serializable"}, "https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects": {"displayText":"serializable object","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"serializable object","type":"dfn","url":"https://html.spec.whatwg.org/multipage/structured-data.html#serializable-objects"}, "https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps": {"displayText":"serialization steps","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"serialization steps","type":"dfn","url":"https://html.spec.whatwg.org/multipage/structured-data.html#serialization-steps"}, "https://html.spec.whatwg.org/multipage/structured-data.html#sub-deserialization": {"displayText":"sub-deserialization","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"sub-deserialization","type":"dfn","url":"https://html.spec.whatwg.org/multipage/structured-data.html#sub-deserialization"}, "https://html.spec.whatwg.org/multipage/structured-data.html#sub-serialization": {"displayText":"sub-serialization","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"sub-serialization","type":"dfn","url":"https://html.spec.whatwg.org/multipage/structured-data.html#sub-serialization"}, "https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element": {"displayText":"a","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"a","type":"element","url":"https://html.spec.whatwg.org/multipage/text-level-semantics.html#the-a-element"}, "https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-global": {"displayText":"relevant global object","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"relevant global object","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-global"}, "https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-realm": {"displayText":"relevant realm","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"relevant realm","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-relevant-realm"}, "https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-origin": {"displayText":"origin","export":true,"for_":["environment settings object"],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"origin","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-settings-object-origin"}, "https://html.spec.whatwg.org/multipage/webappapis.html#concept-task": {"displayText":"task","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"task","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#concept-task"}, "https://html.spec.whatwg.org/multipage/webappapis.html#current-settings-object": {"displayText":"current settings object","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"current settings object","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#current-settings-object"}, "https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object": {"displayText":"environment settings object","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"environment settings object","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#environment-settings-object"}, "https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-content-attributes": {"displayText":"event handler content attribute","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"event handler content attribute","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-content-attributes"}, "https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type": {"displayText":"event handler event type","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"event handler event type","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#event-handler-event-type"}, "https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler": {"displayText":"EventHandler","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"EventHandler","type":"typedef","url":"https://html.spec.whatwg.org/multipage/webappapis.html#eventhandler"}, "https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-global-task": {"displayText":"queue a global task","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"queue a global task","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-global-task"}, "https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task": {"displayText":"queue a task","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"queue a task","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task"}, "https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object": {"displayText":"relevant settings object","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"relevant settings object","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#relevant-settings-object"}, "https://html.spec.whatwg.org/multipage/webappapis.html#task-source": {"displayText":"task source","export":true,"for_":[],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"task source","type":"dfn","url":"https://html.spec.whatwg.org/multipage/webappapis.html#task-source"}, "https://html.spec.whatwg.org/multipage/workers.html#dom-worker-postmessage-options": {"displayText":"postMessage(message, options)","export":true,"for_":["Worker"],"level":"1","normative":true,"shortname":"html","spec":"html","status":"current","text":"postMessage(message, options)","type":"method","url":"https://html.spec.whatwg.org/multipage/workers.html#dom-worker-postmessage-options"}, "https://infra.spec.whatwg.org/#ascii-lowercase": {"displayText":"ASCII lowercase","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"ascii lowercase","type":"dfn","url":"https://infra.spec.whatwg.org/#ascii-lowercase"}, "https://infra.spec.whatwg.org/#assert": {"displayText":"assert","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"assert","type":"dfn","url":"https://infra.spec.whatwg.org/#assert"}, "https://infra.spec.whatwg.org/#byte": {"displayText":"byte","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"byte","type":"dfn","url":"https://infra.spec.whatwg.org/#byte"}, "https://infra.spec.whatwg.org/#byte-sequence": {"displayText":"byte sequence","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"byte sequence","type":"dfn","url":"https://infra.spec.whatwg.org/#byte-sequence"}, "https://infra.spec.whatwg.org/#code-point": {"displayText":"code point","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"code point","type":"dfn","url":"https://infra.spec.whatwg.org/#code-point"}, "https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points": {"displayText":"collecting a sequence of code points","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"collecting a sequence of code points","type":"dfn","url":"https://infra.spec.whatwg.org/#collect-a-sequence-of-code-points"}, "https://infra.spec.whatwg.org/#list": {"displayText":"list","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"list","type":"dfn","url":"https://infra.spec.whatwg.org/#list"}, "https://infra.spec.whatwg.org/#list-iterate": {"displayText":"for each","export":true,"for_":["list","set"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"for each","type":"dfn","url":"https://infra.spec.whatwg.org/#list-iterate"}, "https://infra.spec.whatwg.org/#map-exists": {"displayText":"exist","export":true,"for_":["map"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"exist","type":"dfn","url":"https://infra.spec.whatwg.org/#map-exists"}, "https://infra.spec.whatwg.org/#map-getting-the-keys": {"displayText":"keys","export":true,"for_":["map"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"keys","type":"dfn","url":"https://infra.spec.whatwg.org/#map-getting-the-keys"}, "https://infra.spec.whatwg.org/#map-getting-the-values": {"displayText":"values","export":true,"for_":["map"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"values","type":"dfn","url":"https://infra.spec.whatwg.org/#map-getting-the-values"}, "https://infra.spec.whatwg.org/#map-remove": {"displayText":"remove","export":true,"for_":["map"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"remove","type":"dfn","url":"https://infra.spec.whatwg.org/#map-remove"}, "https://infra.spec.whatwg.org/#map-set": {"displayText":"set","export":true,"for_":["map"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"set","type":"dfn","url":"https://infra.spec.whatwg.org/#map-set"}, "https://infra.spec.whatwg.org/#map-value": {"displayText":"value","export":true,"for_":["map"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"value","type":"dfn","url":"https://infra.spec.whatwg.org/#map-value"}, "https://infra.spec.whatwg.org/#ordered-map": {"displayText":"map","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"map","type":"dfn","url":"https://infra.spec.whatwg.org/#ordered-map"}, "https://infra.spec.whatwg.org/#string": {"displayText":"string","export":true,"for_":[],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"string","type":"dfn","url":"https://infra.spec.whatwg.org/#string"}, "https://infra.spec.whatwg.org/#string-position-variable": {"displayText":"position variable","export":true,"for_":["string"],"level":"1","normative":true,"shortname":"infra","spec":"infra","status":"current","text":"position variable","type":"dfn","url":"https://infra.spec.whatwg.org/#string-position-variable"}, "https://mimesniff.spec.whatwg.org/#parameters": {"displayText":"parameters","export":true,"for_":["MIME type"],"level":"1","normative":true,"shortname":"mimesniff","spec":"mimesniff","status":"current","text":"parameters","type":"dfn","url":"https://mimesniff.spec.whatwg.org/#parameters"}, "https://mimesniff.spec.whatwg.org/#parsable-mime-type": {"displayText":"parsable mime type","export":true,"for_":[],"level":"","normative":true,"shortname":"mimesniff","spec":"mimesniff","status":"anchor-block","text":"parsable mime type","type":"dfn","url":"https://mimesniff.spec.whatwg.org/#parsable-mime-type"}, "https://mimesniff.spec.whatwg.org/#parse-a-mime-type": {"displayText":"parse a MIME type","export":true,"for_":[],"level":"1","normative":true,"shortname":"mimesniff","spec":"mimesniff","status":"current","text":"parse a mime type","type":"dfn","url":"https://mimesniff.spec.whatwg.org/#parse-a-mime-type"}, "https://storage.spec.whatwg.org/#obtain-a-storage-key-for-non-storage-purposes": {"displayText":"obtain a storage key for non-storage purposes","export":true,"for_":[],"level":"1","normative":true,"shortname":"storage","spec":"storage","status":"current","text":"obtain a storage key for non-storage purposes","type":"dfn","url":"https://storage.spec.whatwg.org/#obtain-a-storage-key-for-non-storage-purposes"}, "https://storage.spec.whatwg.org/#storage-key-equal": {"displayText":"equal","export":true,"for_":["storage key"],"level":"1","normative":true,"shortname":"storage","spec":"storage","status":"current","text":"equal","type":"dfn","url":"https://storage.spec.whatwg.org/#storage-key-equal"}, "https://streams.spec.whatwg.org/#chunk": {"displayText":"chunk","export":true,"for_":[],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"chunk","type":"dfn","url":"https://streams.spec.whatwg.org/#chunk"}, "https://streams.spec.whatwg.org/#readablestream": {"displayText":"ReadableStream","export":true,"for_":[],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"ReadableStream","type":"interface","url":"https://streams.spec.whatwg.org/#readablestream"}, "https://streams.spec.whatwg.org/#readablestream-enqueue": {"displayText":"enqueue","export":true,"for_":["ReadableStream"],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"enqueue","type":"dfn","url":"https://streams.spec.whatwg.org/#readablestream-enqueue"}, "https://streams.spec.whatwg.org/#readablestream-error": {"displayText":"error","export":true,"for_":["ReadableStream"],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"error","type":"dfn","url":"https://streams.spec.whatwg.org/#readablestream-error"}, "https://streams.spec.whatwg.org/#readablestream-get-a-reader": {"displayText":"get a reader","export":true,"for_":["ReadableStream"],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"get a reader","type":"dfn","url":"https://streams.spec.whatwg.org/#readablestream-get-a-reader"}, "https://streams.spec.whatwg.org/#readablestream-set-up-with-byte-reading-support": {"displayText":"set up with byte reading support","export":true,"for_":["ReadableStream"],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"set up with byte reading support","type":"dfn","url":"https://streams.spec.whatwg.org/#readablestream-set-up-with-byte-reading-support"}, "https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-a-chunk": {"displayText":"read a chunk","export":true,"for_":["ReadableStreamDefaultReader"],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"read a chunk","type":"dfn","url":"https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-a-chunk"}, "https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes": {"displayText":"read all bytes","export":true,"for_":["ReadableStreamDefaultReader"],"level":"1","normative":true,"shortname":"streams","spec":"streams","status":"current","text":"read all bytes","type":"dfn","url":"https://streams.spec.whatwg.org/#readablestreamdefaultreader-read-all-bytes"}, "https://url.spec.whatwg.org/#concept-url": {"displayText":"URL","export":true,"for_":[],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"url","type":"dfn","url":"https://url.spec.whatwg.org/#concept-url"}, "https://url.spec.whatwg.org/#concept-url-parser": {"displayText":"URL parser","export":true,"for_":[],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"url parser","type":"dfn","url":"https://url.spec.whatwg.org/#concept-url-parser"}, "https://url.spec.whatwg.org/#concept-url-path": {"displayText":"path","export":true,"for_":["url"],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"path","type":"dfn","url":"https://url.spec.whatwg.org/#concept-url-path"}, "https://url.spec.whatwg.org/#concept-url-scheme": {"displayText":"scheme","export":true,"for_":["url"],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"scheme","type":"dfn","url":"https://url.spec.whatwg.org/#concept-url-scheme"}, "https://url.spec.whatwg.org/#concept-url-serializer": {"displayText":"URL serializer","export":true,"for_":[],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"url serializer","type":"dfn","url":"https://url.spec.whatwg.org/#concept-url-serializer"}, "https://url.spec.whatwg.org/#empty-host": {"displayText":"empty host","export":true,"for_":[],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"empty host","type":"dfn","url":"https://url.spec.whatwg.org/#empty-host"}, "https://url.spec.whatwg.org/#url": {"displayText":"URL","export":true,"for_":[],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"URL","type":"interface","url":"https://url.spec.whatwg.org/#url"}, "https://url.spec.whatwg.org/#valid-url-string": {"displayText":"valid URL string","export":true,"for_":[],"level":"1","normative":true,"shortname":"url","spec":"url","status":"current","text":"valid url string","type":"dfn","url":"https://url.spec.whatwg.org/#valid-url-string"}, "https://w3c.github.io/ServiceWorker/#service-worker-registration-storage-key": {"displayText":"storage key","export":true,"for_":["service worker registration"],"level":"1","normative":true,"shortname":"service-workers","spec":"service-workers","status":"current","text":"storage key","type":"dfn","url":"https://w3c.github.io/ServiceWorker/#service-worker-registration-storage-key"}, "https://webidl.spec.whatwg.org/#BufferSource": {"displayText":"BufferSource","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"BufferSource","type":"typedef","url":"https://webidl.spec.whatwg.org/#BufferSource"}, "https://webidl.spec.whatwg.org/#Clamp": {"displayText":"Clamp","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"Clamp","type":"extended-attribute","url":"https://webidl.spec.whatwg.org/#Clamp"}, "https://webidl.spec.whatwg.org/#Exposed": {"displayText":"Exposed","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"Exposed","type":"extended-attribute","url":"https://webidl.spec.whatwg.org/#Exposed"}, "https://webidl.spec.whatwg.org/#NewObject": {"displayText":"NewObject","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"NewObject","type":"extended-attribute","url":"https://webidl.spec.whatwg.org/#NewObject"}, "https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy": {"displayText":"get a copy of the buffer source","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"get a copy of the buffer source","type":"dfn","url":"https://webidl.spec.whatwg.org/#dfn-get-buffer-source-copy"}, "https://webidl.spec.whatwg.org/#dfn-supported-property-indices": {"displayText":"supported property indices","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"supported property indices","type":"dfn","url":"https://webidl.spec.whatwg.org/#dfn-supported-property-indices"}, "https://webidl.spec.whatwg.org/#dfn-throw": {"displayText":"throw","export":true,"for_":["exception"],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"throw","type":"dfn","url":"https://webidl.spec.whatwg.org/#dfn-throw"}, "https://webidl.spec.whatwg.org/#idl-ArrayBuffer": {"displayText":"ArrayBuffer","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"ArrayBuffer","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-ArrayBuffer"}, "https://webidl.spec.whatwg.org/#idl-DOMException": {"displayText":"DOMException","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"DOMException","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-DOMException"}, "https://webidl.spec.whatwg.org/#idl-DOMString": {"displayText":"DOMString","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"DOMString","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-DOMString"}, "https://webidl.spec.whatwg.org/#idl-USVString": {"displayText":"USVString","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"USVString","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-USVString"}, "https://webidl.spec.whatwg.org/#idl-Uint8Array": {"displayText":"Uint8Array","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"Uint8Array","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-Uint8Array"}, "https://webidl.spec.whatwg.org/#idl-long-long": {"displayText":"long long","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"long long","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-long-long"}, "https://webidl.spec.whatwg.org/#idl-promise": {"displayText":"Promise","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"Promise","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-promise"}, "https://webidl.spec.whatwg.org/#idl-sequence": {"displayText":"sequence","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"sequence","type":"dfn","url":"https://webidl.spec.whatwg.org/#idl-sequence"}, "https://webidl.spec.whatwg.org/#idl-undefined": {"displayText":"undefined","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"undefined","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-undefined"}, "https://webidl.spec.whatwg.org/#idl-unsigned-long": {"displayText":"unsigned long","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"unsigned long","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-unsigned-long"}, "https://webidl.spec.whatwg.org/#idl-unsigned-long-long": {"displayText":"unsigned long long","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"unsigned long long","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-unsigned-long-long"}, "https://webidl.spec.whatwg.org/#idl-unsigned-short": {"displayText":"unsigned short","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"unsigned short","type":"interface","url":"https://webidl.spec.whatwg.org/#idl-unsigned-short"}, "https://webidl.spec.whatwg.org/#invalidstateerror": {"displayText":"InvalidStateError","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"InvalidStateError","type":"exception","url":"https://webidl.spec.whatwg.org/#invalidstateerror"}, "https://webidl.spec.whatwg.org/#new": {"displayText":"new","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"new","type":"dfn","url":"https://webidl.spec.whatwg.org/#new"}, "https://webidl.spec.whatwg.org/#notfounderror": {"displayText":"NotFoundError","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"NotFoundError","type":"exception","url":"https://webidl.spec.whatwg.org/#notfounderror"}, "https://webidl.spec.whatwg.org/#notreadableerror": {"displayText":"NotReadableError","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"NotReadableError","type":"exception","url":"https://webidl.spec.whatwg.org/#notreadableerror"}, "https://webidl.spec.whatwg.org/#securityerror": {"displayText":"SecurityError","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"SecurityError","type":"exception","url":"https://webidl.spec.whatwg.org/#securityerror"}, "https://webidl.spec.whatwg.org/#this": {"displayText":"this","export":true,"for_":[],"level":"1","normative":true,"shortname":"webidl","spec":"webidl","status":"current","text":"this","type":"dfn","url":"https://webidl.spec.whatwg.org/#this"}, "https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send": {"displayText":"send()","export":true,"for_":["XMLHttpRequest"],"level":"1","normative":true,"shortname":"xhr","spec":"xhr","status":"current","text":"send()","type":"method","url":"https://xhr.spec.whatwg.org/#dom-xmlhttprequest-send"}, "https://xhr.spec.whatwg.org/#progressevent": {"displayText":"ProgressEvent","export":true,"for_":[],"level":"1","normative":true,"shortname":"xhr","spec":"xhr","status":"current","text":"ProgressEvent","type":"interface","url":"https://xhr.spec.whatwg.org/#progressevent"}, "https://xhr.spec.whatwg.org/#xmlhttprequest": {"displayText":"XMLHttpRequest","export":true,"for_":[],"level":"1","normative":true,"shortname":"xhr","spec":"xhr","status":"current","text":"XMLHttpRequest","type":"interface","url":"https://xhr.spec.whatwg.org/#xmlhttprequest"}, }; function mkRefHint(link, ref) { const linkText = link.textContent; let dfnTextElements = ''; if (ref.displayText.toLowerCase() != linkText.toLowerCase()) { // Give the original term if it's being displayed in a different way. // But allow casing differences, they're insignificant. dfnTextElements = mk.li({}, mk.b({}, "Term: "), mk.span({}, ref.displayText) ); } const forList = ref.for_; let forListElements; if(forList.length == 0) { forListElements = []; } else if(forList.length == 1) { forListElements = mk.li({}, mk.b({}, "For: "), mk.span({}, forList[0]), ); } else { forListElements = mk.li({}, mk.b({}, "For: "), mk.ul({}, ...forList.map(forItem => mk.li({}, mk.span({}, forItem) ), ), ), ); } const url = ref.url; const safeUrl = encodeURIComponent(url); const hintPanel = mk.aside({ class: "ref-hint", id: `ref-hint-for-${safeUrl}`, "data-for": url, "aria-labelled-by": `ref-hint-for-${safeUrl}`, }, mk.ul({}, dfnTextElements, mk.li({}, mk.b({}, "URL: "), mk.a({ href: url, class: "ref" }, url), ), mk.li({}, mk.b({}, "Type: "), mk.span({}, `${ref.type}`), ), mk.li({}, mk.b({}, "Spec: "), mk.span({}, `${ref.spec ? ref.spec : ''}`), ), forListElements ), ); hintPanel.forLink = link; setupRefHintEventListeners(link, hintPanel); return hintPanel; } function hideAllRefHints() { queryAll(".ref-hint").forEach(el=>hideRefHint(el)); } function hideRefHint(refHint) { const link = refHint.forLink; link.setAttribute("aria-expanded", "false"); if(refHint.teardownEventListeners) { refHint.teardownEventListeners(); } refHint.remove(); } function showRefHint(link) { if(link.classList.contains("dfn-link")) return; const url = link.getAttribute("href"); const ref = refsData[url]; if(!ref) return; hideAllRefHints(); // Only display one at this time. const refHint = mkRefHint(link, ref); append(document.body, refHint); link.setAttribute("aria-expanded", "true"); positionRefHint(refHint); } function setupRefHintEventListeners(link, refHint) { if (refHint.teardownEventListeners) return; // Add event handlers to hide the refHint after the user moves away // from both the link and refHint, if not hovering either within one second. let timeout = null; const startHidingRefHint = (event) => { if (timeout) { clearTimeout(timeout); } timeout = setTimeout(() => { hideRefHint(refHint); }, 1000); } const resetHidingRefHint = (event) => { if (timeout) clearTimeout(timeout); timeout = null; }; link.addEventListener("mouseleave", startHidingRefHint); link.addEventListener("mouseenter", resetHidingRefHint); link.addEventListener("blur", startHidingRefHint); link.addEventListener("focus", resetHidingRefHint); refHint.addEventListener("mouseleave", startHidingRefHint); refHint.addEventListener("mouseenter", resetHidingRefHint); refHint.addEventListener("blur", startHidingRefHint); refHint.addEventListener("focus", resetHidingRefHint); refHint.teardownEventListeners = () => { // remove event listeners resetHidingRefHint(); link.removeEventListener("mouseleave", startHidingRefHint); link.removeEventListener("mouseenter", resetHidingRefHint); link.removeEventListener("blur", startHidingRefHint); link.removeEventListener("focus", resetHidingRefHint); refHint.removeEventListener("mouseleave", startHidingRefHint); refHint.removeEventListener("mouseenter", resetHidingRefHint); refHint.removeEventListener("blur", startHidingRefHint); refHint.removeEventListener("focus", resetHidingRefHint); }; } function positionRefHint(refHint) { const link = refHint.forLink; const linkPos = getBounds(link); refHint.style.top = linkPos.bottom + "px"; refHint.style.left = linkPos.left + "px"; const panelPos = refHint.getBoundingClientRect(); const panelMargin = 8; const maxRight = document.body.parentNode.clientWidth - panelMargin; if (panelPos.right > maxRight) { const overflowAmount = panelPos.right - maxRight; const newLeft = Math.max(panelMargin, linkPos.left - overflowAmount); refHint.style.left = newLeft + "px"; } } // TODO: shared util // Returns the root-level absolute position {left and top} of element. function getBounds(el, relativeTo=document.body) { const relativeRect = relativeTo.getBoundingClientRect(); const elRect = el.getBoundingClientRect(); const top = elRect.top - relativeRect.top; const left = elRect.left - relativeRect.left; return { top, left, bottom: top + elRect.height, right: left + elRect.width, } } function showRefHintListener(e) { // If the target isn't in a link (or is a link), // just ignore it. let link = e.target.closest("a"); if(!link) return; // If the target is in a ref-hint panel // (aka a link in the already-open one), // also just ignore it. if(link.closest(".ref-hint")) return; // Otherwise, show the panel for the link. showRefHint(link); } function hideAllHintsListener(e) { // If the click is inside a ref-hint panel, ignore it. if(e.target.closest(".ref-hint")) return; // Otherwise, close all the current panels. hideAllRefHints(); } document.addEventListener("DOMContentLoaded", () => { document.body.addEventListener("mousedown", showRefHintListener); document.body.addEventListener("focus", showRefHintListener); document.body.addEventListener("click", hideAllHintsListener); }); window.addEventListener("resize", () => { // Hide any open ref hint. hideAllRefHints(); }); } </script> <script>/* Boilerplate: script-var-click-highlighting */ "use strict"; { /* Color-choosing design: * Colors are ordered by goodness. * On clicking a var, give it the earliest color with the lowest usage in the algorithm. * On re-clicking, re-use the var's most recent color if that's not currently being used elsewhere. */ const COLOR_COUNT = 7; document.addEventListener("click", e=>{ if(e.target.nodeName == "VAR") { highlightSameAlgoVars(e.target); } }); function highlightSameAlgoVars(v) { // Find the algorithm container. let algoContainer = findAlgoContainer(v); // Not highlighting document-global vars, // too likely to be unrelated. if(algoContainer == null) return; const varName = nameFromVar(v); if(!v.hasAttribute("data-var-color")) { const newColor = chooseHighlightColor(algoContainer, v); for(const el of algoContainer.querySelectorAll("var")) { if(nameFromVar(el) == varName) { el.setAttribute("data-var-color", newColor); el.setAttribute("data-var-last-color", newColor); } } } else { for(const el of algoContainer.querySelectorAll("var")) { if(nameFromVar(el) == varName) { el.removeAttribute("data-var-color"); } } } } function findAlgoContainer(el) { while(el != document.body) { if(el.hasAttribute("data-algorithm")) return el; el = el.parentNode; } return null; } function nameFromVar(el) { return el.textContent.replace(/(\s|\xa0)+/g, " ").trim(); } function colorCountsFromContainer(container) { const namesFromColor = Array.from({length:COLOR_COUNT}, x=>new Set()); for(let v of container.querySelectorAll("var[data-var-color]")) { let color = +v.getAttribute("data-var-color"); namesFromColor[color].add(nameFromVar(v)); } return namesFromColor.map(x=>x.size); } function leastUsedColor(colors) { // Find the earliest color with the lowest count. let minCount = Infinity; let minColor = null; for(var i = 0; i < colors.length; i++) { if(colors[i] < minCount) { minColor = i; minCount = colors[i]; } } return minColor; } function chooseHighlightColor(container, v) { const colorCounts = colorCountsFromContainer(container); if(v.hasAttribute("data-var-last-color")) { let color = +v.getAttribute("data-var-last-color"); if(colorCounts[color] == 0) return color; } return leastUsedColor(colorCounts); } } </script>