Jsdom: URL.createObjectURL рдФрд░ URL.revokeObjectURL рдЬреЛрдбрд╝реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 31 рдЬрдире░ 2017  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jsdom/jsdom

рдирдорд╕реНрддреЗ, jsdom рдкрд╣рд▓реЗ рд╕реЗ рд╣реА URL рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреЗ 2 рд╕реНрдерд┐рд░ рддрд░реАрдХреЗ рдирд╣реАрдВ, рд╡реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред

рдХреНрд░рд┐рдПрдЯрдСрдмреНрдЬреЗрдХреНрдЯрдпреВрдЖрд░рдПрд▓
рдирд┐рд░рд╕реНрддрдСрдмреНрдЬреЗрдХреНрдЯURL
рдХреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдБ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@fredvollmer рдЕрдЧрд░ jsdom рдХреЗ рд╕рд╛рде рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдиреЛрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ setupTest.js (рдпрд╛ рд╕рдордХрдХреНрд╖ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

function noOp () { }

if (typeof window.URL.createObjectURL === 'undefined') {
  Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}

рд╕рднреА 26 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдХреНрдпрд╛ https://github.com/eligrey/Blob.js рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ jsdom рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рдореБрдЭреЗ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ jspdf рдЕрдВрджрд░ jsdom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирд╣реАрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдВ рдХрд╛ рдХреЛрдб рдбреЗрдЯрд╛ рдпреВрдЖрд░рдПрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдирд╣реАрдВред рдХрд┐рд╕реА рдХреЛ https://w3c.github.io/FileAPI/#dfn -createObjectURL рдкрд░ рдпреБрдХреНрддрд┐ рдХреЛ рдареАрдХ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдореИрдВ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реВрдБ, рдХреНрдпрд╛ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛрдЧрд╛?

createObjectURL(blob) {
  var implementationDefinedValue = ???
  var url = `blob:${asciiSerialize(location.origin) || implementationDefinedValue}/${createUUID()}`;
  saveToBlobStore(url, blob);
  return url;
}
revokeObjectURL(blobUrl) {
  // assume `getFromBlobStore()` will not throw
  var blob = getFromBlobStore(blobUrl);

  if (!blob) {
    throw new NetworkError(...);
  }
  removeFromBlobStore(blobUrl);
}

@unional createUUID uuidV4 рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреНрд░реЛрдо рд╕рдЦреНрддреА рд╕реЗ рдХрд▓реНрдкрдирд╛ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, URL.revokeObjectURL NetworkError рдирд╣реАрдВ рдлреЗрдВрдХреЗрдЧрд╛ рдпрджрд┐ рдЖрдк рдПрдХ рд╣реА рддрд░реНрдХ рдХреЛ рджреЛ рдмрд╛рд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рд╕рд░рдгреАред

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рддрд░рд╣, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдм рд╕реНрдЯреЛрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ URL.revokeObjectURL рдПрдХ рдиреЛрдк рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕рдХрд╛ рдордд:

const uuid = require('uuid/v4');

createObjectURL(blob) {
  var implementationDefinedValue = ???
  var url = `blob:${asciiSerialize(location.origin) || implementationDefinedValue}/${uuid()}`;
  return url;
}
revokeObjectURL(blobUrl) {
  return;
}

asciiSerialize(origin) {
  if (origin.scheme) {
    return `${origin.scheme}://${serializeHost(origin.host)}${origin.port? ':' + +origin.port : ''}`;
  }
  else {
    return 'null';
  }
}

serializeHost(host) {
  ...
}

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдб рдореЗрдВ рдХрд╣реАрдВ serializeHost() рд╣реИред

рдПрдХ рдЖрдЦрд┐рд░реА рдмрд╛рдд рд╣реИ:

рдпрджрд┐ рдХреНрд░рдордмрджреНрдз "рд╢реВрдиреНрдп" рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред

"рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдореВрд▓реНрдп" рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рдорд┐рд▓ рдЧрдП рд╣реИрдВред
http://stackoverflow.com/questions/42452543/what-does-implementation-defined-value-in-fileapi-unicodebloburl-mean/42452714#42452714

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ https://github.com/jsdom/whatwg-url . рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ

рдЕрджреНрдпрддрди: whatwg-url рдирд┐рдХрд▓рд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЪреАрдЬреЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдмрд╕ рд╣реИ:

const uuid = require('uuid/v4');

createObjectURL(_blob) {
  var url = `blob:${serializeURL(location.origin)}/${uuid()}`;
  return url;
}
revokeObjectURL(_blobUrl) {
  return;
}

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ whatwg-url рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдкрддрд╛ рдирд╣реАрдВ рдХреИрд╕реЗ рдХреЛрдб рдбрд╛рд▓рдирд╛ рд╣реИред

@domenic , рдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдЕрдЪреНрдЫрд╛ рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдХреНрдпрд╛ рдЖрдк рдЗрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдмрдирд╛рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ XMLHttpRequest рдХреА рдкрд╕рдВрдж рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рдЗрд╕реЗ рд╕рд┐рд░реНрдл рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдмрдирд╛рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ XMLHttpRequest рдХреА рдкрд╕рдВрдж рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдпреВрдЖрд░рдПрд▓ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ рдЗрд╕рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреНрдпрд╛ рд╣реИрдВ? рдХреНрдпрд╛ XMLHttpRequest рдХрд╛ рдореМрдЬреВрджрд╛ рддрд░реНрдХ рдЗрд╕реЗ рдареАрдХ рд╕реЗ рд╕рдВрднрд╛рд▓ рд▓реЗрдЧрд╛?

рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ jsdom рдХрд╛ рд▓рдХреНрд╖реНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдЯреАрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдЕрдЧрд░ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред

IMO рд╣рдореЗрдВ рдЗрд╕реЗ рддрдм рддрдХ рдХреЗ рд▓рд┐рдП рдЯрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рди рд╣реЛред

рдЗрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

рд╡рд░ рдпреВрдЖрд░рдПрд▓ = blob:${serializeURL(location.origin)}/${uuid()} ;

serializeURL() рдХрд▓реНрдкрдирд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ рд╣рдореЗрдВ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдХрд▓реНрдкрдирд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдпрджрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм XHR, img рддрддреНрд╡реЛрдВ, рдЖрджрд┐ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ jsdom рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ URL рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдирд╛ рдмрд╣реБрдд, рдмрд╣реБрдд рд░реБрдЪрд┐рдХрд░ рдирд╣реАрдВ рд╣реИред рдЖрдк рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг jsdom рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдареАрдХ рд╣реИ, рддреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрдпрд╛ рдЬрд╝рд░реВрд░рдд рд╣реИ?

рдбреЛрдо рдПрдкреАрдЖрдИ рдХреЛ рдиреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрд╛ рд╣реЛрдирд╛ рдмрд╣реБрдд рдорджрджрдЧрд╛рд░ рд╣реИред

рд▓реЗрдХрд┐рди рдиреЛрдб рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░/рдиреЛрдб рдХреЛрдб рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдПрдХ рдмреНрд▓реЙрдм рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрдиреЛрдВ рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЖрддреНрдордирд┐рд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХреЗрдВ (рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдо рд╕реЗ рдХрдо рдЕрдиреНрдпрдерд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдпрд╣)ред (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдореБрдЭреЗ рдЗрдВрдбреЗрдХреНрд╕рдбрдбреАрдмреА (рдФрд░ postMessage ) рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд░рдЪрд┐рдд рдХреНрд▓реЛрдирд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдмреНрд▓реЙрдмреНрд╕ рдХреНрд▓реЛрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдиреЛрдб-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред)

рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рдореЗрдореЛрд░реА рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ data: рдпреВрдЖрд░рдПрд▓ рдкрд░ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдХреЗ рддреАрди рдЕрджреНрд╡рд┐рддреАрдп рдкрд╣рд▓реВ рд╣реИрдВ (рдмрдЬрд╛рдп рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛)ред

рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди-рдореЗрдореЛрд░реА рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдкрд░реЗ, рд╡реЗ рдпреВрдЖрд░рдПрд▓ рдХреЗ рднреАрддрд░ рдкреВрд░реА рдлрд╛рдЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рддрдХ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

рджреЛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рддреНрд░ рд╕реЗ рдкрд░реЗ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдмрд╛рд╣рд░ рдбреЗрдЯрд╛ рдХреА рджреГрдврд╝рддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛/рдЧреЛрдкрдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рддреАрд╕рд░рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдХреЛ рдПрдХ рд╕рддреНрд░ рдХреЗ рднреАрддрд░ рднреА рдирд┐рд░рд╕реНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреА рдЗрдЬрд╛рдЬрдд рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдмреНрд▓реЙрдм рдпреВрдЖрд░рдПрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЫрд╡рд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдпреВрдЖрд░рдПрд▓ рдХреЛ рд░рджреНрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдмреНрд▓реЙрдм URL рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд data URL рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣реЛрдЧрд╛)ред

рдпрджрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬрдм XHR, img рддрддреНрд╡реЛрдВ, рдЖрджрд┐ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рддреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ jsdom рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ URL рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИред рдмрд╕ рдЙрдиреНрд╣реЗрдВ рдмрдирд╛рдирд╛ рдмрд╣реБрдд, рдмрд╣реБрдд рд░реБрдЪрд┐рдХрд░ рдирд╣реАрдВ рд╣реИред

рдореИрдВ рд░рд┐рдПрдХреНрдЯ -рд╕реНрдиреИрдкрд╢реЙрдЯ рдХреА рдорджрдж рд╕реЗ рд░рд┐рдПрдХреНрдЯ (рд╕реАрдЖрд░рдП) рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореЗрд░рд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ React-mapbox-gl , рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ mapbox-gl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ webworkify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИ

Error: Uncaught [TypeError: o.URL.createObjectURL is not a function]

рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдкрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдмрдЬрд╛рдп рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рддреНрд░реБрдЯрд┐ рдЗрд╕реЗ рд░реЛрдХрддреА рд╣реИред

рдЖрдк рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг jsdom рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдХреНрдпрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдЗрд╕рдХреЗ рд▓рд┐рдП noop рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП jsdom рдХреЛ рдкреИрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрдо рд╕реЗ рдХрдо рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рд╣реЛрдЧрд╛ред

