рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕: рдмрд╛рд░ рд╕реБрдзрд╛рд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рд╣рдо рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдирдП рдбрд╛рдЙрдирд▓реЛрдб рдкреИрдирд▓ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдкреИрдирд▓ Tweaker рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХреБрдЫ рдЕрд╡рд╛рдВрдЫрд┐рдд рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╕рдмрд╕реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдирд╡рд╛рдЪрд╛рд░, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рд╕реВрдЪреА рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ "рдкреБрд╕реНрддрдХрд╛рд▓рдп" рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ) - рдпрд╣ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реБрдЖ рдХрд┐ рд╕рдордп рд╕реБрдзрд╛рд░ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрд╛ред
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ (рдпрд╣ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдПрдХ "рдХреЙрдореНрдкреИрдХреНрдЯ" рд╡рд┐рдХрд▓реНрдк рд╣реИ, "рдмрд╣реБрдд рдХреЙрдореНрдкреИрдХреНрдЯ" рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕реНрдерд╛рди рдмрдЪрд╛рдПрдЧрд╛):
рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╕рдВрд╕реНрдХрд░рдг 0.2.0
рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓ рд░реВрдк рд╕реЗ рдерд╛ ред
рдХреБрдЫ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рднреА рд╣реЛрдВрдЧреЗ (рдЕрдиреНрдпрдерд╛ рд╡рд┐рд╡рд░рдг рдХреЗ рдмрд┐рдирд╛ рдХрд╣рд╛рдВ?)ред

рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рдХреЗ рдмрдЬрд╛рдп, рдпрд╛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд▓рд╛рдЗрд╡ рдХреЙрдореНрдкреИрдХреНрдЯ!

рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдбрд╛рдЙрдирд▓реЛрдб рдмрд╛рд░ рдХреЗ рд╕рднреА рддрддреНрд╡ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡рд┐рд╢рд╛рд▓ рд╣реИрдВ! рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореЗрд░реЗ рдкрд╛рд╕ рд╕реНрдкрд░реНрд╢ рдореЙрдирд┐рдЯрд░ рдирд╣реАрдВ рд╣реИ - рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рдореИрдВ рд╡реИрд╕реЗ рднреА рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдкрд╣реБрдВрдЪ рд╕рдХрддрд╛ рд╣реВрдВред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдХреЗрд╡рд▓ рддреАрди рдмрд┐рдВрджреБ рд╣реИрдВ, рдЕрдзрд┐рдХ рдирд╣реАрдВред рдпрд╣реА рд╣реИ, рдЬрдЧрд╣ рдЦрд░реНрдЪ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд╛ рдмрд╣реБрдд рдХрдо рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рджреГрд╢реНрдп рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реАрдорд╛ рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ userChrome.css рдпрд╛ рд╕реНрдЯрд╛рдЗрд▓рд┐рд╢ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (?) рдбрд╛рдЙрдирд▓реЛрдб рдЧрддрд┐ рдХреЛ рдЕрдХреЗрд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣ рдЯреВрд▓рдЯрд┐рдк рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЫрджреНрдо-рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрд╛рдж :: рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рдореЗрдВ рд╣рдореЗрд╢рд╛ XUL рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ (рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпреЗ рдЧреБрдордирд╛рдо рдиреЛрдбреНрд╕ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИрдВ ), рдЗрд╕рд▓рд┐рдП рдпрд╣ рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
.downloadDetails[tooltiptext]::after { content: attr(tooltiptext) !important; } 


рджрд░реНрд╢рдиреАрдп рдбрд╛рдЙрдирд▓реЛрдб рдмрдврд╝рд╛рдПрдБ

