{"id":350189,"date":"2023-07-13T03:00:33","date_gmt":"2023-07-13T03:00:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=350189"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=350189","title":{"rendered":"<span>\u0421\u0438\u043c\u0431\u0438\u043e\u0437 \u00abChromium\u00bb \u0438 \u00abInternetTools\u00bb<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0417\u0430\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441 <i>\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e<\/i> \u0441\u0430\u0439\u0442\u0430 \u2013 \u044d\u0442\u043e \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u0430\u044f, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u044f (\u0431\u0435\u0437 \u043f\u043e\u043a\u0438\u0434\u0430\u043d\u0438\u044f, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443\u044e\u0442\u043d\u044b\u0445 \u0440\u0430\u043c\u043e\u043a Delphi); \u043f\u043e\u0434 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0432\u0442\u043e\u0440 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0430\u0439\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 JavaScript (\u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0441\u0443\u0440\u0441 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e), \u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c \u043e\u0442 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043f\u043e\u044f\u0432\u043b\u044f\u044f\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0438 JS-\u043a\u043e\u0434\u0430, \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0438\u0445, \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0430\u043b\u043e\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u2013 \u043f\u0443\u0441\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0430\u043b\u044c\u0431\u043e\u043c\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 <a href=\"https:\/\/www.metal-archives.com\/bands\/Vader\/145\" rel=\"nofollow noopener noreferrer\">\u0433\u0440\u0443\u043f\u043f\u044b \u0441 metal-archives.com<\/a>:  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/n5\/ax\/fe\/n5axfe10plzx-vgm8ib7bzormae.jpeg\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430\" width=\"700\" data-src=\"https:\/\/habrastorage.org\/webt\/n5\/ax\/fe\/n5axfe10plzx-vgm8ib7bzormae.jpeg\" data-blurred=\"true\"\/><\/div>\n<p><a name=\"habracut\"><\/a>\u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c, \u0438\u0445 \u043f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435, \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u0432 \u0442\u044d\u0433 <code>&lt;div id=\"band_disco\" ...><\/code>, \u043e\u0434\u043d\u0430\u043a\u043e, \u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c HTML, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043f\u043e \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0441\u044b\u043b\u043a\u0435, \u0442\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0442\u0430\u043c \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"xml\">... &lt;div id=\"band_tab_discography\">   &lt;div id=\"band_disco\" class=\"tabs2lvl\">     &lt;ul>...&lt;\/ul>   &lt;\/div> &lt;\/div> ...<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0441\u0430\u0439\u0442\u043e\u0432 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0438 \u043c\u0430\u043b\u043e\u0437\u0430\u0442\u0440\u0430\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430, \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f \u043b\u0438\u0448\u044c \u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u0430, \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0435\u0433\u043e HTML \u0441\u043e \u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c, \u2013 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432; \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u043d\u0435\u0435 \u0438 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439 \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440, \u043f\u0440\u0438\u0447\u0451\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e:<\/p>\n<ol>\n<li>Delphi-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0436\u0430\u043b\u043e\u0432\u0430\u043b\u0438 Internet Explorer \u0438\u0437-\u0437\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c \u0432 <abbr title=\"\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0421\u0438\u0441\u0442\u0435\u043c\u0435\">\u041e\u0421<\/abbr> (\u0440\u0435\u0447\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 <code><a href=\"https:\/\/docwiki.embarcadero.com\/Libraries\/Berlin\/en\/SHDocVw.IWebBrowser2\" rel=\"nofollow noopener noreferrer\">IWebBrowser2<\/a><\/code>), \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043f\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e \u0432 \u043d\u0430\u0447\u0438\u043d\u0430\u043d\u0438\u044f\u0445 \u043d\u0435\u0440\u0430\u0437\u0443\u043c\u043d\u043e, \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f.<\/li>\n<li>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c <a href=\"https:\/\/learn.microsoft.com\/ru-ru\/microsoft-edge\/webview2\/#supported-platforms\" rel=\"nofollow noopener noreferrer\">\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Windows<\/a>, \u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0432\u0435\u0436\u0443\u044e IDE (<a href=\"https:\/\/docwiki.embarcadero.com\/RADStudio\/Sydney\/en\/What's_New#New_VCL_Component:_Edge_Browser_Control\" rel=\"nofollow noopener noreferrer\">\u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 10.4 Sydney<\/a>), \u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c Edge.<\/li>\n<li>\u0421\u0430\u043c\u044b\u0439 \u0436\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u043e\u0434 \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043b\u044e\u0431\u043e\u0439 \u0434\u0430\u0432\u043d\u043e\u0441\u0442\u0438 \u041e\u0421 \u0438 \u0432\u0435\u0440\u0441\u0438\u044e Delphi, \u043e\u0441\u043d\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <a href=\"https:\/\/bitbucket.org\/chromiumembedded\/cef\/src\/master\" rel=\"nofollow noopener noreferrer\">Chromium Embedded Framework<\/a> (\u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e CEF), \u043e\u0431\u0451\u0440\u0442\u043a\u043e\u0439 \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\" rel=\"nofollow noopener noreferrer\">CEF4Delphi<\/a>, \u2013 \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d \u0438 \u043b\u044f\u0436\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0443 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/li>\n<\/ol>\n<p>  <\/p>\n<h2>\u0427\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d\u043e<\/h2>\n<p>  \u0412\u0435\u0441\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0432\u0435 \u043d\u0435\u0440\u0430\u0432\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438:<\/p>\n<ol>\n<li>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u043d\u0435\u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <code><a href=\"https:\/\/www.briskbard.com\/index.php?lang=en&amp;pageid=cefchromium\" rel=\"nofollow noopener noreferrer\">TChromium<\/a><\/code> \u0438\u0437 \u0441\u043e\u0441\u0442\u0430\u0432\u0430 CEF4Delphi, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0440\u0430\u0441\u0442\u0451\u0442 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c (\u0441\u0440\u0435\u0434\u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445):\n<p>  <a name=\"RetrieveHTML\"><\/a><\/p>\n<pre><code class=\"delphi\">TDynamicSiteExtractor = class(TChromium) public   function RetrieveHTML(const URL: string; const TargetXPath: string): string; end;<\/code><\/pre>\n<p>  \u041f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0444\u0443\u043d\u043a\u0446\u0438\u0438: \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c XPath \u0442\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0438\u043b\u0438 \u0436\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u0430, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u043b\u0438\u0431\u043e \u0447\u0435\u0433\u043e-\u0442\u043e \u0435\u0449\u0451 \u2013 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 XPath), \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f, \u2013 \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u0441\u044f, \u0431\u0443\u0434\u0435\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d HTML-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0441\u043e \u0432\u0441\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043d\u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438 \u0432\u0435\u0440\u043d\u0451\u0442. \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 <code>\/\/table[@class=\"display discog\"]<\/code>.<\/li>\n<li><a name=\"IXQValue\"><\/a>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code><a href=\"https:\/\/habr.com\/ru\/articles\/415617\/#InternetTools_Types\">IXQValue<\/a><\/code> \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u043f\u0440\u043e InternetTools \u0442\u0430\u043a\u0436\u0435 \u043e\u0431\u043e\u0433\u0430\u0442\u0438\u0442\u0441\u044f \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c:\n<pre><code class=\"delphi\">IXQValue = interface   ...   function OpenDocument(const Source: WideString): IXQValue; safecall; end;<\/code><\/pre>\n<p>  \u041e\u043d, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 <code>OpenURL<\/code>, \u0441\u0430\u043c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u044b\u043c HTML, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043e\u0442 <code>TDynamicSiteExtractor<\/code>.<\/li>\n<\/ol>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435, \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0435\u0448\u0430\u0442\u044c\u0441\u044f \u0442\u0430\u043a (\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u043f\u0443\u0449\u0435\u043d):<\/p>\n<pre><code class=\"delphi\">const   BandURL = 'https:\/\/www.metal-archives.com\/bands\/Vader\/145';   TableXPath = '\/\/table[@class=\"display discog\"]';   AlbumsXPath = TableXPath + '\/\/tr'; var   Extractor: TDynamicSiteExtractor;   BandHTML: string;   AlbumRow: IXQValue; begin   ...   BandHTML := Extractor.RetrieveHTML(BandURL, TableXPath);    for AlbumRow in GetXQValue.OpenDocument(BandHTML).Map(AlbumsXPath) do     ... \/\/ \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0445 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e\u0431 \u0430\u043b\u044c\u0431\u043e\u043c\u0430\u0445    ... end<\/code><\/pre>\n<p>  \u0421\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u00ab\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0443\u044e\u00bb \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441\u0441\u044b\u043b\u043e\u043a (\u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0443 \u0430\u0432\u0442\u043e\u0440\u0430 \u0442\u0430\u043a), \u0438\u0431\u043e \u043c\u0435\u0442\u043e\u0434 <code>RetrieveHTML<\/code> \u2013 \u0432\u0435\u0434\u044c \u0441\u0430\u0439\u0442\u044b \u0431\u044b\u0432\u0430\u044e\u0442 \u043e\u0447\u0435\u043d\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u2013 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0441\u0435\u043a\u0443\u043d\u0434, \u0430 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0434\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0434\u0435\u0441\u044c \u043d\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0431\u043e\u0301\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0430 \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0434\u0435\u0442\u0430\u043b\u044f\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u0430\u0447\u0438\u0432\u0430\u044f\u0441\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0430\u0445 \u00ab\u043a\u0430\u043a\u00bb \u0438 \u00ab\u043f\u043e\u0447\u0435\u043c\u0443\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043b\u0438\u0448\u044c \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0433\u043e\u0442\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 <a href=\"#Examples\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b<\/a>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0434\u0432\u0443\u0445 Delphi-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 (\u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0432 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0438\u043c\u0435\u0442\u044c \u0434\u0435\u043b \u0441 CEF, \u2013 \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0439 \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u0412 \u043f\u043b\u0430\u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438 \u043e\u0431\u044a\u0451\u043c\u0430 \u043a\u043e\u0434\u0430 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 CEF4Delphi \u043d\u0435\u0441\u0440\u0430\u0432\u043d\u0438\u043c\u0430 \u0441 \u043a\u0440\u043e\u0445\u043e\u0442\u043d\u044b\u043c\u0438 <a href=\"#InternetTools_realization\">\u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c\u0438 InternetTools<\/a>, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 <code>TDynamicSiteExtractor<\/code> \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0441\u0430\u043c\u043e\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u0435\u043d \u0438, \u0441\u0430\u043c\u043e-\u0441\u043e\u0431\u043e\u0439, \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0431\u0435\u0437 \u0441\u0432\u044f\u0437\u043a\u0438 \u0441 \u0447\u0435\u043c-\u043b\u0438\u0431\u043e (\u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c HTML \u0441\u0430\u0439\u0442\u0430, \u0431\u0435\u0437 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0430\u043d\u0430\u043b\u0438\u0437\u0430), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0443\u043c\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430.<\/p>\n<h3>TDynamicSiteExtractor<\/h3>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u0442\u043e\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043c\u0443\u0442\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u043e\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 \u0443\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L781-L783\" rel=\"nofollow noopener noreferrer\">RetrieveHTML<\/a><\/code> (\u0441\u0443\u0442\u044c \u0443 \u043d\u0438\u0445 \u0432\u0441\u0435\u0445 \u043e\u0434\u043d\u0430):<\/p>\n<pre><code class=\"delphi\">procedure RetrieveHTML(const aFrameName: ustring = ''); overload; procedure RetrieveHTML(const aFrame: ICefFrame); overload; procedure RetrieveHTML(const aFrameIdentifier: int64); overload;<\/code><\/pre>\n<p>  <a name=\"Nonblocking_methods\"><\/a>\u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0431\u0435\u0437 var- \u0438 out-\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b\u0445 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442, \u2013 \u0432\u0441\u0451 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434\u044b \u044d\u0442\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 (\u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435), \u043e\u043d\u0438 \u043b\u0438\u0448\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0430 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0430\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 (HTML) \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L993\" rel=\"nofollow noopener noreferrer\">OnTextResultAvailable<\/a><\/code>; \u043f\u0440\u0438\u0447\u0451\u043c \u0434\u0430\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c HTML-\u043a\u043e\u0434 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0438\u0437 \u0441\u0442\u0430\u0442\u044c\u0438 \u2013 \u0442\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0443\u0437\u043b\u043e\u0432, \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438. \u0415\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c, \u0447\u0442\u043e <code>TChromium<\/code> \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0445\u043e\u0442\u044c \u0438 \u043d\u0435\u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c, \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0435\u043c\u044b\u043c \u043d\u0430 \u0444\u043e\u0440\u043c\u0435, \u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e, \u0442.\u00a0\u043a. \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0441\u0442\u0438 \u0441 \u00ab\u0437\u0430\u043c\u043e\u0440\u043e\u0437\u043a\u043e\u0439\u00bb \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u043e\u0433\u0434\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 (\u0441\u043a\u0430\u0436\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0439 Windows-\u0441\u043b\u0443\u0436\u0431\u044b) \u0438 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0441\u0432\u043e\u0451\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c, \u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u2013 \u0432\u0435\u0434\u044c \u0434\u0430\u0436\u0435 \u0434\u043e\u043b\u0433\u043e\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442.<\/p>\n<h4>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h4>\n<p>  \u041e\u0434\u043d\u0430 \u0438\u0437 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 <code>TChromium<\/code> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0435 (\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0441\u0430\u0439\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440), \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromium.pas#L86\" rel=\"nofollow noopener noreferrer\">CreateBrowser<\/a><\/code> (\u043f\u0440\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u0430\u043a \u043d\u0435\u0442\u0440\u0443\u0434\u043d\u043e \u0434\u043e\u0433\u0430\u0434\u0430\u0442\u044c\u0441\u044f, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437, \u0437\u0430\u0438\u043c\u0435\u0432 \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0435 \u043e\u0434\u0438\u043d \u00ab\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u00bb, \u043d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u043e\u0434\u0435\u043b\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430:<\/p>\n<p>  <a name=\"First_AfterConstruction_version\"><\/a><\/p>\n<pre><code class=\"delphi\">unit CEF.Extractor;  interface  uses   System.SysUtils, uCEFChromium;  type   EExtractorException = class(Exception);    TDynamicSiteExtractor = class(TChromium)   public     procedure AfterConstruction; override;     ...   end;  implementation  procedure TDynamicSiteExtractor.AfterConstruction; begin   inherited;    if not CreateBrowser then     raise EExtractorException.Create('...'); end;  end.<\/code><\/pre>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0434\u043b\u044f \u0435\u0433\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L1710-L1721\" rel=\"nofollow noopener noreferrer\">AfterConstruction<\/a><\/code>.<\/p>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u044d\u0442\u043e \u043b\u0438\u0448\u044c \u0432\u0445\u043e\u0434 \u0432 \u043a\u0440\u043e\u043b\u0438\u0447\u044c\u044e \u043d\u043e\u0440\u0443 \u2013 \u0447\u0443\u0442\u044c <a href=\"#Nonblocking_methods\">\u0432\u044b\u0448\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c<\/a>, \u0447\u0442\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b <code>RetrieveHTML<\/code> \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u0430 \u0441\u0430\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0438; \u0442\u0430\u043a \u0438 \u0437\u0434\u0435\u0441\u044c \u2013 <code>CreateBrowser<\/code> \u0432\u0441\u0435\u0433\u043e-\u043d\u0430\u0432\u0441\u0435\u0433\u043e \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u00ab\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u00bb, \u0430 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L1071\" rel=\"nofollow noopener noreferrer\">OnAfterCreated<\/a><\/code> (\u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a <code>TChromium<\/code>, \u0442\u043e \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c, \u0430 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0442\u044c \u043c\u0435\u0442\u043e\u0434, \u0435\u0433\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439, \u2013 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L568\" rel=\"nofollow noopener noreferrer\">doOnAfterCreated<\/a><\/code>). \u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u043d\u044e\u0430\u043d\u0441 (\u043d\u043e \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043f\u043e\u0436\u0430\u043b\u0443\u0439 \u0441\u0430\u043c\u044b\u043c \u0433\u043b\u0430\u0432\u043d\u044b\u043c) \u0442\u0430\u043a\u043e\u0432 \u2013 <code>doOnAfterCreated<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 <i><a href=\"https:\/\/bitbucket.org\/chromiumembedded\/cef\/wiki\/GeneralUsage.md#markdown-header-threads\" rel=\"nofollow noopener noreferrer\">\u043f\u043e\u0442\u043e\u043a\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e CEF<\/a><\/i>. \u042d\u0442\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c\u0441\u044f: <code>AfterConstruction<\/code> \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043d\u0430\u0448\u0435\u043c (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c) \u043f\u043e\u0442\u043e\u043a\u0435, \u0430 \u043c\u0435\u0442\u043e\u0434, \u0438\u0437\u0432\u0435\u0449\u0430\u044e\u0449\u0438\u0439 \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u00ab\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u00bb, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432 CEF-\u043f\u043e\u0442\u043e\u043a\u0435; \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u0434\u0430\u043b\u0435\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0440\u0430\u0437 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442\u0441\u044f, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0449\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043f\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<ol>\n<li><a name=\"Pattern_of_waiting\"><\/a>\u0421\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u0430\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0435 (<code><a href=\"https:\/\/docwiki.embarcadero.com\/Libraries\/Berlin\/en\/System.SyncObjs.TEvent\" rel=\"nofollow noopener noreferrer\">TEvent<\/a><\/code>), \u2013 \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 <code>TDynamicSiteExtractor<\/code>, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430 \u043b\u0435\u0442\u0443.<\/li>\n<li>\u0421\u043e\u0431\u044b\u0442\u0438\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f).<\/li>\n<li>\u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043a\u0438\u0439 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434, \u043f\u043b\u043e\u0434\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f.<\/li>\n<li>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code><a href=\"https:\/\/docwiki.embarcadero.com\/Libraries\/Berlin\/en\/System.SyncObjs.THandleObject.WaitFor\" rel=\"nofollow noopener noreferrer\">TEvent.WaitFor<\/a><\/code>.<\/li>\n<li>\u0427\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f CEF-\u043f\u043e\u0442\u043e\u043a \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043c\u0435\u0442\u043e\u0434, \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0431 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0433\u0434\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f (\u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435).<\/li>\n<li>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443.<\/li>\n<\/ol>\n<p>  \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a <code>CreateBrowser<\/code> \u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438, \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/wb\/lz\/hs\/wblzhsgytjtdvbq5u-yahnqgfpu.png\" alt=\"AfterConstruction: \u0441\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432\" width=\"500\" data-src=\"https:\/\/habrastorage.org\/webt\/wb\/lz\/hs\/wblzhsgytjtdvbq5u-yahnqgfpu.png\"\/><\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043d\u0435\u0442 \u0441\u0431\u0440\u043e\u0441\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u043e \u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u0447\u0438\u043d\u0435, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043e\u043d\u043e \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438. \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0434 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0433\u043b\u0430\u0432\u043d\u044b\u0439 VCL-\u043f\u043e\u0442\u043e\u043a (Delphi-\u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c DLL, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440) \u2013 \u0445\u043e\u0442\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0441 \u043d\u0438\u043c \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u0442 \u043f\u043e\u0442\u043e\u043a, \u0433\u0434\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 <code>TDynamicSiteExtractor<\/code>.<\/p>\n<p>  \u041f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043f\u043e\u043b\u043d\u043e\u043c\u0443 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 <code>AfterConstruction<\/code>, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u2013 \u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 <code>TEvent.WaitFor<\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0449\u0443\u044e \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c:<\/p>\n<pre><code class=\"delphi\">procedure TDynamicSiteExtractor.WaitFor(const Event: TEvent; const Timeout: LongWord = INFINITE); begin   case Event.WaitFor(Timeout) of     wrTimeout: raise EExtractorException.CreateFmt('...', [Timeout]);     wrError: RaiseLastOSError(Event.LastError);     wrAbandoned: raise EExtractorException.Create('...');   end; end;<\/code><\/pre>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0447\u0443\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 <a href=\"#First_AfterConstruction_version\">\u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430<\/a>:<\/p>\n<pre><code class=\"delphi\">uses   ..., System.SyncObjs, uCEFInterfaces;  type   ...    TDynamicSiteExtractor = class(TChromium)   private     const       CreateBrowserTimeout = 15 * 1000;   private     FCreateEvent: TEvent;      procedure WaitFor(const Event: TEvent; const Timeout: LongWord = INFINITE);   protected     procedure doOnAfterCreated(const browser: ICefBrowser); override;   ...   end;  implementation  procedure TDynamicSiteExtractor.AfterConstruction; begin   inherited;    FCreateEvent := TEvent.Create;   if not CreateBrowser then     raise EExtractorException.Create('...');   WaitFor(FCreateEvent, CreateBrowserTimeout); end;  procedure TDynamicSiteExtractor.doOnAfterCreated(const browser: ICefBrowser); begin   inherited;    FCreateEvent.SetEvent; end;<\/code><\/pre>\n<p>  \u0414\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0433\u0434\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0437\u0434\u0435\u0441\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0435, \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u043b\u0435\u0435.<\/p>\n<h4>\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0437\u0430\u0442\u044f\u043d\u0443\u0432\u0448\u0435\u0435\u0441\u044f, \u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435 \u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043e\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043a \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443, \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440, \u0433\u0434\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u00ab\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u00bb, \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u044b\u0448\u0435: \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u044d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L743\" rel=\"nofollow noopener noreferrer\">CloseBrowser<\/a><\/code>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f, \u043a\u0430\u043a \u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 <code>CreateBrowser<\/code>, \u043b\u0438\u0448\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u043a\u043e\u0435\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L569\" rel=\"nofollow noopener noreferrer\">doOnBeforeClose<\/a><\/code>, \u0432\u044b\u0437\u0432\u0430\u043d\u043d\u0430\u044f CEF-\u043f\u043e\u0442\u043e\u043a\u043e\u043c; \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0440\u043e\u0432\u043d\u043e \u0442\u0430 \u0436\u0435 \u0441\u0445\u0435\u043c\u0430 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c, \u043f\u043e\u0447\u0442\u0438 \u043e\u0434\u0438\u043d \u0432 \u043e\u0434\u0438\u043d:<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   private     FCloseEvent: TEvent;     ...   protected     ...     procedure doOnBeforeClose(const browser: ICefBrowser); override;   public     destructor Destroy; override;     ...   end;  implementation  ...  destructor TDynamicSiteExtractor.Destroy; begin   if Initialized then   begin     FCloseEvent := TEvent.Create;     CloseBrowser(True);     FCloseEvent.WaitFor;   end;    inherited;    FCreateEvent.Free;   FCloseEvent.Free; end;  procedure TDynamicSiteExtractor.doOnBeforeClose(const browser: ICefBrowser); begin   inherited;    FCloseEvent.SetEvent; end;<\/code><\/pre>\n<p>  \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c: \u043c\u0435\u0442\u043e\u0434 <code>WaitFor<\/code> \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u0431\u0435\u0437 \u043e\u0431\u0451\u0440\u0442\u043a\u0438, \u0438\u0431\u043e \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0432 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0435\u043b\u044c\u0437\u044f \u2013 \u044d\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0443\u0442\u0435\u0447\u043a\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0438\u0437-\u0437\u0430 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>  \u0423\u0441\u043b\u043e\u0432\u0438\u0435 <code>if Initialized then<\/code> \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u0432 <code>AfterConstruction<\/code> \u0431\u044b\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u00ab\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u00bb \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0441\u044f \u2013 \u043f\u0440\u0438 \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438 <code>CloseBrowser<\/code> \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 (\u0431\u0443\u0434\u0442\u043e \u0435\u0433\u043e \u0438 \u043d\u0435\u0442), \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0438 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f <code>doOnBeforeClose<\/code>, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c\u0443 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0430\u0439\u043c\u0430\u0443\u0442\u0430.<\/p>\n<h4>\u041e\u0442 \u043e\u0431\u0449\u0435\u0433\u043e \u043a \u0447\u0430\u0441\u0442\u043d\u043e\u043c\u0443<\/h4>\n<p>  \u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u043c \u0432\u0438\u043d\u043e\u0432\u043d\u0438\u043a\u0430 \u0442\u043e\u0440\u0436\u0435\u0441\u0442\u0432\u0430 \u2013 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code><a href=\"#RetrieveHTML\">RetrieveHTML<\/a><\/code>. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435 \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u043e\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0434 \u0442\u0435\u0445 \u043d\u043e\u0432\u044b\u0445 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u044f\u043c\u0438, \u0447\u044c\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e, \u0434\u0430\u0431\u044b \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u0415\u0441\u043b\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u0443 \u0448\u0438\u0440\u043e\u043a\u0438\u043c\u0438 \u043c\u0430\u0437\u043a\u0430\u043c\u0438, \u0442\u043e \u043d\u043e\u0432\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435:<\/p>\n<ol>\n<li><a name=\"RetrieveHTML_loading_step\"><\/a>\u00ab\u041e\u0442\u043a\u0440\u044b\u0442\u044c\u00bb \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0439 \u0435\u043c\u0443 \u043f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u0441\u0430\u0439\u0442 \u2013 \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c HTTP-\u0437\u0430\u043f\u0440\u043e\u0441\u044b, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0432 \u0432\u0441\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0441\u043a\u0440\u0438\u043f\u0442\u044b); \u0435\u0441\u043b\u0438 \u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c, \u0442\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/li>\n<li><a name=\"RetrieveHTML_XPath_step\"><\/a>\u0414\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 XPath \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 (\u0436\u0434\u0430\u0442\u044c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u0439\u043c\u0430\u0443\u0442); \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e, \u043d\u0435\u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e.<\/li>\n<li>\u0421\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c HTML \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u0432\u0441\u0435\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c.<\/li>\n<\/ol>\n<p>  \u0421\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0439 \u044d\u0441\u043a\u0438\u0437 \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e (\u043d\u0435\u0440\u0430\u0431\u043e\u0447\u0438\u0439) \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442:<\/p>\n<p>  <a name=\"RetrieveHTML_sketch\"><\/a><\/p>\n<pre><code class=\"delphi\">uses   ..., uCEFTypes;  ...  implementation  ...  function TDynamicSiteExtractor.RetrieveHTML(const URL: string; const TargetXPath: string): string; var   HTML: string; begin   LoadURL(URL);    \/\/ \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 TargetXPath   ...    Browser.MainFrame.GetSourceProc     (     procedure (const str: ustring)     begin       HTML := str;     end     );    Result := HTML; end;<\/code><\/pre>\n<p>  \u042d\u0441\u043a\u0438\u0437\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0438 \u043a\u043e\u0434\u0430 \u043f\u043e \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 XPath \u2013 \u0432 \u0442\u0430\u043a\u043e\u043c \u0432\u0438\u0434\u0435 \u043d\u0435 \u0434\u0430\u0441\u0442 \u0436\u0435\u043b\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0451. \u0421\u0430\u043c\u0430\u044f \u043b\u0435\u0433\u043a\u043e\u043f\u043e\u043f\u0440\u0430\u0432\u0438\u043c\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 (\u0434\u0430\u0436\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043a\u0430) \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435\u043c HTML, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u043e\u0439\u0442\u0438 \u0441 \u043a\u043e\u043d\u0446\u0430, \u043d\u0430\u0447\u0430\u0432 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u043d\u0435\u0451: \u0432\u0441\u0451 \u0441\u043d\u043e\u0432\u0430 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 CEF, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0430\u043d\u043e\u043d\u0438\u043c\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u2013 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043d\u043e\u0432\u044c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f; \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043f\u0435\u0440\u0432\u0430\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0431\u0440\u043e\u0441\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u0412\u0430\u043c \u043e\u0447\u0435\u043d\u044c \u0437\u043d\u0430\u043a\u043e\u043c\u043e\u0439:<\/p>\n<pre><code class=\"delphi\">function TDynamicSiteExtractor.RetrieveHTML(const URL: string; const TargetXPath: string): string; var   Event: TEvent;   ... begin   ...    Event := TEvent.Create;   try     Browser.MainFrame.GetSourceProc       (       procedure (const str: ustring)       begin         HTML := str;         Event.SetEvent;       end       );     WaitFor(Event);   finally     Event.Free;   end;    Result := HTML; end;<\/code><\/pre>\n<p>  \u0412\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0433\u0432\u043e\u0437\u0434\u043a\u0430 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 URL (\u0440\u0435\u0447\u044c \u043e <a href=\"#RetrieveHTML_loading_step\">\u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435<\/a>), \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L758\" rel=\"nofollow noopener noreferrer\">LoadURL<\/a><\/code> \u0432\u0441\u0451 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f, \u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u043d\u0435\u0439 \u0434\u0432\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2013 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L1023\" rel=\"nofollow noopener noreferrer\">OnLoadEnd<\/a><\/code> \u0438 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L1024\" rel=\"nofollow noopener noreferrer\">OnLoadError<\/a><\/code>, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u2013 \u043e\u0434\u043d\u0430\u043a\u043e \u043a\u0430\u043a \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c\u0438 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0440\u0435\u0437\u043e\u043d\u0430 \u043d\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b \u2013 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L520\" rel=\"nofollow noopener noreferrer\">doOnLoadEnd<\/a><\/code> \u0438 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L521\" rel=\"nofollow noopener noreferrer\">doOnLoadError<\/a><\/code>. \u041d\u044e\u0430\u043d\u0441 \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e, \u0432\u0438\u0434\u0438\u043c\u043e \u0432\u0432\u0438\u0434\u0443 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 CEF4Delphi, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u044d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u0440\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445, \u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u044d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L4801-L4807\" rel=\"nofollow noopener noreferrer\">MustCreateLoadHandler<\/a><\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u043b\u044f \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   protected     function MustCreateLoadHandler: Boolean; override;   ...   end;  implementation  ...  function TDynamicSiteExtractor.MustCreateLoadHandler: Boolean; begin   Result := True; end;<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0430\u0439\u0442\u0430, \u0432\u044b\u0437\u043e\u0432\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430 <code>doOnLoadEnd<\/code>, \u0433\u0434\u0435 \u043f\u0440\u0438 \u0434\u0432\u0443\u0445\u0441\u043e\u0442\u043e\u043c \u043a\u043e\u0434\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 <code>TEvent<\/code> \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432 \u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0435\u0441\u043b\u0438 \u0436\u0435 \u0432 \u0412\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u0441\u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u0434\u044b, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0445 \u0437\u0434\u0435\u0441\u044c; \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u044b, \u0438\u0431\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0441\u0430\u043c\u044b\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u0438 \u0434\u0435\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435):<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   private     FLoadEvent: TEvent;     ...   protected     procedure doOnLoadEnd(const browser: ICefBrowser; const frame: ICefFrame;       httpStatusCode: Integer); override;   ...   end;  implementation  ...  procedure TDynamicSiteExtractor.doOnLoadEnd(const browser: ICefBrowser;   const frame: ICefFrame; httpStatusCode: Integer); begin   inherited;    if frame.IsMain and (httpStatusCode = 200) then     FLoadEvent.SetEvent; end;<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0431\u044b\u043b\u043e <a href=\"#RetrieveHTML_loading_step\">\u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043e<\/a>, \u043b\u044e\u0431\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u043a \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e, \u043d\u043e <code>doOnLoadError<\/code> \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043d\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430, \u0430 \u0442\u043e\u0433\u043e, \u043a\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c <abbr title=\"\u042f\u0437\u044b\u043a\u0435 \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\">\u042f\u041f<\/abbr>, \u043d\u0438\u0447\u0435\u0433\u043e, \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0435 \u0437\u043d\u0430\u044e\u0449\u0435\u0433\u043e \u043e Delphi-\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u0445, \u2013 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438; \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, <code>doOnLoadError<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e <i>\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c<\/i> \u043e\u0431\u044a\u0435\u043a\u0442-\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044f \u0435\u0433\u043e \u0432 \u043f\u043e\u043b\u0435 \u043a\u043b\u0430\u0441\u0441\u0430, \u0430 <a name=\"RetrieveHTML_exception_raising\"><\/a><i>\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f<\/i> \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0443\u0436\u0435 \u043f\u043e\u0437\u0436\u0435, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u043e\u0442\u043e\u043a\u0435, \u043a\u0430\u043a \u0438 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043e. \u0423\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p>  <a name=\"FLoadException\"><\/a><\/p>\n<pre><code class=\"delphi\">TDynamicSiteExtractor = class(TChromium) ... strict private   FLoadException: EExtractorException; ... end;<\/code><\/pre>\n<p>  \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c <code>strict private<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0435 \u0441 \u0446\u0435\u043b\u044c\u044e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u043b\u044e (\u0440\u0435\u0447\u044c \u0432\u0435\u0434\u044c \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435, \u0433\u0434\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0441\u0443\u0436\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0441\u043c\u044b\u0441\u043b\u0430 \u043d\u0435 \u043d\u0435\u0441\u0451\u0442), \u0430 \u0441\u043a\u043e\u0440\u0435\u0435 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u043d\u0443\u0442\u044c \u0435\u0433\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u043d\u0443\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u043b\u0438\u043a\u0430\u0442\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u2013 \u044f\u0432\u043b\u044f\u044f\u0441\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u043c \u043e\u0431\u0449\u0438\u043c, \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u043c \u0434\u043b\u044f \u0434\u0432\u0443\u0445 \u043f\u043e\u0442\u043e\u043a\u043e\u0432, \u043e\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0437\u0430\u0449\u0438\u0442\u044b \u043f\u0440\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043a\u043e\u0434\u0443, \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0432\u0441\u0451 \u0436\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u044d\u0442\u0430\u043f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/pw\/js\/rf\/pwjsrfjgtepbxekxxl8j2at1r9q.png\" alt=\"RetrieveHTML: \u0441\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 (\u0441 \u043e\u0431\u0449\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438)\" width=\"650\" data-src=\"https:\/\/habrastorage.org\/webt\/pw\/js\/rf\/pwjsrfjgtepbxekxxl8j2at1r9q.png\"\/><\/div>\n<p>  \u0421 \u0443\u0447\u0451\u0442\u043e\u043c \u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e, \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <code>doOnLoadError<\/code> \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 (\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u043c \u0432 \u043d\u0435\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438, \u0431\u043b\u0430\u0433\u043e \u0442\u0438\u043f <code>FLoadException<\/code> \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code><a href=\"https:\/\/docwiki.embarcadero.com\/Libraries\/Berlin\/en\/System.SyncObjs.TInterlocked\" rel=\"nofollow noopener noreferrer\">TInterlocked<\/a><\/code>, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c \u0431\u0435\u0437, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438):<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   protected     procedure doOnLoadError(const browser: ICefBrowser; const frame: ICefFrame;       errorCode: TCefErrorCode; const errorText, failedUrl: ustring); override;   ...   end;  implementation  ...  procedure TDynamicSiteExtractor.doOnLoadError(const browser: ICefBrowser;   const frame: ICefFrame; errorCode: TCefErrorCode; const errorText, failedUrl: ustring); begin   inherited;    if not frame.IsMain then     Exit;    TInterlocked.Exchange( FLoadException, EExtractorException.CreateFmt('...',     [failedUrl, errorCode, errorText]) );   FLoadEvent.SetEvent; end;<\/code><\/pre>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435, \u0442\u0435\u043f\u0435\u0440\u044c \u043a \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u043c\u0443 \u0432\u044b\u0437\u043e\u0432\u0443 <a href=\"#RetrieveHTML_sketch\"><code>LoadURL<\/code><\/a> \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0441\u044f, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430\u0434\u0435\u044f\u0442\u044c\u0441\u044f, \u0443\u0436\u0435 \u0441\u0442\u0430\u0432\u0448\u0438\u0439 \u0434\u043b\u044f \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0447\u0442\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0434 \u0441 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u044f:<\/p>\n<pre><code class=\"delphi\">function TDynamicSiteExtractor.RetrieveHTML(const URL: string; const TargetXPath: string): string;    procedure LoadURLAndWait;   begin     FLoadEvent.ResetEvent;     LoadURL(URL);     WaitFor(FLoadEvent);     CheckException(FLoadException);   end;  ... begin   LoadURLAndWait;    ... end;<\/code><\/pre>\n<p>  <code>CheckException<\/code> \u2013 \u044d\u0442\u043e \u043d\u043e\u0432\u0430\u044f \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 <a href=\"#RetrieveHTML_exception_raising\">\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/a>, \u0432\u044b\u043d\u0435\u0441\u0435\u043d\u043d\u0430\u044f \u0432\u043d\u0435 <code>RetrieveHTML<\/code> \u0438\u0437-\u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u0430\u043b\u0435\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0435\u0451 \u0435\u0449\u0451 \u0440\u0430\u0437, \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   private     procedure CheckException(var PreparedException: EExtractorException);   ...   end;  implementation  ...  procedure TDynamicSiteExtractor.CheckException(var PreparedException: EExtractorException); var   ExceptionCopy: Exception; begin   ExceptionCopy := TInterlocked.Exchange&lt;EExtractorException>(PreparedException, nil);   if Assigned(ExceptionCopy) then     raise ExceptionCopy; end;<\/code><\/pre>\n<p>  \u041d\u0430 \u043f\u043e\u0432\u0435\u0441\u0442\u043a\u0435 \u043e\u0441\u0442\u0430\u043b\u0441\u044f <a href=\"#RetrieveHTML_XPath_step\">\u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u043d\u043a\u0442<\/a>, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439 \u0437\u0430 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0441\u0451 \u043e\u043c\u0440\u0430\u0447\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043e\u0431\u044a\u0451\u043c\u043d\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0441 \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <code>XPathExists<\/code> \u2013 \u043e\u043d \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>True<\/code> \u043f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0438\u0441\u043a\u043e\u043c\u043e\u0433\u043e (\u0435\u0433\u043e \u043a\u043e\u0434\u0443 \u043f\u043e\u0441\u0432\u044f\u0449\u0451\u043d \u0446\u0435\u043b\u044b\u0439 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b):<\/p>\n<pre><code class=\"delphi\">TDynamicSiteExtractor = class(TChromium) ... private   function XPathExists(const XPath: string): Boolean; ... end;<\/code><\/pre>\n<p>  \u0418 \u0432\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c-\u0442\u043e, \u0434\u043e\u0431\u0440\u043e\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u043d\u043e \u043e\u0442\u043b\u043e\u0436\u0438\u0432 \u0441\u0430\u043c\u043e\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0435 \u043d\u0430\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u043a, \u043c\u043e\u0436\u043d\u043e \u0441 \u043a\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u0447\u0438\u0441\u0442\u043e\u0439 \u0441\u043e\u0432\u0435\u0441\u0442\u044c\u044e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c <code>RetrieveHTML<\/code>:<\/p>\n<p>  <a name=\"RetrieveHTML_with_WaitTargetXPath\"><\/a><\/p>\n<pre><code class=\"delphi\">uses   ..., System.Classes;  type   ...    TDynamicSiteExtractor = class(TChromium)   private     const       XPathTimeout = 5 * 1000;   ...   end;  implementation  uses   System.Diagnostics;  ...  function TDynamicSiteExtractor.RetrieveHTML(const URL: string; const TargetXPath: string): string;    ...    function WaitTargetXPath: Boolean;   const     Pause = 200;   var     Timer: TStopWatch;   begin     Result := True;     Timer := TStopWatch.StartNew;      while not XPathExists(TargetXPath) do     begin       TThread.Sleep(Pause);       if Timer.ElapsedMilliseconds >= XPathTimeout then         Exit(False);     end;   end;  ... begin   LoadURLAndWait;    if not WaitTargetXPath then     raise EExtractorException.Create('...');    ... end;<\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0432\u043f\u043e\u043b\u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u0447\u043a\u0443 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c, \u0435\u0441\u043b\u0438 \u0431\u044b \u043d\u0435 \u043e\u0434\u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u0439\u0442\u043e\u0432 \u0432 \u0446\u0435\u043b\u043e\u043c, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c: \u043d\u0435 \u0442\u0430\u043a \u0447\u0430\u0441\u0442\u043e, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0431\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e, \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0430\u043d\u0438\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043d\u0430 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0435; \u0437\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0441\u0438\u043b\u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u2013 \u0441\u043a\u0430\u0436\u0435\u043c \u0441\u0431\u043e\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430, \u0438\u043b\u0438 \u0436\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u0442\u043a\u0443\u0434\u0430 \u0441\u043a\u0440\u0438\u043f\u0442 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0438 \u0442\u043e\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u043f\u0440\u0435\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438; \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0434\u0438\u043d-\u0434\u0432\u0430 \u0440\u0430\u0437\u0430, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0432\u043e\u0437\u0431\u0443\u0436\u0434\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u2013 \u0432 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043c\u0435\u0442\u043e\u0434\u0430 \u0447\u0443\u0442\u044c \u0443\u0441\u043b\u043e\u0436\u043d\u0438\u0442\u0441\u044f:<\/p>\n<pre><code class=\"delphi\">function TDynamicSiteExtractor.RetrieveHTML(const URL: string; const TargetXPath: string): string;    ...  const   AttemptCount = 3; var   ...   Attempt: Cardinal; begin   for Attempt := 1 to AttemptCount do   begin     LoadURLAndWait;      if WaitTargetXPath then       Break     else       if Attempt = AttemptCount then         raise EExtractorException.Create('...');   end;    ... end;<\/code><\/pre>\n<p>  \u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0438\u0437 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432 \u0443 \u0412\u0430\u0441 \u043d\u0435 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f <code>RetrieveHTML<\/code>, \u0432 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0432\u0438\u0434\u0438\u0442\u0441\u044f \u0437\u0434\u0440\u0430\u0432\u044b\u043c \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0432\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0435\u0434\u0438\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"delphi\">function TDynamicSiteExtractor.RetrieveHTML(const URL: string; const TargetXPath: string): string;    procedure LoadURLAndWait;   begin     FLoadEvent.ResetEvent;     LoadURL(URL);     WaitFor(FLoadEvent);     CheckException(FLoadException);   end;    function WaitTargetXPath: Boolean;   const     Pause = 200;   var     Timer: TStopWatch;   begin     Result := True;     Timer := TStopWatch.StartNew;      while not XPathExists(TargetXPath) do     begin       TThread.Sleep(Pause);       if Timer.ElapsedMilliseconds >= XPathTimeout then         Exit(False);     end;   end;  const   AttemptCount = 3; var   Attempt: Cardinal;   Event: TEvent;   HTML: string; begin   for Attempt := 1 to AttemptCount do   begin     LoadURLAndWait;      if WaitTargetXPath then       Break     else       if Attempt = AttemptCount then         raise EExtractorException.Create('...');   end;    Event := TEvent.Create;   try     Browser.MainFrame.GetSourceProc       (       procedure (const str: ustring)       begin         HTML := str;         Event.SetEvent;       end       );     WaitFor(Event);   finally     Event.Free;   end;    Result := HTML; end;<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h4>\u041c\u0435\u0442\u043e\u0434 XPathExists<\/h4>\n<p>  <a name=\"evaluate\"><\/a>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, CEF \u043d\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0443\u0437\u043a\u043e\u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 XPath, \u043f\u043e\u043b\u0443\u0447\u0438\u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0435\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f; \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u0435\u0447\u0430\u043b\u044c \u0440\u0430\u0437\u0432\u0435\u0432\u0430\u0435\u0442 \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u2013 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 JS-\u043a\u043e\u0434, \u0433\u0434\u0435 \u0443\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Document\/evaluate\" rel=\"nofollow noopener noreferrer\">evaluate<\/a><\/code>, \u0434\u0435\u043b\u0430\u044e\u0449\u0443\u044e \u0440\u043e\u0432\u043d\u043e \u0442\u043e, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0435, \u0442\u043e \u0437\u0430 JavaScript \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFInterfaces.pas#L998\" rel=\"nofollow noopener noreferrer\">ICefv8Context<\/a><\/code> (\u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435 \u2013 \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434 <code>Eval<\/code>), \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443 \u0444\u0440\u0435\u0439\u043c\u0430 \u0447\u0435\u0440\u0435\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFInterfaces.pas#L803\" rel=\"nofollow noopener noreferrer\">GetV8Context<\/a><\/code>, \u043d\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043f\u0440\u0435\u043f\u044f\u0442\u0441\u0442\u0432\u0438\u0435, \u0438\u0437-\u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0434\u0430\u0436\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u0446\u0435\u043b\u044b\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b, \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443: \u0435\u0441\u043b\u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <code>ICefv8Context<\/code> \u0447\u0435\u0440\u0435\u0437, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, <code>Browser.MainFrame.GetV8Context<\/code> (\u043f\u0440\u0438\u0447\u0451\u043c \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 <code>TDynamicSiteExtractor<\/code>, \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 CEF-\u043f\u043e\u0442\u043e\u043a\u0430), \u0442\u043e \u044d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c <code>nil<\/code>. \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e, \u043d\u043e \u0437\u0430\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0431\u0438\u043b\u0438\u044e \u0442\u0440\u0443\u0434\u0430 \u043f\u043e\u0437\u0436\u0435: CEF \u2013 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0435, \u043d\u043e \u0438 <a href=\"https:\/\/bitbucket.org\/chromiumembedded\/cef\/wiki\/GeneralUsage.md#markdown-header-processes\" rel=\"nofollow noopener noreferrer\">\u043c\u043d\u043e\u0433\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043d\u043e\u0435<\/a> <abbr title=\"\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u041e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435\">\u041f\u041e<\/abbr> (\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 JS \u043a\u0430\u043a \u0440\u0430\u0437 \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u0435\u0441\u0442\u0438\u0441\u044c \u0432 \u0438\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u2013 \u043d\u0435 \u0442\u043e\u043c, \u0433\u0434\u0435 \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430).<\/p>\n<p>  \u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0440\u0430\u0437\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0439 \u044d\u0442\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430. \u041f\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f\u0441\u044c \u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044f \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c (\u0442.\u00a0\u043d. \u00ab\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u043c\u00bb) \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, CEF \u0432 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043b\u043e\u0434\u0438\u0442 \u0435\u0449\u0451 \u0438 <i>\u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435<\/i> \u2013 \u0435\u0441\u043b\u0438 \u0443\u043f\u0440\u043e\u0449\u0430\u0442\u044c, \u0442\u043e \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u0440\u043e\u0436\u0434\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0441\u0443\u0431\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0439, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435, \u0437\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432. \u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043d\u043e, \u0434\u043b\u044f \u043a\u0430\u043a\u0438\u0445 \u043d\u0443\u0436\u0434 \u0438 \u0442.\u00a0\u043f. \u2013 \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0445\u043e\u0434\u0438\u0442 \u0437\u0430 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u043d\u0435 \u044f\u0432\u043b\u044f\u044f\u0441\u044c \u0435\u0451 \u0446\u0435\u043b\u044c\u044e, \u2013 \u0432\u0430\u0436\u043d\u043e \u0443\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e <code>TDynamicSiteExtractor<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u0430 \u0435\u0441\u043b\u0438 \u0435\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0441\u0443\u0431\u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u043c \u043c\u0435\u0436\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043d\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 (\u0435\u0433\u043e, \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e, \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u2013 CEF \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435).<\/p>\n<p>  \u041b\u044e\u0431\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0415\u0441\u043b\u0438 Delphi-\u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, VCL- \u0438\u043b\u0438 FMX-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0442\u043e \u043f\u043e\u0434 \u00ab\u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u043c\u00bb \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c CEF \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d\u043e, \u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f, \u043a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0442\u043e\u0436\u0435 \u043f\u0443\u0442\u0451\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u043e\u0433\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 (\u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u0432 \u0414\u0438\u0441\u043f\u0435\u0442\u0447\u0435\u0440\u0435 \u0437\u0430\u0434\u0430\u0447 Windows \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u0412\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f); \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0443\u0436\u0435 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u043e\u0437\u0430\u0431\u043e\u0442\u0438\u043b\u0430\u0441\u044c CEF4Delphi.<\/p>\n<p>  <a name=\"DLL\"><\/a>\u041a\u043e\u0433\u0434\u0430 \u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 CEF \u0432 DLL, \u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0441 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0436\u0438\u0437\u043d\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u2013 \u0432\u0435\u0434\u044c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0438 \u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u043d\u0430\u0442\u044c \u043d\u0435 \u0437\u043d\u0430\u0435\u0442 \u043e CEF, \u0430 \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u0445, \u0431\u0435\u0437 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u0434\u043b\u044f \u0441\u0443\u0431\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435, \u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0443\u0436\u043d\u043e\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0434\u0438 \u044d\u0442\u043e\u0439 \u043e\u0434\u043d\u043e\u0439 \u0446\u0435\u043b\u0438; \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435, \u0432 \u043a\u043e\u0434\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0433\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e Delphi-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043f\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044e XPath, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0442 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0447\u0442\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u0441\u0445\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u0430\u043a:<\/p>\n<p>  <a name=\"XPathExists_scheme\"><\/a><\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/iu\/lr\/df\/iulrdfjnts-xkxyipgucos555d8.png\" alt=\"XPathExists: \u0441\u0445\u0435\u043c\u0430 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432\" width=\"700\" data-src=\"https:\/\/habrastorage.org\/webt\/iu\/lr\/df\/iulrdfjnts-xkxyipgucos555d8.png\"\/><\/div>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0438\u0435 \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0430\u0447\u0430\u0442\u044c \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043f\u0440\u0438\u0447\u0451\u043c \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f\u0441\u044c \u043b\u0438\u0448\u044c \u043d\u0430 \u043a\u043e\u0434\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u043c \u043d\u043e\u0432\u0438\u0437\u043d\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0437 \u043d\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u044f \u0443\u0436\u0435 <a href=\"#Pattern_of_waiting\">\u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443<\/a> \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0438. \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u0432 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043c\u0435\u0442\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u043c\u0435\u043d \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438, \u043e\u0441\u043e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0438\u0439\u0441\u044f: \u0437\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFChromiumCore.pas#L852\" rel=\"nofollow noopener noreferrer\">SendProcessMessage<\/a><\/code>, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFInterfaces.pas#L656\" rel=\"nofollow noopener noreferrer\">ICefProcessMessage<\/a><\/code>, \u043a\u0430\u043a\u043e\u0432\u043e\u0439 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0435\u043c (\u0440\u0435\u0447\u044c \u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0435 <code>Name<\/code>), \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c <code>ArgumentList<\/code>, \u0440\u043e\u043b\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u2013 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c. <code>ArgumentList<\/code> \u2013 \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c <i>\u0440\u0430\u0437\u043d\u043e\u0442\u0438\u043f\u043d\u044b\u0445<\/i> \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u043d\u0438\u043c; \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 XPath, \u043f\u043e\u0434\u043b\u0435\u0436\u0430\u0449\u0435\u0439 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0443, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"delphi\">var   CEFMessage: ICefProcessMessage; begin   ...   CEFMessage.ArgumentList.SetString(0, '\/\/some\/x\/path'); end;<\/code><\/pre>\n<p>  \u041a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435-\u043e\u0442\u0432\u0435\u0442, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0435 \u043e\u0442 \u0441\u0443\u0431\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u043c\u0443, \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0434\u043d\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u2013 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u043e\u0433\u043e XPath:<\/p>\n<pre><code class=\"delphi\">var   Answer: ICefProcessMessage; begin   ...   Answer.ArgumentList.SetBool(0, XPathEvalResult); end;<\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0438\u0440\u0435, \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0436\u0435 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 XPath \u043c\u043e\u0433\u0443\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f, \u043f\u0440\u0438\u0447\u0451\u043c \u0434\u0435\u043b\u043e \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u043e\u0442\u043e\u043a\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435, \u0430 \u0432\u0441\u0451 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0432 \u0438\u043d\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u2013 \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u0435\u0440\u044f\u0442\u044c \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0445, \u0432\u0441\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u0430 \u0432 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0445 \u043a\u043b\u0430\u0441\u0441 \u0438 \u0442\u0435\u043a\u0441\u0442. \u0422\u0430\u043a\u043e\u0439 \u043d\u044e\u0430\u043d\u0441 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 <code>ArgumentList<\/code> \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c (\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0431\u044b\u043b\u0430 \u043b\u0438 \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430), \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 (\u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c 0) \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0438\u043c\u043e\u0433\u043e \u0442\u0438\u043f\u0430:<\/p>\n<pre><code class=\"delphi\">TMessageSuccessfulness = (msOK, msException);<\/code><\/pre>\n<p>  \u0421\u043e\u0441\u0442\u0430\u0432 \u0436\u0435 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0441\u0442\u0430\u043d\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e:  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<th>\u0418\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/th>\n<th>\u0414\u0430\u043d\u043d\u044b\u0435 (\u043f\u0440\u0438 <code>msOK<\/code>)<\/th>\n<th>\u0414\u0430\u043d\u043d\u044b\u0435 (\u043f\u0440\u0438 <code>msException<\/code>)<\/th>\n<\/tr>\n<tr>\n<td>0<\/td>\n<td><code>msOK<\/code><\/td>\n<td><code>msException<\/code><\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f XPath (\u0442\u0438\u043f <code>Boolean<\/code>).<\/td>\n<td>\u041a\u043b\u0430\u0441\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0442\u0438\u043f <code>string<\/code>).<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td><\/td>\n<td>\u0422\u0435\u043a\u0441\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f (\u0442\u0438\u043f <code>string<\/code>).<\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0442\u0438\u043f <code>TMessageSuccessfulness<\/code> \u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>TDynamicSiteExtractor<\/code>, \u0442\u0430\u043a \u0438 \u0432 Delphi-\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c (\u0432 \u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0430\u0431\u0431\u0440\u0435\u0432\u0438\u0430\u0442\u0443\u0440\u0430 IPC \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 Inter-Process Communication):<\/p>\n<pre><code class=\"delphi\">unit CEF.IPC;  interface  type   TMessageSuccessfulness = (msOK, msException);  const   XPathMessageName = 'EvaluateXPath';    XPathIndex = 0;   SuccessfulnessIndex = 0;   ExceptionClassIndex = SuccessfulnessIndex + 1;   ExceptionTextIndex = ExceptionClassIndex + 1;   XPathResultIndex = ExceptionClassIndex;  implementation  end.<\/code><\/pre>\n<p>  <a href=\"#FLoadException\">\u0412\u044b\u0448\u0435<\/a> \u043f\u0440\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <code>RetrieveHTML<\/code> \u0431\u044b\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432 \u0437\u0430\u0449\u0438\u0442\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u043b\u044f, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0435 CEF-\u043f\u043e\u0442\u043e\u043a\u043e\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435; \u0437\u0434\u0435\u0441\u044c \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f \u2013 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a \u043f\u043e\u043b\u044e, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u043c\u0443 \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0432 \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435, \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0451 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 XPath. \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>TInterlocked<\/code>, \u0442\u043e <code>Boolean<\/code>-\u0442\u0438\u043f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u0440\u0438\u0431\u0435\u0433\u043d\u0443\u0442\u044c \u043a \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u043a\u0446\u0438\u0438, \u043e\u0431\u0435\u0440\u043d\u0443\u0432 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043d\u0435\u043c\u0443 \u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e:<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   strict private     ...     FMessageException: EExtractorException;      FXPathResult: Boolean;     FXPathResultGuard: TCriticalSection;      function GetXPathResult: Boolean;     procedure SetXPathResult(const Value: Boolean);   private     ...     property XPathResult: Boolean read GetXPathResult write SetXPathResult;   ...   end;  implementation  ...  function TDynamicSiteExtractor.GetXPathResult: Boolean; begin   FXPathResultGuard.Enter;   try     Result := FXPathResult;   finally     FXPathResultGuard.Leave;   end; end;  procedure TDynamicSiteExtractor.SetXPathResult(const Value: Boolean); begin   FXPathResultGuard.Enter;   try     FXPathResult := Value;   finally     FXPathResultGuard.Leave;   end; end;<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u0430 <code>doOnProcessMessageReceived<\/code> \u0441\u043e <a href=\"#XPathExists_scheme\">\u0441\u0445\u0435\u043c\u044b<\/a>, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435-\u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0441\u0443\u0431\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430:<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   protected     function doOnProcessMessageReceived(const browser: ICefBrowser;       const frame: ICefFrame; sourceProcess: TCefProcessId;       const aMessage: ICefProcessMessage): Boolean; override;   ...   end;  implementation  uses   ..., CEF.IPC;  ...  function TDynamicSiteExtractor.doOnProcessMessageReceived(const browser: ICefBrowser;   const frame: ICefFrame; sourceProcess: TCefProcessId;   const aMessage: ICefProcessMessage): Boolean; begin   Result := inherited;    if not Assigned(aMessage) then     Exit;    if aMessage.Name = XPathMessageName then   begin     case TMessageSuccessfulness( aMessage.ArgumentList.GetInt(SuccessfulnessIndex) ) of       msOK:         XPathResult := aMessage.ArgumentList.GetBool(XPathResultIndex);       msException:         TInterlocked.Exchange           (           FMessageException,           EExtractorException.CreateFmt             (               '...',               [               aMessage.ArgumentList.GetString(ExceptionClassIndex),               aMessage.ArgumentList.GetString(ExceptionTextIndex)               ]             )           );     end;      FMessageEvent.SetEvent;     Result := True;   end; end;<\/code><\/pre>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0448\u0435\u0441\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0434 <code>XPathExists<\/code>, \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0437\u0430\u0442\u0435\u0432\u0430\u043b\u0441\u044f \u0446\u0435\u043b\u044b\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b, \u044f\u0432\u0438\u0442 \u043c\u0438\u0440\u0443 \u043d\u0435\u043a\u0443\u044e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u044c, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u0440\u0430\u0442\u043e\u043a \u0438 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0437 \u0443\u0436\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   private     const       AnswerMessageTimeout = 3 * 1000;   ...   end;  implementation  uses   ..., uCEFProcessMessage;  ...  function TDynamicSiteExtractor.XPathExists(const XPath: string): Boolean; var   CEFMessage: ICefProcessMessage; begin   CEFMessage := TCefProcessMessageRef.New(XPathMessageName);   CEFMessage.ArgumentList.SetString(XPathIndex, XPath);    FMessageEvent.ResetEvent;   SendProcessMessage(PID_RENDERER, CEFMessage);   WaitFor(FMessageEvent, AnswerMessageTimeout);   CheckException(FMessageException);    Result := XPathResult; end;<\/code><\/pre>\n<p>  \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e <code>AnswerMessageTimeout<\/code> \u0437\u0430\u0434\u0430\u0451\u0442 \u043d\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u043b\u043e\u0441\u044c <a href=\"#RetrieveHTML_with_WaitTargetXPath\">\u0440\u0430\u043d\u0435\u0435<\/a> \u0432 <code>RetrieveHTML<\/code> \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443 <code>XPathTimeout<\/code>), \u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f XPath \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u2013 \u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u00ab\u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e\u00bb (\u0442.\u00a0\u0435. \u043d\u0438 \u043e \u043a\u0430\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u0434\u0430\u0436\u0435 \u0440\u0435\u0447\u0438 \u043d\u0435 \u0438\u0434\u0451\u0442), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441 \u0441\u0443\u0431\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c (\u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u043e\u0431\u0449\u0435 \u0430\u0432\u0430\u0440\u0438\u0439\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f-\u043e\u0442\u0432\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f).<\/p>\n<hr\/>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u0434, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u043c \u2013 \u0432 \u043d\u0451\u043c, \u043f\u0440\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0435 \u0443 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 (\u0447\u0442\u043e \u043e\u043d \u0438\u0437 \u0441\u0435\u0431\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0438 \u043a\u0430\u043a \u043d\u0443\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u2013 \u0432\u0441\u0435 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <a href=\"#Examples\">\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435<\/a> \u043f\u0440\u0438 \u0437\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u0435 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 Delphi-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0430 \u0437\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u043b\u0438\u0448\u044c \u043e\u0442\u0432\u043b\u0435\u043a\u0443\u0442 \u043e\u0442 \u0441\u0443\u0442\u0438). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0441\u0435\u0439\u0447\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0430-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043a\u0430\u043a \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u2013 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0442\u043e, \u0447\u0442\u043e \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u043c XPath.<\/p>\n<p>  \u0412 <a href=\"#evaluate\">\u0441\u0430\u043c\u043e\u043c \u043d\u0430\u0447\u0430\u043b\u0435 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430<\/a> \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432 \u0447\u0430\u0441\u0442\u0438 JavaScript \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>evaluate<\/code>, \u0430 \u0435\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f (\u043f\u043e\u0437\u0438\u0446\u0438\u044f XPath \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c <code>%s<\/code>):<\/p>\n<pre><code class=\"javascript\">document.evaluate('boolean(%s)', document, null, XPathResult.ANY_TYPE, null).booleanValue<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0442\u0443\u0442 \u0437\u0430 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0442\u0438\u043f\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/XPath\/Functions\/boolean\" rel=\"nofollow noopener noreferrer\">boolean<\/a><\/code>, \u043b\u043e\u0433\u0438\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0435\u0439 \u2013 \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0435\u0441\u043b\u0438 \u0432 \u0412\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 XPath \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u043d\u0430\u0431\u043e\u0440 \u0443\u0437\u043b\u043e\u0432, \u0430 \u043d\u0435\u043a\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a, \u043a\u0430\u043a \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c.<\/p>\n<p>  \u0415\u0449\u0451 \u043d\u0435\u043b\u0438\u0448\u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u043d\u044e\u0430\u043d\u0441\u0435 \u0441 \u043a\u0430\u0432\u044b\u0447\u043a\u0430\u043c\u0438, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: XPath \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u044b\u0445, \u0442\u0430\u043a \u0438 \u0434\u0432\u043e\u0439\u043d\u044b\u0445, \u043e\u0434\u043d\u0430\u043a\u043e JS \u0432\u044b\u0448\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u0442\u043e\u0440\u044b\u0445 (\u0438\u0431\u043e \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u0443\u0436\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u044b), \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u043d\u0430 XPath \u043f\u043e \u0447\u0430\u0441\u0442\u0438 \u043a\u0430\u0432\u044b\u0447\u0435\u043a, \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0447\u0435\u0433\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c \u0434\u0430\u0436\u0435 \u0438\u0445 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0438\u0435, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a \u2013 <code>\/\/table[@class=\"display discog\"]\/\/tr[@id='some_value']<\/code>. \u041e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u0437\u0430 \u044d\u043a\u0440\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f:<\/p>\n<pre><code class=\"delphi\">function EscapeQuotes(const UnsafeString: string): string; const   SingleQuote = '''';   DoubleQuote = '\"';   EscapeChar = '\\'; begin   Result := UnsafeString.     Replace(SingleQuote, EscapeChar + SingleQuote).     Replace(DoubleQuote, EscapeChar + DoubleQuote); end;<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0435 \u0431\u0440\u0430\u0442\u044c \u0432 \u0440\u0430\u0441\u0447\u0451\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u043e\u0431\u0433\u043e\u0432\u043e\u0440\u0451\u043d\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442 \u0438 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0435\u043d, \u0432 \u0441\u0432\u044f\u0437\u0438 \u0441 \u0447\u0435\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0440\u0430\u0437\u0443, \u0431\u0435\u0437 \u043f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e\u0439 \u0432\u044b\u0434\u0430\u0447\u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u043e \u0432\u0441\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435:<\/p>\n<p>  <a name=\"RenderProcessMessageReceivedHandler\"><\/a><\/p>\n<pre><code class=\"delphi\">uses   System.SysUtils,   uCEFConstants, uCEFInterfaces, uCEFTypes, uCEFProcessMessage,   CEF.IPC;  type   EJSException = class(Exception);  procedure RenderProcessMessageReceivedHandler(const pBrowser: ICefBrowser;   const pFrame: ICefFrame; uSourceProcess: TCefProcessId;   const pMessage: ICefProcessMessage; var aHandled: boolean);    function EscapeQuotes(const UnsafeString: string): string;   ...  const   JSTemplate = 'document.evaluate(''boolean(%s)'', document, null, XPathResult.ANY_TYPE, null).booleanValue'; var   XPath: string;    V8Context: ICefv8Context;   JSReturnValue: ICefv8Value;   JSException: ICefV8Exception;    Answer: ICefProcessMessage; begin   aHandled := False;    if not Assigned(pMessage) then     Exit;    if pMessage.Name = XPathMessageName then   begin     Answer := TCefProcessMessageRef.New(pMessage.Name);      try       Answer.ArgumentList.SetInt( SuccessfulnessIndex, Ord(msOK) );        XPath := EscapeQuotes( pMessage.ArgumentList.GetString(XPathIndex) );       V8Context := pFrame.GetV8Context;        if V8Context.Enter then         try           V8Context.Eval( Format(JSTemplate, [XPath]), '', 1, JSReturnValue, JSException );            if Assigned(JSException) then             raise EJSException.CreateFmt               (                 '...',                 [                 JSException.Message,                 JSException.SourceLine,                 JSException.LineNumber,                 JSException.StartPosition,                 JSException.EndPosition,                 JSException.StartColumn,                 JSException.EndColumn                 ]               );            Assert(JSReturnValue.IsBool);           Answer.ArgumentList.SetBool(XPathResultIndex, JSReturnValue.GetBoolValue);         finally           V8Context.Exit;         end       else         raise EJSException.Create('...');     except       on E: Exception do       begin         Answer.ArgumentList.Clear;         Answer.ArgumentList.SetInt( SuccessfulnessIndex, Ord(msException) );         Answer.ArgumentList.SetString(ExceptionClassIndex, E.ClassName);         Answer.ArgumentList.SetString(ExceptionTextIndex, E.Message);       end;     end;      pFrame.SendProcessMessage(PID_BROWSER, Answer);     aHandled := True;   end; end;<\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u043c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e <code>TDynamicSiteExtractor<\/code> \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u0447\u0442\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u043e\u0439.<\/p>\n<h4>\u0418\u0437\u0431\u0430\u0432\u043b\u044f\u044f\u0441\u044c \u043e\u0442 \u043b\u0438\u0448\u043d\u0435\u0433\u043e<\/h4>\n<p>  \u041d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043a\u0442\u043e-\u0442\u043e \u0438\u0437 \u0447\u0438\u0442\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0441\u0447\u0438\u0442\u0430\u043b \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u043c \u0442\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442: \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440, \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b, \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f \u0438\u0434\u0451\u0442 \u043e \u0441\u0430\u0439\u0442\u0430\u0445 \u2013 \u0432\u0435\u0449\u0438 \u0441\u0443\u0433\u0443\u0431\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0439, \u2013 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u043c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043a\u0430\u0441\u0430\u043b\u0441\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0443\u0434\u0430, \u043d\u0430 \u043a\u0430\u043a\u043e\u043c \u044d\u0442\u0430\u043f\u0435), \u0440\u0435\u0447\u044c \u0432\u0435\u043b\u0430\u0441\u044c \u043b\u0438\u0448\u044c \u043e\u0431 HTML-\u043a\u043e\u0434\u0435; \u0440\u0430\u0437\u0433\u0430\u0434\u043a\u0430 \u0437\u0434\u0435\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u0430 \u2013 \u043a\u0430\u043a\u0430\u044f \u0431\u044b \u0442\u043e \u043d\u0438 \u0431\u044b\u043b\u043e \u0432\u0438\u0437\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e-\u043d\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043f\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043f\u043e\u043b\u043d\u043e\u0439 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0440\u0435\u0448\u0430\u0435\u043c\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<p>  <a name=\"OSR_mode\"><\/a>\u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e CEF \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <a href=\"https:\/\/bitbucket.org\/chromiumembedded\/cef\/wiki\/GeneralUsage.md#markdown-header-off-screen-rendering\" rel=\"nofollow noopener noreferrer\">OSR-\u0440\u0435\u0436\u0438\u043c<\/a>, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0434\u043b\u044f \u041e\u0421 \u043e\u043a\u043d\u043e, \u043a\u0443\u0434\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441\u0430\u0439\u0442\u0430, \u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0432\u0441\u0451 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0432 \u043d\u0435\u043a\u0438\u0439 \u0431\u0443\u0444\u0435\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e, \u0441\u043a\u0430\u0436\u0435\u043c, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (JPEG, PNG \u0438 \u0442.\u00a0\u043f.), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0444\u0430\u0439\u043b, \u0438\u043b\u0438 \u0436\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043f\u043e \u0441\u0435\u0442\u0438. \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0436\u0435 \u043a\u043b\u0430\u0441\u0441, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c, \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0430\u0436\u0435 \u044d\u0442\u043e\u0433\u043e \u2013 \u0431\u0443\u0444\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u2013 \u0432\u0435\u0434\u044c \u043d\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b \u043b\u0438\u0448\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043d\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0420\u0430\u0437 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0435 \u0431\u0435\u0437\u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0435 \u043a \u0432\u043d\u0435\u0448\u043d\u0435\u043c\u0443 \u0432\u0438\u0434\u0443, \u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0435\u0449\u044c \u0432 \u043e\u0431\u0449\u0435\u043c-\u0442\u043e \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e (\u0431\u0435\u0437 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c <code>TDynamicSiteExtractor<\/code> \u043d\u0438\u0447\u0443\u0442\u044c \u043d\u0435 \u043f\u043e\u0441\u0442\u0440\u0430\u0434\u0430\u0435\u0442), \u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u0443\u044e \u2013 \u043d\u0435 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0443 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432\u0438\u0434\u0435\u043e, \u0448\u0440\u0438\u0444\u0442\u044b \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, CSS. \u0421 \u043f\u0435\u0440\u0432\u044b\u043c \u0438\u0437 \u00ab\u0440\u0430\u0441\u0441\u0442\u0440\u0435\u043b\u044c\u043d\u043e\u0433\u043e\u00bb \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u0447\u043a\u0443:<\/p>\n<pre><code class=\"delphi\">constructor TDynamicSiteExtractor.Create(AOwner: TComponent); begin   inherited;    ...   LoadImagesAutomatically := False; end;<\/code><\/pre>\n<p>  \u0418\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0436\u0435 \u043e\u0442 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0432 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u0430 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFResponseFilter.pas#L76\" rel=\"nofollow noopener noreferrer\">TCustomResponseFilter<\/a><\/code>, \u043f\u0440\u0438\u0447\u0451\u043c \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0438 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0445 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 (\u043e\u0442\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0438), \u0442\u043e \u0438 \u043f\u043e\u0442\u043e\u043c\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0434\u043d\u043e\u0433\u043e:<\/p>\n<pre><code class=\"delphi\">uses   ..., uCEFResponseFilter;  type   ...    TDynamicSiteExtractor = class(TChromium)   private     ...     type       TRejectionResponseFilter = class(TCustomResponseFilter)       protected         function Filter(data_in: Pointer; data_in_size: NativeUInt;           var data_in_read: NativeUInt; data_out: Pointer; data_out_size: NativeUInt;           var data_out_written: NativeUInt): TCefResponseFilterStatus; override;       end;   ...   end;  implementation  ...  function TDynamicSiteExtractor.TRejectionResponseFilter.Filter(data_in: Pointer;   data_in_size: NativeUInt; var data_in_read: NativeUInt;data_out: Pointer;   data_out_size: NativeUInt; var data_out_written: NativeUInt): TCefResponseFilterStatus; begin   Result := inherited;    data_in_read := 0;   data_out_written := 0; end;<\/code><\/pre>\n<p>  \u0410 \u0432\u043e\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440 \u043d\u0443\u0436\u043d\u043e \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435:<\/p>\n<pre><code class=\"delphi\">...    TDynamicSiteExtractor = class(TChromium)   ...   private     FFilter: TRejectionResponseFilter;     ...   protected     procedure doOnGetResourceResponseFilter(const browser: ICefBrowser;       const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse;       var aResponseFilter: ICefResponseFilter); override;   ...   end;  implementation  ...  constructor TDynamicSiteExtractor.Create(AOwner: TComponent); begin   inherited;    ...   FFilter := TRejectionResponseFilter.Create; end;  destructor TDynamicSiteExtractor.Destroy; begin   ...    inherited;    ...   FFilter.Free; end;  procedure TDynamicSiteExtractor.doOnGetResourceResponseFilter(const browser: ICefBrowser;   const frame: ICefFrame; const request: ICefRequest; const response: ICefResponse;   var aResponseFilter: ICefResponseFilter); begin   inherited;    case request.ResourceType of     RT_IMAGE,     RT_FONT_RESOURCE,     RT_MEDIA,     RT_FAVICON:       aResponseFilter := FFilter;     else       aResponseFilter := nil;   end; end;<\/code><\/pre>\n<p>  \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 <code>RT_IMAGE<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>LoadImagesAutomatically<\/code>, \u043f\u0440\u0438\u043c\u0435\u043d\u0451\u043d\u043d\u043e\u0435 \u0447\u0443\u0442\u044c \u0432\u044b\u0448\u0435 \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435, \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f; \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e \u0435\u0449\u0451 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFTypes.pas#L694\" rel=\"nofollow noopener noreferrer\">RT_STYLESHEET<\/a><\/code>, \u0435\u0441\u043b\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 CSS \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0445 \u0441\u0430\u0439\u0442\u0430\u0445 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.<\/p>\n<p>  <a name=\"InternetTools_realization\"><\/a><\/p>\n<h3>InternetTools<\/h3>\n<p>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f <a href=\"#IXQValue\">\u0437\u0430\u044f\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435<\/a> \u043d\u043e\u0432\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430 <code>IXQValue<\/code> \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u0442\u0430, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u043d\u0435 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043f\u043e\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u0445:<\/p>\n<pre><code class=\"delphi\">unit InternetTools.Realization;  interface  uses   simpleinternet, ...;  type   ...    TXQValue = class(TInterfacedObject, IXQValue, IXQValueEnumerator)   private     ...     function OpenDocument(const Source: WideString): IXQValue; safecall;   end;  implementation  ...  function TXQValue.OpenDocument(const Source: WideString): IXQValue; begin   FOriginalXQValue := process(Source, '\/node()');   Result := Self; end;<\/code><\/pre>\n<p>  <a name=\"Examples\"><\/a><\/p>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>  \u0414\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f <code>TDynamicSiteExtractor<\/code> \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0430 Delphi-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f <a href=\"https:\/\/disk.yandex.ru\/d\/2ovfjhoHrj33_A\" rel=\"nofollow noopener noreferrer\">\u0437\u0434\u0435\u0441\u044c<\/a>):<\/p>\n<ol>\n<li>VCL-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 \u043e\u0434\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u043e\u0439, \u0433\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430 (CEF4Delphi \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 FMX, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043d\u0435\u0441\u043b\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0430\u0442\u044c).<br \/> \n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ya\/1j\/_m\/ya1j_mcxcdfb95qfqoxbpbyaobm.png\" alt=\"\u0414\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\" width=\"360\" data-src=\"https:\/\/habrastorage.org\/webt\/ya\/1j\/_m\/ya1j_mcxcdfb95qfqoxbpbyaobm.png\"\/><\/div>\n<\/li>\n<li><a name=\"Subprocess_project\"><\/a>\u0421\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u043e\u0435 VCL-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u043d\u0438 \u0444\u043e\u0440\u043c, \u043d\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u2013 \u043d\u0430 \u0435\u0433\u043e \u0431\u0430\u0437\u0435 \u0441\u0442\u0430\u043d\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 CEF-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b. \u041a\u0430\u043a <a href=\"#DLL\">\u043f\u043e\u044f\u0441\u043d\u044f\u043b\u043e\u0441\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u0435<\/a>, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c CEF \u0432 DLL, \u0442\u043e \u0431\u0435\u0437 \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c, \u043e\u0434\u043d\u0430\u043a\u043e \u0430\u0432\u0442\u043e\u0440 \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442, \u043f\u0443\u0441\u0442\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439.<\/li>\n<\/ol>\n<p>  \u0414\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0435 \u043f\u043e\u0432\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u043e \u043d\u0430 \u0434\u0432\u0435 \u0447\u0430\u0441\u0442\u0438: \u043f\u0435\u0440\u0432\u0430\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0431\u0430 \u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u043b\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c CEF (\u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0445\u043e\u0442\u044c \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f, \u043d\u043e \u0431\u0443\u0434\u0443\u0442 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u043d\u0435\u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u044b), \u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u0437\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0438\u0432\u0448\u0435\u0433\u043e\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441 \u0444\u043e\u0440\u043c\u043e\u0439). \u041e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0441\u043e\u043e\u0442\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/my\/jr\/4x\/myjr4xnt6yisu0ocaneaeviwpju.png\" alt=\"\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043c\u043e\u0434\u0443\u043b\u0435\u0439\" width=\"500\" data-src=\"https:\/\/habrastorage.org\/webt\/my\/jr\/4x\/myjr4xnt6yisu0ocaneaeviwpju.png\"\/><\/div>\n<p>  <\/p>\n<h3>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f CEF<\/h3>\n<p>  \u0418\u0442\u0430\u043a, \u0447\u0442\u043e\u0431\u044b \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c <code>TDynamicSiteExtractor<\/code> \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0448\u0430\u0433\u0438 \u043f\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0432\u043e\u043f\u0440\u043e\u0441 \u043b\u0438\u0448\u044c \u0432 \u0442\u043e\u043c \u2013 \u043a\u043e\u0433\u0434\u0430:<\/p>\n<ul>\n<li>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0412\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u0439 CEF, \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0435\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0435, \u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0434\u0430\u043b\u0435\u0435 \u043a\u043e\u0434 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438 \u0441\u0442\u0430\u0440\u0442\u0435, \u0432 <i>dpr-\u0444\u0430\u0439\u043b\u0435<\/i> (\u0443\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c <a href=\"https:\/\/www.briskbard.com\/index.php?lang=en&amp;pageid=cef#firststeps\" rel=\"nofollow noopener noreferrer\">\u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0438\u0437 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 CEF4Delphi<\/a>).<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u043e\u0441\u0440\u0435\u0434\u043e\u0442\u043e\u0447\u0435\u043d \u043b\u0438\u0448\u044c \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0438\u0437 \u0444\u043e\u0440\u043c, \u0442\u043e \u043a\u043e\u0434 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u0435\u0451 \u0441\u043e\u0431\u044b\u0442\u0438\u0438 <code>OnCreate<\/code> (\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a).<\/li>\n<li>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0436\u0435 \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u043e\u0433\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044f CEF (\u0443\u0441\u043b\u043e\u0432\u043d\u043e \u0432 \u043d\u0435\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u0432\u0435\u0441\u044c\u043c\u0430 \u043d\u0435\u0447\u0430\u0441\u0442\u043e \u043d\u0443\u0436\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443) \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0443\u043c\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0432\u043e\u0432\u0441\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u0442\u043e \u0435\u0441\u0442\u044c \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043a\u043d\u043e\u043f\u043a\u0430).<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0434\u043e\u0431\u043d\u0430\u044f \u0449\u0435\u043f\u0435\u0442\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0441\u0435\u043a\u0443\u043d\u0434, \u043a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0438\u0432\u043e\u0434\u044f \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<p>  \u041e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFApplication.pas#L117\" rel=\"nofollow noopener noreferrer\">GlobalCEFApp<\/a><\/code> \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0451 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430:<\/p>\n<pre><code class=\"delphi\">uses   uCEFApplication;  procedure TfrMain.FormCreate(Sender: TObject); begin   GlobalCEFApp := TCefApplication.Create;    GlobalCEFApp.WindowlessRenderingEnabled := True;   GlobalCEFApp.BrowserSubprocessPath := 'CEFSubprocess.exe';    GlobalCEFApp.FrameworkDirPath := 'CEF';   GlobalCEFApp.ResourcesDirPath := 'CEF';   GlobalCEFApp.LocalesDirPath := 'CEF\\locales'; end;<\/code><\/pre>\n<p>  <\/p>\n<ul>\n<li><code>WindowlessRenderingEnabled<\/code> \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0440\u0435\u0436\u0438\u043c OSR, <a href=\"#OSR_mode\">\u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0432\u0448\u0438\u0439\u0441\u044f \u0440\u0430\u043d\u0435\u0435<\/a>, \u043e\u0431\u044f\u0437\u044b\u0432\u0430\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u0441\u0430\u0439\u0442\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/li>\n<li><code>BrowserSubprocessPath<\/code> \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0441\u0443\u0431\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0438 \u0437\u0430\u0434\u0430\u0451\u0442 \u043f\u0443\u0442\u044c \u043a \u043d\u0435\u043c\u0443 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2013 \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 <i>DemoApp.exe<\/i>).<\/li>\n<li>\u0415\u0441\u043b\u0438 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>FrameworkDirPath<\/code> \u0438 \u0434\u0432\u0430 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430, \u0442\u043e \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u0438\u0437 \u0441\u043e\u0441\u0442\u0430\u0432\u0430 CEF (\u043f\u0440\u043e \u043d\u0438\u0445 \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0451\u0442 \u0432 <a href=\"#CEF_files\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0435<\/a>) \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043e\u0437\u043b\u0435 <i>DemoApp.exe<\/i>, \u0441\u043e\u0437\u0434\u0430\u0432 \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0438\u0437\u0440\u044f\u0434\u043d\u0443\u044e \u0441\u0432\u0430\u043b\u043a\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0438\u0445 \u0441\u043a\u043b\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c.<\/li>\n<\/ul>\n<p>  \u0417\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFApplicationCore.pas#L395\" rel=\"nofollow noopener noreferrer\">StartMainProcess<\/a><\/code>, \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e \u043c\u043d\u043e\u0433\u043e\u043a\u0440\u0430\u0442\u043d\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0432\u0448\u0443\u044e\u0441\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2013 \u043e\u043d \u0432\u0435\u0440\u043d\u0451\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044f \u0432\u0441\u0435 \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438\u043c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f (\u0438\u043d\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043e\u0437\u043b\u043e\u0436\u0435\u043d\u043e \u043d\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0435 <code><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/blob\/1a9acbacd9522d43adf8bcb318be2311fb00f0aa\/source\/uCEFApplicationCore.pas#L587\" rel=\"nofollow noopener noreferrer\">OnContextInitialized<\/a><\/code>), \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043d\u0430\u044f <a href=\"#Pattern_of_waiting\">\u0441\u0445\u0435\u043c\u0430 \u0441 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435\u043c<\/a>:<\/p>\n<pre><code class=\"delphi\">uses   ..., System.SyncObjs;  procedure TfrMain.FormCreate(Sender: TObject); var   Event: TEvent; begin   GlobalCEFApp := TCefApplication.Create;    ...    GlobalCEFApp.OnContextInitialized :=     procedure     begin       Event.SetEvent;     end;    Event := TEvent.Create;   try     GlobalCEFApp.StartMainProcess;     Assert(Event.WaitFor = wrSignaled);   finally     GlobalCEFApp.OnContextInitialized := nil;     Event.Free;   end; end;<\/code><\/pre>\n<p>  \u0418 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u044b <code>TDynamicSiteExtractor<\/code>. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0442\u043e \u043e\u043d\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<pre><code class=\"delphi\">procedure TfrMain.FormDestroy(Sender: TObject); begin   DestroyGlobalCEFApp; end;<\/code><\/pre>\n<p>  \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 <a href=\"#Subprocess_project\">\u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432<\/a> \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u0441\u0445\u043e\u0436\u0430, \u0441 \u0442\u0435\u043c \u043b\u0438\u0448\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u0442\u043b\u0438\u0447\u0438\u0435\u043c, \u0447\u0442\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0432 dpr-\u0444\u0430\u0439\u043b\u0435 (\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b <code>RenderProcessMessageReceivedHandler<\/code> \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c <a href=\"#RenderProcessMessageReceivedHandler\">\u0440\u0430\u043d\u0435\u0435<\/a>):<\/p>\n<pre><code class=\"delphi\">program CEFSubprocess;  uses   ..., uCEFApplicationCore;  ...  procedure RenderProcessMessageReceivedHandler(const pBrowser: ICefBrowser;   const pFrame: ICefFrame; uSourceProcess: TCefProcessId;   const pMessage: ICefProcessMessage; var aHandled: boolean); ...  begin   GlobalCEFApp := TCefApplicationCore.Create;    GlobalCEFApp.WindowlessRenderingEnabled := True;   GlobalCEFApp.OnProcessMessageReceived := RenderProcessMessageReceivedHandler;    GlobalCEFApp.FrameworkDirPath := 'CEF';   GlobalCEFApp.ResourcesDirPath := 'CEF';   GlobalCEFApp.LocalesDirPath := 'CEF\\locales';    GlobalCEFApp.StartSubProcess;   DestroyGlobalCEFApp; end.<\/code><\/pre>\n<p>  \u0412\u0430\u0436\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 <code>WindowlessRenderingEnabled<\/code>, <code>FrameworkDirPath<\/code> \u0438 \u0434\u0432\u0443\u0445 \u043e\u0441\u0442\u0430\u0432\u0448\u0438\u0445\u0441\u044f \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u043b\u0438 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043e \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h3>\u0421\u0431\u043e\u0440\u043a\u0430 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a<\/h3>\n<p>  <\/p>\n<ol>\n<li>\u041f\u0440\u0435\u0436\u0434\u0435 \u0432\u0441\u0435\u0433\u043e, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/releases\/latest\" rel=\"nofollow noopener noreferrer\">\u0441\u043a\u0430\u0447\u0430\u0442\u044c<\/a> \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c CEF4Delphi, \u0441\u043b\u0435\u0434\u0443\u044f <a href=\"https:\/\/www.briskbard.com\/index.php?lang=en&amp;pageid=cef#installation\" rel=\"nofollow noopener noreferrer\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/a> (\u043e\u0434\u043d\u0430\u043a\u043e \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u043d\u044e\u0430\u043d\u0441: \u0441\u0432\u0435\u0436\u0438\u0435 \u0432\u044b\u043f\u0443\u0441\u043a\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e Windows 10 \u0438 \u043d\u043e\u0432\u0435\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u043d\u0430 \u0438\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u041e\u0421, \u043d\u0443\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 <a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi#links\" rel=\"nofollow noopener noreferrer\">\u0434\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u0434\u0435\u043b\u043e\u043c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>; \u0432 \u044d\u0442\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0438 \u0432\u0438\u043d\u043e\u0432\u0430\u0442\u0430 \u043d\u0435 CEF4Delphi, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u0442\u044c, \u0430 <a href=\"https:\/\/support.google.com\/chrome\/thread\/185534985\/sunsetting-support-for-windows-7-8-8-1-and-windows-server-2012-and-2012-r2-in-early-2023?hl=en\" rel=\"nofollow noopener noreferrer\">\u0441\u0430\u043c \u043f\u0440\u043e\u0435\u043a\u0442 Chromium<\/a>).<\/li>\n<li>\u041e\u0442\u043a\u0440\u044b\u0442\u044c <i><a href=\"https:\/\/disk.yandex.ru\/d\/2ovfjhoHrj33_A\" rel=\"nofollow noopener noreferrer\">HabrArticle.groupproj<\/a><\/i> \u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (\u0432 \u043b\u044e\u0431\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435), \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432 \u043f\u0430\u043f\u043a\u0435 <i>VCL-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\\Win64\\Debug<\/i> \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u044f\u0432\u0438\u0442\u044c\u0441\u044f \u0434\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u0430 \u2013 <i>DemoApp.exe<\/i> \u0438 <i>CEFSubprocess.exe<\/i>.<\/li>\n<li><a name=\"CEF_files\"><\/a><a href=\"https:\/\/github.com\/salvadordf\/CEF4Delphi\/releases\/latest\" rel=\"nofollow noopener noreferrer\">\u0421\u043a\u0430\u0447\u0430\u0442\u044c<\/a> \u043d\u0430\u0431\u043e\u0440 64-\u0440\u0430\u0437\u0440\u044f\u0434\u043d\u044b\u0445 CEF-\u0444\u0430\u0439\u043b\u043e\u0432 (\u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u044f \u043f\u0440\u043e \u0440\u0435\u043c\u0430\u0440\u043a\u0443 \u043e \u0432\u0435\u0440\u0441\u0438\u0438 Windows \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u043f\u0443\u043d\u043a\u0442\u0435) \u0438 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 <a href=\"https:\/\/www.briskbard.com\/index.php?lang=en&amp;pageid=cef#builddemo\" rel=\"nofollow noopener noreferrer\">\u044d\u0442\u0438\u043c\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f\u043c\u0438<\/a>, \u0432 \u043f\u0430\u043f\u043a\u0443 <i>VCL-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\\Win64\\Debug\\CEF<\/i>.<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <i>DemoApp.exe<\/i>.<\/li>\n<\/ol>\n<\/div>\n<\/div>\n<\/div>\n<p> <!----> <!----><\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/739728\/\"> https:\/\/habr.com\/ru\/articles\/739728\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u0417\u0430\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441 <i>\u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e<\/i> \u0441\u0430\u0439\u0442\u0430 \u2013 \u044d\u0442\u043e \u043d\u0435 \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0440\u0435\u0434\u043a\u0430\u044f, \u043d\u043e \u0432\u0441\u0451 \u0436\u0435 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u0442\u0430\u0442\u044c\u044f (\u0431\u0435\u0437 \u043f\u043e\u043a\u0438\u0434\u0430\u043d\u0438\u044f, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0443\u044e\u0442\u043d\u044b\u0445 \u0440\u0430\u043c\u043e\u043a Delphi); \u043f\u043e\u0434 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0432\u0442\u043e\u0440 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0430\u0439\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 JavaScript (\u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0430\u043b\u0438\u044f\u0445 \u043d\u0430\u0439\u0442\u0438 \u0440\u0435\u0441\u0443\u0440\u0441 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u043e), \u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c \u043e\u0442 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043f\u043e\u044f\u0432\u043b\u044f\u044f\u0441\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0438 JS-\u043a\u043e\u0434\u0430, \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0438\u0445, \u043b\u0438\u0431\u043e \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043d\u0443\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0442 \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u043b\u0441\u044f \u0441 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439, \u0442\u043e \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0435 \u0441\u0436\u0430\u0442\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043c\u0430\u043b\u043e\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0431\u0440\u0430\u0442\u0438\u043c\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u2013 \u043f\u0443\u0441\u0442\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0430\u043b\u044c\u0431\u043e\u043c\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 <a href=\"https:\/\/www.metal-archives.com\/bands\/Vader\/145\" rel=\"nofollow noopener noreferrer\">\u0433\u0440\u0443\u043f\u043f\u044b \u0441 metal-archives.com<\/a>:  <\/p>\n<div style=\"text-align:center;\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/n5\/ax\/fe\/n5axfe10plzx-vgm8ib7bzormae.jpeg\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430\" width=\"700\" data-src=\"https:\/\/habrastorage.org\/webt\/n5\/ax\/fe\/n5axfe10plzx-vgm8ib7bzormae.jpeg\" data-blurred=\"true\"\/><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-350189","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/350189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=350189"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/350189\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=350189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=350189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=350189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}