рд░реАрдбрдореА рджреЗрдЦреЗрдВ: https://github.com/tmpvar/jsdom#intervening -before-parsing

рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рдЕрдлрд╝рд╕реЛрд╕ рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореИрдВ рдкреБрд░рд╛рдиреЗ рдПрдкреАрдЖрдИ рдЬреИрд╕реЗ jsdom.env рд╕рд╛рде рдлрдВрд╕ рдЧрдпрд╛ рд╣реВрдБ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ

options.beforeParse(this[window]._globalProxy);

(рдЪреЗрд╣рд░реЗ рдХреА рд╣рдереЗрд▓реА) рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдард┐рди рд╣реЛрдЧрд╛

рдпреБрдкреАрдбреА

created рдХреЙрд▓рдмреИрдХ рд╣реИ

created: (err, window) => {
  window.URL = { createObjectURL: () => {} }
}

рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХреА рд╕реНрдерд┐рддрд┐ рдХреНрдпрд╛ рд╣реИ? рд╣реЛрдирд╛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

@fredvollmer рдЕрдЧрд░ jsdom рдХреЗ рд╕рд╛рде рдЬреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдиреЛрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ setupTest.js (рдпрд╛ рд╕рдордХрдХреНрд╖ рд╕реЗрдЯрдЕрдк рд╕реНрдХреНрд░рд┐рдкреНрдЯ) рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред

function noOp () { }

if (typeof window.URL.createObjectURL === 'undefined') {
  Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}

@dylanjha рдореБрдЭреЗ TypeError: Cannot redefine property: createObjectURL

[email protected]

@franciscolourenco рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВ! рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрд╖рдорд╛ рдХрд░реЗрдВ ... рдЗрд╕ рд╕рд╢рд░реНрдд рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдб рдХреЛ рдЕрднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ: if (typeof window.URL.createObjectURL === 'undefined') {

рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдПрдВ!

рдореБрдЭреЗ рдпрд╣рд╛рдВ рд╡рд╛рдкрд╕ рдЖрдиреЗ рдФрд░ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@dylanjha createObjectURL рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВред рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛:

window.URL.createObjectURL = noOp

рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕реЗ рдЧрд▓реНрдк рдХреЗ рд╕рд╛рде рднреА рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдореВрд▓ рд░реВрдк рд╕реЗ рдореИрдВ jsdom рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ createObjectURL рдмрд╛рд░реЗ рдореЗрдВ рдЪреБрдк рдХрд░рд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐ jsdom рд╕реЗ рдЖрддреА рд╣реИрдВ рдЬреЛ uncss рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рдж!

if (typeof URL !== 'undefined') {
  delete URL;
}

рдмрд╕ рдЗрд╕реЗ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛

function noOp () { }

if (typeof window.URL.createObjectURL === 'undefined') {
  Object.defineProperty(window.URL, 'createObjectURL', { value: noOp})
}

рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рдЬреЗрд╕реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА "setupFiles" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВрдЧреЗред рддреЛ рдЕрдкрдиреЗ package.json рдореЗрдВ рдпрд╛ рдЬрд╣рд╛рдБ рднреА рдЖрдкрдХреЗ рдкрд╛рд╕ рд╣реИ
"jest": { "setupFiles": [ "<rootDir>/internals/testing/setup_file.js" ], }
рдЖрдк рдЙрд╕ рдлрд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдбрд╛рд▓ рджреЗрдВред (рдпрджрд┐ рд╡рд╣ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреНрд░рдорд┐рдд рдХрд┐рд╕реА рдХреА рднреА рдорджрдж рдХрд░реЗрдЧрд╛

img.src = URL.createObjectURL (рдмреВрдБрдж);

рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ URL.createObjectURL рдЬреЗрд╕реНрдЯ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬрд╛рдБрдЪ рдХрд░рддреЗ рд╕рдордп
рдХреНрдпрд╛ рдЫрд╡рд┐ рд╕реНрд░реЛрдд рдкрд░ рд▓реМрдЯрд╛рдП рдЧрдП рдмреНрд▓реЙрдм рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ

рдпрд╣ рд╣реИрдХреА рд╣реИ рдФрд░ рдореИрдВ рдЗрд╕рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХрд░рддрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ Node.js рдХреЗ рд▓рд┐рдП createObjectURL рдФрд░ revokeObjectURL рд╕рд░рд▓реАрдХреГрдд
рдХреГрдкрдпрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреНрдпрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

amfio picture amfio  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

khalyomede picture khalyomede  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jacekpl picture jacekpl  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

mitar picture mitar  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kentmw picture kentmw  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