рдирддреАрдЬрддрди, рдкреИрдирд▓ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдХреНрд░реЛрдо рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдмрд╣реБрдд рдЬрд▓реНрджреА рдкрд╛рдпрд╛ рдЧрдпрд╛ : //browser/content/downloads/downloads.js :
 const DownloadsView = { ////////////////////////////////////////////////////////////////////////////// //// Functions handling download items in the list /** * Maximum number of items shown by the list at any given time. */ kItemCountLimit: 3, 

рд▓реЗрдХрд┐рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рд╡реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рдпрд╛рдиреА рдбрд╛рдЙрдирд▓реЛрдб рдмрд╛рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рдП рдЧрдП рдереЗред
рдЗрд╕рд▓рд┐рдП, рдЖрдЧреЗ рдХреА рдЦреЛрдЬ рдиреЗ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ : //app/modules/DownloadsCommon.jsm рдлрд╝рд╛рдЗрд▓ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдбрдХреИрдореЛрди .getSummary () рдлрд╝рдВрдХреНрд╢рди:
  /** * Returns a reference to the DownloadsSummaryData singleton - creating one * in the process if one hasn't been instantiated yet. * * @param aWindow * The browser window which owns the download button. * @param aNumToExclude * The number of items on the top of the downloads list to exclude * from the summary. */ getSummary: function DC_getSummary(aWindow, aNumToExclude) { if (PrivateBrowsingUtils.isWindowPrivate(aWindow)) { if (this._privateSummary) { return this._privateSummary; } return this._privateSummary = new DownloadsSummaryData(true, aNumToExclude); } else { if (this._summary) { return this._summary; } return this._summary = new DownloadsSummaryData(false, aNumToExclude); } }, 

рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ
 /** * DownloadsSummaryData is a view for DownloadsData that produces a summary * of all downloads after a certain exclusion point aNumToExclude. For example, * if there were 5 downloads in progress, and a DownloadsSummaryData was * constructed with aNumToExclude equal to 3, then that DownloadsSummaryData * would produce a summary of the last 2 downloads. * * @param aIsPrivate * True if the browser window which owns the download button is a private * window. * @param aNumToExclude * The number of items to exclude from the summary, starting from the * top of the list. */ function DownloadsSummaryData(aIsPrivate, aNumToExclude) { this._numToExclude = aNumToExclude; 

рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ - рдмрд╕ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░реЗрдВ:
 var itemCountLimit = 5; //        3  5 if(DownloadsCommon._privateSummary) DownloadsCommon._privateSummary._numToExclude = itemCountLimit; if(DownloadsCommon._summary) DownloadsCommon._summary._numToExclude = itemCountLimit; 

рдпрд╣реА рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдирд╛рдП рдЧрдП рдирд┐рдпрдорд┐рдд рдФрд░ рдирд┐рдЬреА рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдХреЗ рдбрд╛рдЙрдирд▓реЛрдбреНрд╕ рдХреА рд╕реАрдорд╛ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдирдИ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдбрд╛рдЙрдирд▓реЛрдб рд╕реВрдЪреА рд╣реА рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧреАред
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдореБрдЦ рд╢реБрд░реБрдЖрдд рдереА: рдирд┐рдЬреА рдЯреИрдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди (рдЬреЛ, рд╕рдВрдпреЛрдЧрд╡рд╢, рдПрдХ рд▓реЗрдЦ рднреА рдерд╛), рдареАрдХ рдЙрд╕реА рдкреНрд░рд╢реНрди рдХрд╛ рдЙрджрдп рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рдЯреИрдм рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп рдирд┐рдпрдорд┐рдд рд╕реЗ рдирд┐рдЬреА рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕реВрдЪреА рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ (рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдереЗред рд╕рдлрд▓рддрд╛ рдХреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рдЧреНрд░реА рдХреЗ рдкреНрд░рдпреЛрдЧ)ред
рд▓реЗрдХрд┐рди, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдЕрднреА рднреА рдХреБрдЫ рддрд░рдХреАрдмреЗрдВ рдереАрдВ: рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 28 рдиреЗ рдбрд╛рдЙрдирд▓реЛрдб рдмрд╛рд░ рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ (рдпрд╣ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рдбрд╛рдЙрдирд▓реЛрдб рдЗрдВрдЬрди рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛)ред рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд▓рд┐рдЦрдирд╛ рдерд╛ - рдЕрдЪреНрдЫрд╛, рдпрд╣ рд╕рд░рд▓ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рдпрд╛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛрдб рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рдпрджрд┐ рдЖрдк рдмрд╕ рдХрд░рддреЗ рд╣реИрдВ
 DownloadsView._viewItems = {}; DownloadsView._dataItems = []; 

, рддрдм рдПрдХ рдореЗрдореЛрд░реА рд░рд┐рд╕рд╛рд╡ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдорддреМрд░ рдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп рдХрд╛рдо рдореЗрдВ рдЖрддреЗ рд╣реИрдВ:
 DownloadsView._viewItems = new window.Object(); DownloadsView._dataItems = new window.Array(); 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд┐рдВрдбреЛ рд╡рд╣ рд╡рд┐рдВрдбреЛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рджреГрд╢реНрдп рд╕реНрдерд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд рдбрд╛рдЙрдирд▓реЛрдбреНрд╕ рд╡реНрдпреВ === рд╡рд┐рдВрдбреЛред рдбрд╛рдЙрдирд▓реЛрдб )ред

рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рд╕рд╣реЗрдЬреЗрдВ

рдпрд╣ рд╕рдмрд╕реЗ рдХрдард┐рди рдирд┐рдХрд▓рд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдЗрддрдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 26 рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдИ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдгред рдЗрдирдореЗрдВ рд╕реЗ рдХрдИ рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЗрд╕реА рдореБрджреНрджреЗ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХреНрд░рдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реИред

рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдлрд╛рдИ

рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 25 рдФрд░ рдкреБрд░рд╛рдиреЗ рдореЗрдВ, рдбрд╛рдЙрдирд▓реЛрдб рдЬрдмрд░рди рд╕рд╛рдлрд╝ рдХрд░ рджрд┐рдП рдЧрдП рдереЗ ( рд╕рдВрд╕рд╛рдзрди: //app/compenders/DownloadsStartup.ss ):
  case "browser-lastwindow-close-granted": // When using the panel interface, downloads that are already completed // should be removed when the last full browser window is closed. This // event is invoked only if the application is not shutting down yet. // If the Download Manager service is not initialized, we don't want to // initialize it just to clean up completed downloads, because they can // be present only in case there was a browser crash or restart. if (this._downloadsServiceInitialized && !DownloadsCommon.useToolkitUI) { Services.downloads.cleanUp(); } break; ... case "quit-application": ... // When using the panel interface, downloads that are already completed // should be removed when quitting the application. if (!DownloadsCommon.useToolkitUI && aData != "restart") { this._cleanupOnShutdown = true; } break; case "profile-change-teardown": // If we need to clean up, we must do it synchronously after all the // "quit-application" listeners are invoked, so that the Download // Manager service has a chance to pause or cancel in-progress downloads // before we remove completed downloads from the list. Note that, since // "quit-application" was invoked, we've already exited Private Browsing // Mode, thus we are always working on the disk database. if (this._cleanupOnShutdown) { Services.downloads.cleanUp(); } 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп, Services.downloads.cleanUp () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
(рд╡реИрд╕реЗ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рдирдП рдЗрдВрдЬрди рдХреЗ рдирд┐рд╢рд╛рди рд╣реИрдВ - Browser.download.useJSTransfer рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪред)
рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ Services.downloads рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣реИ
 Components.classes["@mozilla.org/download-manager;1"] .getService(Components.interfaces.nsIDownloadManager); 

( рд╕рдВрд╕рд╛рдзрди рджреЗрдЦреЗрдВ : //gre/modules/Services.jsm ), рдФрд░ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 Object.defineProperty(Services.downloads, "cleanUp", { value: function() {}, enumerable: true, configurable: true, writable: true }); // Exception: can't redefine non-configurable property 'cleanUp' 

рдпрджрд┐ рд╕рд░рд▓реАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
 var downloads = Services.downloads; var downloadsWrapper = { __proto__: downloads, cleanUp: function() { ... } }; this.setProperty(Services, "downloads", downloadsWrapper); 

рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реА рдирдХрд▓реА рд╡рд╕реНрддреБ рдореЗрдВ рдХреНрд▓реАрдирдЕрдк рдкреНрд░реЙрдкрд░реНрдЯреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╢рд╛рдорд┐рд▓ рд╣реИ рдФрд░ рд╡рд░реНрддрдорд╛рди Services.downloads рд╕реЗ рдЕрдиреНрдп рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред
рдЦреИрд░, рдлрд░реНрдЬреА рдлрд╝рдВрдХреНрд╢рди Services.downloads.cleanUp () рд╕реЗ, рдЖрдк рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд╣реА рдбрд╛рдЙрдирд▓реЛрдбрд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рд╣реИ ред рддреЛ, рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдмрд╣реБрдд рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╣рд╛рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдПрдХ рд╕рдорд╛рди рдЖрд╡рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рддреЛ рдЪреЗрдХ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдирдП рд╕рдВрд╕реНрдХрд░рдг, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЪрдпрдирд╛рддреНрдордХ рдмрдЪрдд рдФрд░ рдХрдИ рд╣реИрдХ

рдлрд┐рд░, рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ 26 рдореЗрдВ, рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдПрдХ рдирдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдЗрдВрдЬрди рдЪрд╛рд▓реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрд╕реНрдерд╛рдпреА рдбрд╛рдЙрдирд▓реЛрдб (рдЕрд░реНрдерд╛рддреН, рд╡реЗ рдбрд╛рдЙрдирд▓реЛрдб рдкреИрдирд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ) рдХреЛ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб s.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдлрд╛рдИ рдХреЗ рдмрдЬрд╛рдп, рдмрдЪрдд рдХрд░рддреЗ рд╕рдордп рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
рд╕рдВрд╕рд╛рдзрди: //gre/modules/DownloadStore.jsm
 this.DownloadStore.prototype = { ... /** * This function is called with a Download object as its first argument, and * should return true if the item should be saved. */ onsaveitem: () => true, ... /** * Saves persistent downloads from the list to the file. * * If an error occurs, the previous file is not deleted. * * @return {Promise} * @resolves When the operation finished successfully. * @rejects JavaScript exception. */ save: function DS_save() { return Task.spawn(function task_DS_save() { let downloads = yield this.list.getAll(); ... for (let download of downloads) { try { if (!this.onsaveitem(download)) { continue; } 

рдлрд┐рд░ рд╕рдВрд╕рд╛рдзрди рдореЗрдВ: //gre/modules/DownloadIntegration.jsm рдСрдирд╕реЗрд╡рд┐рдЯрдо рд╡рд┐рдзрд┐ рдУрд╡рд░рд░рд╛рдЗрдб рд╣реИ:
 this.DownloadIntegration = { ... initializePublicDownloadList: function(aList) { return Task.spawn(function task_DI_initializePublicDownloadList() { ... this._store.onsaveitem = this.shouldPersistDownload.bind(this); ... /** * Determines if a Download object from the list of persistent downloads * should be saved into a file, so that it can be restored across sessions. * * This function allows filtering out downloads that the host application is * not interested in persisting across sessions, for example downloads that * finished successfully. * * @param aDownload * The Download object to be inspected. This is originally taken from * the global DownloadList object for downloads that were not started * from a private browsing window. The item may have been removed * from the list since the save operation started, though in this case * the save operation will be repeated later. * * @return True to save the download, false otherwise. */ shouldPersistDownload: function (aDownload) { // In the default implementation, we save all the downloads currently in // progress, as well as stopped downloads for which we retained partially // downloaded data. Stopped downloads for which we don't need to track the // presence of a ".part" file are only retained in the browser history. // On b2g, we keep a few days of history. //@line 319 "c:\builds\moz2_slave\m-cen-w32-ntly-000000000000000\build\toolkit\components\jsdownloads\src\DownloadIntegration.jsm" return aDownload.hasPartialData || !aDownload.stopped; //@line 321 "c:\builds\moz2_slave\m-cen-w32-ntly-000000000000000\build\toolkit\components\jsdownloads\src\DownloadIntegration.jsm" }, 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдлрд╝рдВрдХреНрд╢рди DownloadStore.prototyp.onsaveitem () рд╣реИ , рдЬреЛ рд╣рдореЗрд╢рд╛ рдмрдЪрдд рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдирдП DownloadStore () рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
(рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рдЗрд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧреА рдФрд░ рд╕рддреНрдп рдирд╣реАрдВ рд╣реИрдВред)
рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдб DownloadIntegration.jsm рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╢рд░реНрдд рдЯрд┐рдкреНрдкрдгреА рд╣реИ:
  shouldPersistDownload: function (aDownload) { // In the default implementation, we save all the downloads currently in // progress, as well as stopped downloads for which we retained partially // downloaded data. Stopped downloads for which we don't need to track the // presence of a ".part" file are only retained in the browser history. // On b2g, we keep a few days of history. #ifdef MOZ_B2G let maxTime = Date.now() - Services.prefs.getIntPref("dom.downloads.max_retention_days") * 24 * 60 * 60 * 1000; return (aDownload.startTime > maxTime) || aDownload.hasPartialData || !aDownload.stopped; #else return aDownload.hasPartialData || !aDownload.stopped; #endif }, 

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕рд╢рд░реНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдЙрдкрдорд╛ рдХреЗ рд╕рд╛рде DownloadIntegration.shouldPersistDownload () рдлрд╝рдВрдХреНрд╢рди (рдФрд░ DownloadIntegration._store.onsaveitem () рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕рдореВрд╣ рдкреЙрдк-рдЕрдк рд╣реЛ рдЬрд╛рдПрдЧрд╛ - рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рд▓реЗрдЦрд┐рдд рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдореВрд▓ рд░реВрдк рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ , рдПрдХ рдкреБрдирд░рд╛рд░рдВрдн рдХреЗ рдмрд╛рдж, рд╕рднреА рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рдПрдХ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рджрд┐рдЦрд╛рдПрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдбрд╛рдЙрдирд▓реЛрдбрд╕реЗрдЬрди рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ)ред
рд╕рдВрд╕рд╛рдзрди рд╕реЗ рдХреЛрдб рдХреЗ рдХрд╛рд░рдг рдЕрдорд╛рдиреНрдп рддрд┐рдерд┐ : //app/modules/DownloadsCommon.jsm :
 /** * Represents a single item in the list of downloads. * * The endTime property is initialized to the current date and time. * * @param aDownload * The Download object with the current state. */ function DownloadsDataItem(aDownload) { this._download = aDownload; ... this.endTime = Date.now(); this.updateFromDownload(); } 

рддрдм рдпрд╣ рд╕рдордп рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдЬрдм рдХреЙрд▓рдбрд╛рдЙрдЯрдбреИрдордЯрдо.рдкреНрд░реЛрдХреНрдЯреЛрдЯрд╛рдЗрдк.рдЕрдкрдбреЗрдЯреЗрдЯрдлреНрд░реЙрдордЬреЗрдбреЛрдХрд╛рдЙрдЯ () (рдлрд╛рдпрд░рдлреЙрдХреНрд╕ реирем-реи change) рдФрд░ рдбрд╛реЕрдбрдЯреИрдЯрдо.рдкреНрд░реЛрдЯреЗрдХреНрдЯ.рдЙрдкрдбреЗрдЯрдлреНрд░реЗрдордбреЙрдХ () (рдлрд╛рдпрд░рдлреЙрдХреНрд╕ реи )+) рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдкрд╛рджрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

рджреВрд╕рд░реЗ , MOZ_B2G рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╢рд░реНрдд рдЯрд┐рдкреНрдкрдгреА рдХрд╛ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рдХрднреА рднреА рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рдореБрдЭреЗ MOZ_B2G рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдиреНрдп рдЙрдкрдпреБрдХреНрдд рд╕рд╢рд░реНрдд рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдирд╣реАрдВ рдорд┐рд▓реАрдВ (рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ, рдпрд╣ рд╡рд╣рд╛рдВ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ - рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ ред
рдлрд┐рд░ рдпрд╣рд╛рдВ рд╕реЗ рддреАрд╕рд░рд╛ рдПрдХ : рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рд╕реВрдЪреА рд▓реЛрдб рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА - рдПрдХ рд╕реНрдЯреИрдХ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ (рддреНрд░реБрдЯрд┐ " рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ ") рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдорд╕реНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 35 рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╡рд╛рджреЛрдВ ( рд╡рд╛рджреЛрдВ ) рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ DownloadStore.prototype.load () ( рд╕рдВрд╕рд╛рдзрди: //gre/modules/DownloadStore.jsm ) рдореЗрдВ рдереЛрдбрд╝рд╛ рдЯреНрд╡реАрдХ рдФрд░ рдмрджрд▓реЗрдВ
  /** * Loads persistent downloads from the file to the list. * * @return {Promise} * @resolves When the operation finished successfully. * @rejects JavaScript exception. */ load: function DS_load() { return Task.spawn(function task_DS_load() { let bytes; try { bytes = yield OS.File.read(this.path); } catch (ex if ex instanceof OS.File.Error && ex.becauseNoSuchFile) { // If the file does not exist, there are no downloads to load. return; } let storeData = JSON.parse(gTextDecoder.decode(bytes)); // Create live downloads based on the static snapshot. for (let downloadData of storeData.list) { try { let download = yield Downloads.createDownload(downloadData); 

рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐
  let {Download} = Components.utils.import("resource://gre/modules/DownloadCore.jsm", {}); let download = Download.fromSerializable(downloadData); 

, рддрдм рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд╕рд╛рде рд╣реЛрдЧрд╛ред
рдЪреМрдерд╛ , рдХрд╣реАрдВ рдФрд░ рдЕрдиреБрдХреВрд▓рди рд╣реИрдВ (?) , рдЗрд╕рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╡реЗ рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ), рдЗрд╕рд▓рд┐рдП рд░рд┐рдмреВрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд░рд╣реЗрдЧрд╛ рдЬреИрд╕рд╛ рдХрд┐ рдерд╛ред
рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╣реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╡рд░реНрддрдорд╛рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд╛ рд╕рдВрд░рдХреНрд╖рдг рдЬреЛрдбрд╝реЗрдВ ред
рдкрд╛рдВрдЪрд╡рд╛рдВ , рдЬрдм рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдЧрд░ рдбрд╛рдЙрдирд▓реЛрдб рдкреИрдирд▓ рдореЗрдВ рдХреБрдЫ рд╣реИ (рднрд▓реЗ рд╣реА рдпрд╣ рдПрдХ рдирд┐рд▓рдВрдмрд┐рдд рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рд╣реИ) рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╣реЛрдЧреАред
рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбрд╛рдЙрдирд▓реЛрдбрдбрд╛рдЯрд╛ рдЗрдЯреЗрдо.рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк.рдЕрдкрдбреЗрдЯ рдлрд╝реЙрд░рдбреЛрдо рдбрд╛рдЙрдирд▓реЛрдб () рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ ред
рдЦреИрд░, рдбрд╛рдЙрдирд▓реЛрдбрдЬрд╕рди рд░реАрдбрд┐рдВрдЧ рдХреЛрдб, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ред рд╡рд╛рджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдХреБрдЫ рднреА рд╕реБрдзрд╛рд░ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИ - рдХрд┐рд╕реА рднреА рддрдХрдиреАрдХ рдХреЛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреЗрд╡рд▓ рдЬрд╣рд╛рдВ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдФрд░ рдмрд┐рдирд╛ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рдпрд╣ рдлреИрд╢рдиреЗрдмрд▓ рдФрд░ рдЖрдзреБрдирд┐рдХ рд╣реИ)ред
рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЬреАрдм рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдпрджрд┐ рддрд┐рдерд┐рдпрд╛рдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдЫрдВрдЯрд╛рдИ рдЙрд▓реНрдЯрд╛ рд╣реЛ рдЬрд╛рдПрдЧреА (рдирдП рд╡рд╛рд▓реЗ рдиреАрдЪреЗ рдореЗрдВ рд╣реЛрдВрдЧреЗ, рд╢реАрд░реНрд╖ рдкрд░ рдирд╣реАрдВ), рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рдкреИрдирд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрджреЗрд╢ рд╕рд╣реА рд╣реЛрдЧрд╛ рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕ рд╡рд┐рдВрдбреЛ рдореЗрдВ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдПрдХ рдмрдбрд╝реА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИрдВ ... рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдирдП рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдкрдбреЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ред рд╕рд╣реЗрдЬреЗ рдЧрдП рд╕реВрдЪреА рдХреЛ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдЬреЛрдбрд╝ рднреА рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж рд╕рдВрдмрдВрдзрд┐рдд рд╕рднреА рд▓реЛрдЧреЛрдВ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ред рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдкрдбрд╝реЗред
рдпрд╣рд╛рдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ (Shift + F5) рдиреЗ рдЕрдореВрд▓реНрдп рдорджрдж рдкреНрд░рджрд╛рди рдХреА, рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдлреНрд░реАрдЬ рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд▓рдЧрднрдЧ рдЕрд╕рдВрднрд╡ рд╣реЛрдЧрд╛ - рддрд░реНрдХ рд╡рд╣рд╛рдВ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рд╣реИ (рдФрд░ рдХреЙрд▓ рд╕реНрдЯреИрдХ рднреАрд╖рдг рд╣реИ)ред
рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдПрдХ рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдкрдврд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдо рд╕реЗ рдХрдо рд╕реВрдЪреА рд╕рдлрд╛рдИ рдлрд╝рдВрдХреНрд╢рди рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╣рд╛рдВ рднреА рдпрд╣ рдПрдХ рдвреЗрд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рд╕реВрдЪреА рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИред рдпрд╣ рдЕрднреА рддрдХ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ: рдЕрдЧрд░ рдХреБрдЫ рдмрдЪрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рддреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдирд┐рдЬреА рдореЛрдб рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЯреБрдХрдбрд╝реЗ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛ (рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рднреА рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╕рдлрд╛рдИ рдЖрдЗрдЯрдо) рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЬреЛ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЕрдкреВрд░реНрдг рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХрдо рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ - рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЙрдирдХреА рд╡рд╕реВрд▓реА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдЧреА, рднрд▓реЗ рд╣реА рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рдХреБрдЫ рд╣реЛ (рдореИрдВрдиреЗ 150 рдЯреБрдХрдбрд╝реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА)ред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд OS.File API рдХреЗ рдХрд╛рд░рдг рд╣реИ (рдФрд░ рд░реБрдХреЗ рд╣реБрдП рдбрд╛рдЙрдирд▓реЛрдб рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреА рд╡рдЬрд╣ рд╕реЗ рдлреЙрд░реНрдо рдХреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рд╛рдордиреЗ рдЖрддреА рд╣реИрдВ
рддреНрд░реБрдЯрд┐: рдСрдкрд░реЗрд╢рди рдЦреЛрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЬреАрдд рддреНрд░реБрдЯрд┐ 2 (рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИред
)
рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓: рд╕рдВрд╕рд╛рдзрди: //gre/modules/commonjs/sdk/core/promise.js
рдкрдВрдХреНрддрд┐: 133
(рдпрд╣ рд╣реИ рдЕрдЧрд░ рдЖрдк рдбрд╛рдЙрдирд▓реЛрдб рджреНрд╡рд╛рд░рд╛ рд░реЛрдХрд╛ рдЧрдпрд╛ рдлрд╝рд╛рдЗрд▓ рд╣рдЯрд╛ рджреЗрдВ)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реБрдзрд╛рд░ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд▓реЛрдбрд┐рдВрдЧ рдиреЗ рдареАрдХ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдбрд╛рдЙрдирд▓реЛрдб рдкреИрдирд▓ рдЦреЛрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреБрдЫ рдЕрдиреНрдп рдХреЛрдб рдХреЛ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдФрд░, рдпрджрд┐ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╣реИрдВ, рддреЛ рдпрд╣ рдлреНрд░реАрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

PS рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЕрднреА рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, "рдХрддрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐: 17 рдХрд╛ 4" рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ (рдФрд░ рдкрд╛рда, рд╕рдВрдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ - рдФрд░ рдпрд╣ рдПрдХ рд╕рдкреНрддрд╛рд╣ рд╕реЗ рдЕрдзрд┐рдХ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ - рдпрд╣ рдХреЗрд╡рд▓ рдЕрдЪреНрдЫрд╛ рд╣реИ), рд▓реЗрдХрд┐рди рд╣рд░ рдЪреАрдЬ рдХреА рдПрдХ рд╕реАрдорд╛ рд╣реЛрддреА рд╣реИред
PPS рдореИрдВрдиреЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддрд╛рдХрд┐ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рдореЗрдВ рдирдП рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░реА рд░рд╛рдп рдкрд╛рдардХ рдкрд░ рди рдереЛрдкреЗрдВ, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореИрдВ рд╕рдлрд▓ рд░рд╣рд╛, рдФрд░ рд╕рднреА рдХреЛ рдЕрдкрдиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рдиреЗ рджреЗрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ, рдореВрд▓ рд░реВрдк рдореЗрдВ, рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдЖрддреА рд╣реИред

Source: https://habr.com/ru/post/In215175/


All Articles