aboutsummaryrefslogtreecommitdiff
path: root/files/ru/mozilla/projects
diff options
context:
space:
mode:
authorPeter Bengtsson <mail@peterbe.com>2020-12-08 21:46:22 -0500
committerPeter Bengtsson <mail@peterbe.com>2020-12-08 21:46:22 -0500
commita065e04d529da1d847b5062a12c46d916408bf32 (patch)
treefe0f8bcec1ff39a3c499a2708222dcf15224ff70 /files/ru/mozilla/projects
parent218934fa2ed1c702a6d3923d2aa2cc6b43c48684 (diff)
downloadtranslated-content-a065e04d529da1d847b5062a12c46d916408bf32.tar.gz
translated-content-a065e04d529da1d847b5062a12c46d916408bf32.tar.bz2
translated-content-a065e04d529da1d847b5062a12c46d916408bf32.zip
update based on https://github.com/mdn/yari/issues/2028
Diffstat (limited to 'files/ru/mozilla/projects')
-rw-r--r--files/ru/mozilla/projects/emscripten/index.html37
-rw-r--r--files/ru/mozilla/projects/index.html14
-rw-r--r--files/ru/mozilla/projects/nss/nss_sample_code/index.html33
-rw-r--r--files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html255
-rw-r--r--files/ru/mozilla/projects/nss/reference/fc_login/index.html53
-rw-r--r--files/ru/mozilla/projects/nss/reference/index.html161
-rw-r--r--files/ru/mozilla/projects/webreplay/index.html217
7 files changed, 0 insertions, 770 deletions
diff --git a/files/ru/mozilla/projects/emscripten/index.html b/files/ru/mozilla/projects/emscripten/index.html
deleted file mode 100644
index 9c3777e2f5..0000000000
--- a/files/ru/mozilla/projects/emscripten/index.html
+++ /dev/null
@@ -1,37 +0,0 @@
----
-title: Emscripten
-slug: Mozilla/Projects/Emscripten
-translation_of: Mozilla/Projects/Emscripten
----
-<p><span class="seoSummary">Emscripten </span>—<span class="seoSummary"> это транслятор LLVM в JavaScript. Он берёт LLVM байткод (полученный, к примеру, из исходного кода на C++ с помощью Clang) и преобразует его в JavaScript, который можно в дальнейшем  использовать в интернете.</span></p>
-
-<div class="warning">
-<p><strong>Важное замечание</strong>: Эта страница содержит краткое описание того, что такое Emscripten. Для этого, чтобы начать работу с Emscripten, воспользуйтесь <a href="http://kripken.github.io/emscripten-site/index.html/">официальной Emscripten WIki</a>.</p>
-</div>
-
-<p>С помощью Emscripten можно:</p>
-
-<ul>
- <li>Преобразовывать код на C и C++ в код на JavaScript.</li>
- <li>Преобразовать в JavaScript код на любом другом языке, который может быть транслирован в LLVM-байткод.</li>
- <li>Преобразовать среды исполнения других языков, написанные на C/C++, и запустить код, написанный на этих языках (это уже делалось для Python и Lua)!</li>
-</ul>
-
-<p>Emscripten позволяет сделать нативный код доступным для использования в Web: платформа, базирующаяся на стандартах, имеет независимые совместимые реализации и запускается везде, с персональных компьютеров до iPad. </p>
-
-<p>Используя Emscripten, разработчики C/C++ могут избежать портирования кода вручную на JavaScript - и даже избежать изучения JavaScript вовсе. Web-разработчики тоже выигрывают, так как они могут использовать много тысяч существующих нативных утилит и библиотек на своих сайтах.</p>
-
-<p>Практически любой переносимый код на C и C++ может быть скомпилирован в JavaScript c использованием Emscripten, начиная с высокопроизводительных игр, которые требуют прорисовки графики, проигрывают звуки и загружают и обрабатывают файлы, и заканчивая фреймворками для создания приложений, например, Qt.</p>
-
-<p>Emscripten генерирует быстрый код, его формат по-умолчанию — <a href="/en-US/docs/Games/Tools/asm.js">asm.js</a>, высокооптимизируемое подмножество JavaScript, которое во многих случаях может исполняться со скоростью, близкой к нативной.</p>
-
-<div class="note">
-<p><strong>Заметка</strong>: Звучит интересно? <a href="http://kripken.github.io/emscripten-site/docs/introducing_emscripten/about_emscripten.html">Прочитайте больше о Emscripten и посмотртите некоторые примеры</a>, или <a href="http://kripken.github.io/emscripten-site/docs/getting_started/index.html">начните использовать его прямо сейчас</a>.</p>
-</div>
-
-<h2 id="Other_articles_of_interest_on_MDN">Other articles of interest on MDN</h2>
-
-<ul>
- <li>Our <a href="/en-US/docs/Games">Games zone</a> contains some useful content related to games development, which is a common area of use for Emscripten.</li>
- <li>Our <a href="/en-US/docs/Mozilla/Projects/Emscripten/Techniques">Emscripten techniques</a> page is a place to store useful Emscripten-related ideas that haven't made it onto the Emscripten Wiki.</li>
-</ul>
diff --git a/files/ru/mozilla/projects/index.html b/files/ru/mozilla/projects/index.html
deleted file mode 100644
index c1e43934a2..0000000000
--- a/files/ru/mozilla/projects/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: Projects
-slug: Mozilla/Projects
-tags:
- - Mozilla
- - NeedsContent
- - NeedsTranslation
- - Projects
- - TopicStub
-translation_of: Mozilla/Projects
----
-<p>{{ draft() }}</p>
-<p>Below you'll find links to documentation about various Mozilla projects; these are often parts of Firefox or other products, but may also be used in other projects as well.</p>
-<p>{{ LandingPageListSubpages() }}</p>
diff --git a/files/ru/mozilla/projects/nss/nss_sample_code/index.html b/files/ru/mozilla/projects/nss/nss_sample_code/index.html
deleted file mode 100644
index 2bc6d0e4fc..0000000000
--- a/files/ru/mozilla/projects/nss/nss_sample_code/index.html
+++ /dev/null
@@ -1,33 +0,0 @@
----
-title: NSS Sample Code
-slug: Mozilla/Projects/NSS/NSS_Sample_Code
-tags:
- - Example
- - NeedsTranslation
- - TopicStub
-translation_of: Mozilla/Projects/NSS/NSS_Sample_Code
----
-<h2 id="NSS_Sample_Code">NSS Sample Code</h2>
-
-<p>The collection of sample code here demonstrates how NSS can be used for cryptographic operations, certificate handling, SSL, etc. It also demonstrates some best practices in the application of cryptography.</p>
-
-<p>Old samples in the process of being replaced.</p>
-
-<ol>
- <li><a href="nss_sample_code/NSS_Sample_Code_Sample1">Sample Code 1: Key Generation and Transport Between Servers</a></li>
- <li><a href="nss_sample_code/NSS_Sample_Code_sample2">Sample Code 2: Symmetric Encryption</a></li>
- <li><a href="nss_sample_code/NSS_Sample_Code_sample3">Sample Code 3: Hashing, MAC</a></li>
- <li><a href="nss_sample_code/NSS_Sample_Code_sample4">Sample Code 4: PKI Encryption</a></li>
- <li><a href="nss_sample_code/NSS_Sample_Code_sample5">Sample Code 5: PKI Encryption with a raw public &amp; private key in DER format</a></li>
- <li><a href="nss_sample_code/NSS_Sample_Code_sample6">Sample Code 6: Persistent Symmetric Keys in NSS database</a></li>
-</ol>
-
-<p><br>
- These are very old examples in need of replacement. See <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=490238">https://bugzilla.mozilla.org/show_bug.cgi?id=490238</a></p>
-
-<p>You are welcome to download the new samples via:</p>
-
-<pre class="bz_comment_text" id="comment_text_42">hg clone https://hg.mozilla.org/projects/nss; cd nss; hg update SAMPLES_BRANCH
-</pre>
-
-<p>The new samples: <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/New_NSS_Samples">https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/New_NSS_Samples</a></p>
diff --git a/files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html b/files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html
deleted file mode 100644
index d3a5983c84..0000000000
--- a/files/ru/mozilla/projects/nss/nss_sample_code/nss_sample_code_sample_2_initialization_of_nss/index.html
+++ /dev/null
@@ -1,255 +0,0 @@
----
-title: NSS Sample Code Sample_2_Initialization of NSS
-slug: >-
- Mozilla/Projects/NSS/NSS_Sample_Code/NSS_Sample_Code_Sample_2_Initialization_of_NSS
-tags:
- - Example
- - Mozilla firefox nss init
- - NSS
- - Security
- - Инициализация NSS
- - Пример
-translation_of: >-
- Mozilla/Projects/NSS/NSS_Sample_Code/NSS_Sample_Code_Sample_2_Initialization_of_NSS
----
-<h2 id="NSS_Sample_Code_2_Initializing_NSS">NSS Sample Code 2: Initializing NSS</h2>
-
-<p>Эта программа демонстрирует как инициализировать NSS Database. Так же эта программа иллюстрирует обработку пароля.</p>
-
-<h3 id="Пример_NSS_инициализации_и_обработки_пароля">Пример NSS инициализации и обработки пароля</h3>
-
-<pre>/* NSPR Заголовки*/
-#include &lt;prthread.h&gt;
-#include &lt;plgetopt.h&gt;
-#include &lt;prprf.h&gt;
-
-/* NSS Заголовки */
-#include &lt;nss.h&gt;
-#include &lt;pk11func.h&gt;
-
-#include "util.h"
-
-// для того, чтобы русские буквы отображались корректно используйте setlocale(LC_ALL,"RUS") в main() :)
-
-/* Вывести сообщение о том, какая база данных используется и выйти */
-static void Usage(const char *progName)
-{
- fprintf(stderr, "\nИспользуется: %s -d &lt;dbdirpath&gt; [-p &lt;plainpasswc&gt;]"
- " [-f &lt;passwdffile&gt;]\n\n",
- progName);
- fprintf(stderr, "%-15s Укажите путь к каталогу базы данных\n\n",
- "-d &lt;dbdirpath&gt;");
- fprintf(stderr, "%-15s Укажите незашифрованный пароль\n\n",
- "-p &lt;plainpasswc&gt;");
- fprintf(stderr, "%-15s Укажите файл с паролями\n\n",
- "-f &lt;plainpasswc&gt;");
- exit(-1);
-}
-
-/* Инициализация пароля слота*/
-char *InitSlotPassword(PK11SlotInfo *slot, PRBool retry, void *arg)
-{
- FILE *input;
- FILE *output;
- char *p0 = NULL;
- char *p1 = NULL;
- secuPWData *pwdata = (secuPWData *) arg;
-
- if (pwdata-&gt;source == PW_FROMFILE) {
- return FilePasswd(slot, retry, pwdata-&gt;data);
- }
- if (pwdata-&gt;source == PW_PLAINTEXT) {
- return PL_strdup(pwdata-&gt;data);
- }
-
- /* Открыть терминал (linux)*/
- input = fopen("/dev/tty", "r");
- if (input == NULL) {
- PR_fprintf(PR_STDERR, "Ошибка открытия терминала для чтения\n");
- return NULL;
- }
-
- /* У нас нет паролей, давайте инициализируем базу данных*/
- PR_fprintf(PR_STDERR,
- "Введите пароль который будет закодирован вашим ключом.\n"
- "Пароль должен быть длиннее восьми символов ,\n"
- "И содержать хотя бы одну букву из алфавита.\n\n");
-
- output = fopen("/dev/tty", "w");
- if (output == NULL) {
- PR_fprintf(PR_STDERR, "Ошибка открытия консоли для записи\n");
- return NULL;
- }
-
- for (;;) {
- if (p0)
- PORT_Free(p0);
- p0 = GetPassword(input, output, "Введите новый пароль: ",
- CheckPassword);
- if (p1)
- PORT_Free(p1);
- p1 = GetPassword(input, output, "Введите пароль повторно: ",
- CheckPassword);
- if (p0 &amp;&amp; p1 &amp;&amp; !PORT_Strcmp(p0, p1)) {
- break;
- }
- PR_fprintf(PR_STDERR, "Пароли не совпадают. Попробуйте ещё раз.\n");
- }
-
- /* Убрать дубликат пароля из строки*/
- if (p1) {
- PORT_Memset(p1, 0, PORT_Strlen(p1));
- PORT_Free(p1);
- }
- fclose(input);
- fclose(output);
-
- return p0;
-}
-
-/* Смена пароля */
-SECStatus ChangePW(PK11SlotInfo *slot, char *oldPass, char *newPass,
- char *oldPwFile, char *newPwFile)
-{
- SECStatus rv;
- secuPWData pwdata;
- secuPWData newpwdata;
- char *oldpw = NULL;
- char *newpw = NULL;
-
- if (oldPass) {
- pwdata.source = PW_PLAINTEXT;
- pwdata.data = oldPass;
- } else if (oldPwFile) {
- pwdata.source = PW_FROMFILE;
- pwdata.data = oldPwFile;
- } else {
- pwdata.source = PW_NONE;
- pwdata.data = NULL;
- }
-
- if (newPass) {
- newpwdata.source = PW_PLAINTEXT;
- newpwdata.data = newPass;
- } else if (newPwFile) {
- newpwdata.source = PW_FROMFILE;
- newpwdata.data = NULL;
- } else {
- newpwdata.source = PW_NONE;
- newpwdata.data = NULL;
- }
-
- if (PK11_NeedUserInit(slot)) {
- newpw = InitSlotPassword(slot, PR_FALSE, &amp;pwdata);
- rv = PK11_InitPin(slot, (char*)NULL, newpw);
- }
- else {
- for (;;) {
- oldpw = GetModulePassword(slot, PR_FALSE, &amp;pwdata);
-
- if (PK11_CheckUserPassword(slot, oldpw) != SECSuccess) {
- if (pwdata.source == PW_NONE) {
- PR_fprintf(PR_STDERR, "Invalid password. Try again.\n");
- } else {
- PR_fprintf(PR_STDERR, "Invalid password.\n");
- PORT_Memset(oldpw, 0, PL_strlen(oldpw));
- PORT_Free(oldpw);
- return SECFailure;
- }
- } else {
- break;
- }
- PORT_Free(oldpw);
- }
- newpw = InitSlotPassword(slot, PR_FALSE, &amp;newpwdata);
-
- if (PK11_ChangePW(slot, oldpw, newpw) != SECSuccess) {
- PR_fprintf(PR_STDERR, "Не получилось изменить пароль.\n");
- return SECFailure;
- }
- PORT_Memset(oldpw, 0, PL_strlen(oldpw));
- PORT_Free(oldpw);
- PR_fprintf(PR_STDOUT, "Пароль изменён успешно!.\n");
- }
- PORT_Memset(newpw, 0, PL_strlen(newpw));
- PORT_Free(newpw);
- return SECSuccess;
-}
-
-/*
- * Этот пример показывает как инициализировать nss базу данных.
- * Он создаёт новую nss конфигурационную директорию с пустой базой данных
- * и инициализирует базы данных. Так же он показывает методы
- * для обработки пароля.
- */
-int main(int argc, char **argv)
-{
- PLOptState *optstate;
- PLOptStatus status;
- SECStatus rv;
- SECStatus rvShutdown;
- char *slotname = "internal";
- PK11SlotInfo *slot = NULL;
- char *dbdir = NULL;
- char *plainPass = NULL;
- char *pwFile = NULL;
-
- char * progName = strrchr(argv[0], '/');
- progName = progName ? progName + 1 : argv[0];
-
- /* Копирование аргументов командной строки */
- optstate = PL_CreateOptState(argc, argv, "d:p:q:f:g:");
- while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) {
- switch (optstate-&gt;option) {
- case 'd':
- dbdir = strdup(optstate-&gt;value);
- break;
- case 'p':
- plainPass = strdup(optstate-&gt;value);
- break;
- case 'f':
- pwFile = strdup(optstate-&gt;value);
- break;
- default:
- Usage(progName);
- break;
- }
- }
- PL_DestroyOptState(optstate);
-
- if (!dbdir)
- Usage(progName);
-
- PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0);
-
- /* Создать базу данных */
- rv = NSS_InitReadWrite(dbdir);
- if (rv != SECSuccess) {
- PR_fprintf(PR_STDERR, "NSS_Initialize Failed ( не получилось инициализировать nss )");
- PR_Cleanup();
- exit(rv);
- }
-
- if (PL_strcmp(slotname, "internal") == 0)
- slot = PK11_GetInternalKeySlot();
-
- /* Если создаётся новая база данных, инициализируем пароль.*/
- rv = ChangePW(slot, plainPass, 0, pwFile, 0);
- if (rv != SECSuccess) {
- PR_fprintf(PR_STDERR, "Не получилось сменить пароль\n");
- }
-
- if (slot) {
- PK11_FreeSlot(slot);
- }
- rvShutdown = NSS_Shutdown();
- if (rvShutdown != SECSuccess) {
- PR_fprintf(PR_STDERR, "Failed : NSS_Shutdown() ( ошибка : выключение nss )\n");
- rv = SECFailure;
- }
-
- PR_Cleanup();
-
- return rv;
-}
-&lt;/plainpasswc&gt;&lt;/plainpasswc&gt;&lt;/dbdirpath&gt;&lt;/passwdffile&gt;&lt;/plainpasswc&gt;&lt;/dbdirpath&gt;&lt;/pk11func.h&gt;&lt;/nss.h&gt;&lt;/prprf.h&gt;&lt;/plgetopt.h&gt;&lt;/prthread.h&gt;</pre>
diff --git a/files/ru/mozilla/projects/nss/reference/fc_login/index.html b/files/ru/mozilla/projects/nss/reference/fc_login/index.html
deleted file mode 100644
index 5842a77b23..0000000000
--- a/files/ru/mozilla/projects/nss/reference/fc_login/index.html
+++ /dev/null
@@ -1,53 +0,0 @@
----
-title: FC_Login
-slug: Mozilla/Projects/NSS/Reference/FC_Login
-translation_of: Mozilla/Projects/NSS/Reference/FC_Login
----
-<p>
-</p>
-<h3 id="Name" name="Name"> Name </h3>
-<p><code>FC_Login()</code> - log a user into a token.
-</p>
-<h3 id="Syntax" name="Syntax"> Syntax </h3>
-<pre class="eval"><a href="en/CK_RV">CK_RV</a> FC_Login(
- <a href="en/CK_SESSION_HANDLE">CK_SESSION_HANDLE</a> hSession,
- <a href="en/CK_USER_TYPE">CK_USER_TYPE</a> userType,
- <a href="en/CK_CHAR">CK_CHAR_PTR</a> pPin,
- <a href="en/CK_ULONG">CK_ULONG</a> ulPinLen
-);
-</pre>
-<h3 id="Parameters" name="Parameters"> Parameters </h3>
-<p><code>FC_Login()</code> takes four parameters:
-</p>
-<dl><dt><code>hSession</code>
-</dt><dd>{{ mediawiki.external('in') }} a session handle
-</dd><dt><code>userType</code>
-</dt><dd>{{ mediawiki.external('in') }} the user type (<code>CKU_SO</code> or <code>CKU_USER</code>)
-</dd><dt><code>pPin</code>
-</dt><dd>{{ mediawiki.external('in') }} a pointer that points to the user's PIN
-</dd><dt><code>ulPinLen</code>
-</dt><dd>{{ mediawiki.external('in') }} the length of the PIN
-</dd></dl>
-<h3 id="Description" name="Description"> Description </h3>
-<p><code>FC_Login()</code> logs a user into a token.
-</p><p>The Security Officer (<code>CKU_SO</code>) only logs in to initialize the normal user's PIN. The SO PIN is the empty string. The NSS cryptographic module doesn't allow the SO to log in if the normal user's PIN is already initialized.
-</p>
-<h3 id="Return_value" name="Return_value"> Return value </h3>
-<p><code>FC_Login()</code> returns the following return codes.
-</p>
-<ul><li> <code>CKR_OK</code>: the user logged in successfully.
-</li><li> <code>CKR_DEVICE_ERROR</code>: the token is in the Error state.
-</li><li> <code>CKR_HOST_MEMORY</code>: memory allocation failed.
-</li><li> <code>CKR_PIN_INCORRECT</code>: the PIN is incorrect.
-</li><li> <code>CKR_PIN_LEN_RANGE</code>: the PIN is too long (<code>ulPinLen</code> is greater than 255).<div class="note">The function should return <code>CKR_PIN_INCORRECT</code> in this case.</div>
-</li><li> <code>CKR_SESSION_HANDLE_INVALID</code>: the session handle is invalid.
-</li><li> <code>CKR_USER_ALREADY_LOGGED_IN</code>: the user is already logged in.
-</li><li> <code>CKR_USER_TYPE_INVALID</code>
-<ul><li> The token can't authenticate the user because there is no key database or the user's password isn't initialized.
-</li><li> <code>userType</code> is <code>CKU_SO</code> and the normal user's PIN is already initialized.
-</li></ul>
-</li></ul>
-<h3 id="See_also" name="See_also"> See also </h3>
-<ul><li> <a href="en/NSC_Login">NSC_Login</a>
-</li></ul>
-{{ languages( { "ja": "ja/FC_Login" } ) }}
diff --git a/files/ru/mozilla/projects/nss/reference/index.html b/files/ru/mozilla/projects/nss/reference/index.html
deleted file mode 100644
index fefd88af2a..0000000000
--- a/files/ru/mozilla/projects/nss/reference/index.html
+++ /dev/null
@@ -1,161 +0,0 @@
----
-title: NSS reference
-slug: Mozilla/Projects/NSS/Reference
-tags:
- - NSS
- - NeedsTranslation
- - TopicStub
-translation_of: Mozilla/Projects/NSS/Reference
----
-<p>  </p>
-<h3 id="Initial_Notes" name="Initial_Notes">Initial Notes</h3>
-<div class="note">
- <ul>
- <li>We are migrating the <a class="external" href="https://developer.mozilla.org/NSS/SSL_functions/OLD_SSL_Reference">SSL Reference</a> into the format described in the <a href="https://developer.mozilla.org/en-US/docs/Project:MDC_style_guide">MDN Style Guide</a>. If you are inclined to help with this migration, your help would be very much appreciated.</li>
- </ul>
- <ul>
- <li>The proposed chapters below are based on the chapters of the <a class="external" href="https://developer.mozilla.org/NSS/SSL_functions/OLD_SSL_Reference">SSL Reference</a> and the categories of functions in <a class="external" href="/en/docs/NSS_functions" title="en/docs/NSS_functions">NSS Public Functions</a>.</li>
- </ul>
- <ul>
- <li>Should a particular page require the use of an underscore, please see the documentation for the <a href="/Project:En/MDC_style_guide#Title_Override_Extension" title="Project:En/MDC_style_guide#Title_Override_Extension">Title Override Extension</a>.</li>
- </ul>
-</div>
-<p>  </p>
-<h3 id="Building_and_installing_NSS" name="Building_and_installing_NSS"><a href="/en/NSS_reference/Building_and_installing_NSS" title="en/NSS_reference/Building_and_installing_NSS">Building and installing NSS</a></h3>
-<h3 id="Overview_of_an_NSS_application" name="Overview_of_an_NSS_application">Overview of an NSS application</h3>
-<p>Based on <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS/SSL_functions/sslintro.html">"Overview of an SSL Application"</a> in the SSL Reference.</p>
-<h3 id="Getting_started_with_NSS" name="Getting_started_with_NSS">Getting started with NSS</h3>
-<p>Based on <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS/SSL_functions/gtstd.html">"Getting Started With SSL"</a> in the SSL Reference.</p>
-<h3 id="Data_types" name="Data_types">Data types</h3>
-<p>Based on <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS/SSL_functions/ssltyp.html">"Selected SSL Types and Structures"</a> in the SSL Reference.</p>
-<h3 id="NSS_initialization_and_shutdown">NSS initialization and shutdown</h3>
-<ul>
- <li>NSS_Init</li>
- <li>NSS_InitReadWrite</li>
- <li>NSS_NoDB_Init</li>
- <li><a href="/en/NSS_Initialize" title="en/NSS Initialize">NSS_Initialize</a></li>
- <li>NSS_Shutdown</li>
-</ul>
-<h3 id="Utility_functions" name="Utility_functions">Utility functions</h3>
-<p>Based on <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS_functions#Utility_functions">"Utility Functions"</a> in NSS Public Functions.</p>
-<h3 id="Certificate_functions" name="Certificate_functions">Certificate functions</h3>
-<p>Based on <a href="https://developer.mozilla.org/en-US/docs/NSS/SSL_functions/sslcrt.html">Certificate Functions</a> in the SSL Reference and <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS_functions#Certificate_functions">"Certificate Functions"</a> in NSS Public Functions.</p>
-<ul>
- <li><a href="/en/NSS_Certificate_Functions#Validating_Certificates" title="en/NSS_Certificate_Functions#Validating_Certificates">Validating Certificates</a>
- <ul>
- <li><a href="/en/NSS_Certificate_Functions#CERT_VerifyCertNow" title="en/NSS_Certificate_Functions#CERT_VerifyCertNow">CERT_VerifyCertNow</a></li>
- <li><a href="/en/NSS_Certificate_Functions#CERT_VerifyCert" title="en/NSS_Certificate_Functions#CERT_VerifyCert">CERT_VerifyCert</a></li>
- <li><a href="/en/NSS_Certificate_Functions#CERT_VerifyCertName" title="en/NSS_Certificate_Functions#CERT_VerifyCertName">CERT_VerifyCertName</a></li>
- <li><a href="/en/NSS_Certificate_Functions#CERT_CheckCertValidTimes" title="en/NSS_Certificate_Functions#CERT_CheckCertValidTimes">CERT_CheckCertValidTimes</a></li>
- <li><a href="/en/NSS_Certificate_Functions#NSS_CmpCertChainWCANames" title="en/NSS_Certificate_Functions#NSS_CmpCertChainWCANames">NSS_CmpCertChainWCANames</a></li>
- </ul>
- </li>
- <li><a href="/en/NSS_Certificate_Functions#Manipulating_Certificates" title="en/NSS_Certificate_Functions#Manipulating_Certificates">Manipulating Certificates</a>
- <ul>
- <li><a href="/en/NSS_Certificate_Functions#CERT_DupCertificate" title="en/NSS_Certificate_Functions#CERT_DupCertificate">CERT_DupCertificate</a></li>
- <li><a href="/en/NSS_Certificate_Functions#CERT_DestroyCertificate" title="en/NSS_Certificate_Functions#CERT_DestroyCertificate">CERT_DestroyCertificate</a></li>
- <li>SEC_DeletePermCertificate</li>
- <li>__CERT_ClosePermCertDB</li>
- </ul>
- </li>
- <li><a href="/en/NSS_Certificate_Functions#Getting_Certificate_Information" title="en/NSS_Certificate_Functions#Getting_Certificate_Information">Getting Certificate Information</a>
- <ul>
- <li><a href="/en/NSS_Certificate_Functions#CERT_FindCertByName" title="en/NSS_Certificate_Functions#CERT_FindCertByName">CERT_FindCertByName</a></li>
- <li><a href="/en/NSS_Certificate_Functions#CERT_GetCertNicknames" title="en/NSS_Certificate_Functions#CERT_GetCertNicknames">CERT_GetCertNicknames</a></li>
- <li><a href="/en/NSS_Certificate_Functions#CERT_FreeNicknames" title="en/NSS_Certificate_Functions#CERT_FreeNicknames">CERT_FreeNicknames</a></li>
- <li><a href="/en/NSS_Certificate_Functions#CERT_GetDefaultCertDB" title="en/NSS_Certificate_Functions#CERT_GetDefaultCertDB">CERT_GetDefaultCertDB</a></li>
- <li><a href="/en/NSS_Certificate_Functions#NSS_FindCertKEAType" title="en/NSS_Certificate_Functions#NSS_FindCertKEAType">NSS_FindCertKEAType</a></li>
- </ul>
- </li>
- <li><a href="/en/NSS_Certificate_Functions#Comparing_SecItem_Objects" title="en/NSS_Certificate_Functions#Comparing_SecItem_Objects">Comparing SecItem Objects</a>
- <ul>
- <li><a href="/en/NSS_Certificate_Functions#SECITEM_CompareItem" title="en/NSS_Certificate_Functions#SECITEM_CompareItem">SECITEM_CompareItem</a></li>
- </ul>
- </li>
-</ul>
-<h3 id="Key_functions" name="Key_functions">Key functions</h3>
-<p><a href="/en/NSS_Key_Functions" title="en/NSS_Key_Functions">Key Functions</a></p>
-<ul>
- <li><a href="/en/NSS_Key_Functions#SECKEY_GetDefaultKeyDB" title="en/NSS_Key_Functions#SECKEY_GetDefaultKeyDB">SECKEY_GetDefaultKeyDB</a></li>
- <li><a href="/en/NSS_Key_Functions#SECKEY_DestroyPrivateKey" title="en/NSS_Key_Functions#SECKEY_DestroyPrivateKey">SECKEY_DestroyPrivateKey</a></li>
-</ul>
-<h3 id="Digital_signatures" name="Digital_signatures">Digital signatures</h3>
-<p>This API consists of the routines used to perform signature generation and the routines used to perform signature verification.</p>
-<h3 id="Encryption.2Fdecryption" name="Encryption.2Fdecryption">Encryption/decryption</h3>
-<h3 id="Hashing" name="Hashing">Hashing</h3>
-<h3 id="Key_generation" name="Key_generation">Key generation</h3>
-<p>Generate keys, key pairs, and domain parameters.</p>
-<h3 id="Random_number_generation" name="Random_number_generation">Random number generation</h3>
-<p>This API consists of the two routines used for pseudorandom number generation -- PK11_GenerateRandomOnSlot and PK11_GenerateRandom -- and the two routines used for seeding pseudorandom number generation -- PK11_SeedRandom and PK11_RandomUpdate.</p>
-<h3 id="PKCS_.2311_functions" name="PKCS_.2311_functions">PKCS #11 functions</h3>
-<p>Based on <a href="https://developer.mozilla.org/en-US/docs/NSS/SSL_functions/pkfnc.html">PKCS #11 Functions</a> in the SSL Reference and <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS_functions#Cryptography_functions">"Crypto Functions"</a> in NSS Public Functions.</p>
-<ul>
- <li><a href="/en/NSS_PKCS11_Functions#SECMOD_LoadUserModule" title="en/NSS_PKCS11_Functions#SECMOD_LoadUserModule">SECMOD_LoadUserModule</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#SECMOD_UnloadUserModule" title="en/NSS_PKCS11_Functions#SECMOD_UnloadUserModule">SECMOD_UnloadUserModule</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#SECMOD_CloseUserDB" title="en/NSS_PKCS11_Functions#SECMOD_CloseUserDB">SECMOD_CloseUserDB</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#SECMOD_OpenUserDB" title="en/NSS_PKCS11_Functions#SECMOD_OpenUserDB">SECMOD_OpenUserDB</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_FindCertFromNickname" title="en/NSS_PKCS11_Functions#PK11_FindCertFromNickname">PK11_FindCertFromNickname</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_FindKeyByAnyCert" title="en/NSS_PKCS11_Functions#PK11_FindKeyByAnyCert">PK11_FindKeyByAnyCert</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_GetSlotName" title="en/NSS_PKCS11_Functions#PK11_GetSlotName">PK11_GetSlotName</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_GetTokenName" title="en/NSS_PKCS11_Functions#PK11_GetTokenName">PK11_GetTokenName</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_IsHW" title="en/NSS_PKCS11_Functions#PK11_IsHW">PK11_IsHW</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_IsPresent" title="en/NSS_PKCS11_Functions#PK11_IsPresent">PK11_IsPresent</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_IsReadOnly" title="en/NSS_PKCS11_Functions#PK11_IsReadOnly">PK11_IsReadOnly</a></li>
- <li><a href="/en/NSS_PKCS11_Functions#PK11_SetPasswordFunc" title="en/NSS_PKCS11_Functions#PK11_SetPasswordFunc">PK11_SetPasswordFunc</a></li>
-</ul>
-<h3 id="SSL_Functions" name="SSL_Functions">SSL Functions</h3>
-<p>Based on <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS/SSL_functions/sslfnc.html">"SSL Functions"</a> in the SSL Reference and <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS_functions#SSL_functions">"SSL Functions"</a> and <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS_functions#Deprecated_SSL_functions">"Deprecated SSL Functions"</a> in NSS Public Functions.</p>
-<ul>
- <li>SSL_ConfigServerSessionIDCache</li>
- <li>SSL_ClearSessionCache</li>
-</ul>
-<h3 id="S.2FMIME" name="S.2FMIME">S/MIME</h3>
-<p>Based on the <a class="external" href="http://www-archive.mozilla.org/projects/security/pki/nss/ref/smime/">S/MIME Reference</a> (which only has one written chapter) and <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS_functions#S.2FMIME_functions">"S/MIME Functions"</a> in NSS Public Functions.</p>
-<h3 id="PKCS_.237_functions" name="PKCS_.237_functions">PKCS #7 functions</h3>
-<p>Based on <a class="external" href="http://www-archive.mozilla.org/projects/security/pki/nss/ref/nssfunctions.html#pkcs7">"Archived PKCS #7 Functions documentation."</a></p>
-<h3 id="PKCS_.235_functions" name="PKCS_.235_functions">PKCS #5 functions</h3>
-<p>Password-based encryption</p>
-<ul>
- <li>SEC_PKCS5GetIV</li>
- <li>SEC_PKCS5CreateAlgorithmID</li>
- <li>SEC_PKCS5GetCryptoAlgorithm</li>
- <li>SEC_PKCS5GetKeyLength</li>
- <li>SEC_PKCS5GetPBEAlgorithm</li>
- <li>SEC_PKCS5IsAlgorithmPBEAlg</li>
-</ul>
-<h3 id="PKCS_.2312_functions" name="PKCS_.2312_functions">PKCS #12 functions</h3>
-<p>Based on <a class="external" href="http://www-archive.mozilla.org/projects/security/pki/nss/ref/nssfunctions.html#pkcs12">"Archived PKCS #12 Functions documentation."</a> Used to exchange data such as private keys and certificates between two parties.</p>
-<ul>
- <li>SEC_PKCS12CreateExportContext</li>
- <li>SEC_PKCS12CreatePasswordPrivSafe</li>
- <li>SEC_PKCS12CreateUnencryptedSafe</li>
- <li>SEC_PKCS12AddCertAndKey</li>
- <li>SEC_PKCS12AddPasswordIntegrity</li>
- <li>SEC_PKCS12EnableCipher</li>
- <li>SEC_PKCS12Encode</li>
- <li>SEC_PKCS12DestroyExportContext</li>
- <li>SEC_PKCS12DecoderStart</li>
- <li>SEC_PKCS12DecoderImportBags</li>
- <li>SEC_PKCS12DecoderUpdate</li>
- <li>SEC_PKCS12DecoderFinish</li>
- <li>SEC_PKCS12DecoderValidateBags</li>
- <li>SEC_PKCS12DecoderVerify</li>
- <li>SEC_PKCS12DecoderGetCerts</li>
- <li>SEC_PKCS12DecoderSetTargetTokenCAs</li>
- <li>SEC_PKCS12DecoderIterateInit</li>
- <li>SEC_PKCS12DecoderIterateNext</li>
- <li>SEC_PKCS12IsEncryptionAllowed</li>
- <li>SEC_PKCS12SetPreferredCipher</li>
-</ul>
-<h3 id="NSPR_functions" name="NSPR_functions"><a href="/En/NSS_reference/NSPR_functions" title="en/NSS_reference/NSPR_functions">NSPR functions</a></h3>
-<p>A small number of NSPR functions are required for using the certificate verification and SSL functions in NSS.  These functions are listed in this section.</p>
-<h3 id="Error_codes" name="Error_codes">Error codes</h3>
-<p>Based on <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS/SSL_functions/sslerr.html">"NSS and SSL Error Codes"</a> in the SSL Reference.</p>
-<h3 id="NSS_Environment_variables" name="NSS_Environment_variables"><a href="/en/NSS_reference/NSS_environment_variables" title="en/NSS_reference/NSS_environment_variables">NSS Environment variables</a></h3>
-<h3 id="NSS_cryptographic_module" name="NSS_cryptographic_module"><a href="/en/NSS_reference/NSS_cryptographic_module" title="en/NSS_reference/NSS_cryptographic_module">NSS cryptographic module</a></h3>
-<h3 id="NSS_Tech_Notes" name="NSS_Tech_Notes">NSS Tech Notes</h3>
-<p><a class="external" href="https://developer.mozilla.org/en-US/docs/NSS/NSS_Tech_Notes">NSS Tech Notes</a> <a href="/en/NSS_Memory_allocation" title="en/NSS_Memory_allocation">NSS Memory allocation</a></p>
-<h3 id="Tools" name="Tools">Tools</h3>
-<p>Based on <a class="external" href="https://developer.mozilla.org/en-US/docs/NSS/Tools">NSS Tools</a> documentation.</p>
-<p>Based on <a class="extarnal" href="/en/NSS_reference/NSS_tools" title="en/NSS_reference/NSS_tools">NSS Tools Man Pages : work in progress</a></p>
-<p>{{ languages( { "ja": "ja/NSS_reference" } ) }}</p>
diff --git a/files/ru/mozilla/projects/webreplay/index.html b/files/ru/mozilla/projects/webreplay/index.html
deleted file mode 100644
index 62f0a521d3..0000000000
--- a/files/ru/mozilla/projects/webreplay/index.html
+++ /dev/null
@@ -1,217 +0,0 @@
----
-title: WebReplay
-slug: Mozilla/Projects/WebReplay
-translation_of: Mozilla/Projects/WebReplay
----
-<p>Web Replay --- это проект, позволяющий процессам содержимого Firefox записывать свое поведение, проигрывать его позже и перематывать до предыдущего состояния.  Проигрываемые процессы сохранаяют все то же поведение JS, структуру DOM, изменения графики и большую часть других процессов, возникающих во время записи.  Браузерный JS-дебагер может быть использован для инспектирования и контроля проигрывания. На данный момент поддерживается только для macOS.</p>
-
-<p>Web Replay сейчас находится только в ночной сборке. Он отключен по умолчанию, пока не будет стабилизирован, но может быть включен с помощью devtools.recordreplay.enabled опции. Функция доступна через Tools -&gt; Web Developer меню и с помощью нового интерфейса дебагера доступна при просмотре вкладки записи/проигрывания. Она все еще на стадии pre-alpha, но мы будем рады услышать ваш фидбек в #rr в Slackе или оставьте репорт об ошибке в Bugzilla для Core::WebReplay компоненты.</p>
-
-<p>Существующите и планируеные функции представлены <a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/WebReplayRoadmap">тут</a>.</p>
-
-<h2 id="Архитектура">Архитектура</h2>
-
-<p>Проект состоит из нескольких основных частей:</p>
-
-<ol>
- <li>Инфраструктура записи/проигрывания записывает достаточно информации во время записи, чтобы процесс проигрывания мог быть запущен и воспроизведен с тем же наблюдаемым поведением.</li>
- <li>Интеграция с IPC позволяет процессу проигрывания коммуницировать с процессом chrome с помощью IPDL и разделенной памяти.</li>
- <li>Инфраструктура перемотки позволяет проигрывать процесс, чтобы восстановить предыдущее состояние, все еще поддерживая общение с процессом chrome.</li>
- <li>Интеграция с дебагером позволяет дебагеру JS считывать необходимую для него информацию от процесса проигрывания и контролировать выполнение обработки (продолжение/перемотка). Дебагеру не разрешено менять наблюдаемое состояние процесса проигрывания.</li>
-</ol>
-
-<h3 id="Recordreplay_infrastructure">Record/replay infrastructure</h3>
-
-<p>Broadly, reliable record/replay is achieved by controlling for non-determinism in the browser.  This non-determinism originates from two sources: intra-thread and inter-thread.  Intra-thread non-deterministic behaviors are non-deterministic even in the absence of actions by other threads, and inter-thread non-deterministic behaviors are those affected by interleaving execution with other threads, and which always behave the same given the same interleaving.</p>
-
-<p>Intra-thread non-determinism is recorded and later replayed for each thread.  These behaviors mainly originate from system calls (i/o and such).</p>
-
-<p>Inter-thread non-determinism is handled by first assuming the program is data race free: shared memory accesses which would otherwise race are either protected by locks or use APIs that perform atomic operations.  If we record and later replay the order in which threads acquire locks (and, by extension, release locks and use condvars) then accesses on lock-protected memory will occur in the same order.  Atomic variables can be handled by treating reads and writes as if they were wrapped by a lock acquire/release during recording.</p>
-
-<p>It is not enough, however, to just record all these non-deterministic sources and reproduce those behaviors exactly in the replaying process.  The IPC and debugger integration components may behave differently between recording and replaying, or between different replays.  Both of these involve inter-thread communication and calls to non-deterministic APIs, and the resulting non-determinism must be allowed within the replaying process.</p>
-
-<h4 id="Allowed_Non-determinism">Allowed Non-determinism</h4>
-
-<p>There is some slop in this design: The replaying process must be non-deterministic enough that the IPC and debugger components work, but not so non-deterministic that observable behaviors are affected.  We resolve this slop by minimizing the tolerated non-determinism: The replaying process must be just non-deterministic enough that the IPC and debugger components work.  In practice, non-deterministic replay is allowed in the following areas:</p>
-
-<ol>
- <li>Heap allocations can be performed by the IPC and debugger components and so can differ between recording and replay.</li>
- <li>JS compilations and some other internal state are affected by the debugger's presence and which hooks/breakpoints are active, and so can differ between recording and replay.</li>
- <li>The debugger can allocate GC things, and allocation of other GC things can differ in the debugger's presence. For example, script compilation involves GC thing allocation, and observing changes in an object will change its shape.</li>
-</ol>
-
-<p>Relaxing non-determinism here has a number of ripple effects in other areas.  Mainly, pointer values may differ between recording and replay, and the points where GCs occur, and the set of objects collected, may differ.  This non-determinism is prevented from spreading too far with the following techniques:</p>
-
-<ol>
- <li>Different pointer values can affect the internal layout of hash tables.  To prevent this from having an effect on iteration order (and execution behavior) in the table, the main table classes (for now PLHashTable and PLDHashTable) are instrumented so that they always iterate over elements in the order they were added when recording or replaying.</li>
- <li>Differing GC behavior can cause object finalizers to run at different times.  To prevent this from having an effect on execution behavior, GC finalizers which can affect the recording are instrumented so that the finalizer action is performed at the same time in the replay as it was during the recording.  Even if the associated JS object has not been destroyed yet during the replay, it will never be used again because at this point in the recording it has been finalized.</li>
- <li>Similarly, GC behavior can cause values read from weak pointers to differ between recording and replay.  If this difference can affect the recording, the weak pointer must be instrumented so that during replay it holds onto its target for the same duration it was held while recording.</li>
-</ol>
-
-<h4 id="Recording">Recording</h4>
-
-<p>A recording content process differs from a normal content process in the following ways:</p>
-
-<ol>
- <li>Calls to certain functions are intercepted by hooking them (rewriting the machine code at their entry points to call a different function with the same signature), including the function used to dispatch mach messages.  When a call or message is intercepted, the wrapped call/message is first performed normally and then it and its outputs are recorded in a data stream for the thread performing the call.  During execution of the wrapped call/message, recording of any inner calls is suppressed, so that they are performed normally without affecting the recording.  The functions which are intercepted are generally at the system call and the system library level.  In general, any function which is not compiled as part of Gecko is fair game.</li>
- <li>Acquisition order of locks is recorded in a data stream for each lock.  Some locks which are associated with non-deterministic components are not recorded, such as the JS GC and helper threads locks.</li>
- <li>Accesses on atomic variables/fields are recorded in a global data stream, as if they were all protected by a global lock.  Some atomics are related to non-deterministic components and are excluded from this stream.</li>
- <li>Threads use file descriptors to wait on locks and notify each other, instead of using the native implementation for locking and condition variables.  At least on Mac, pthreads locks/cvars seem to use a mix of process-local and kernel state, and sometimes don't work correctly after rewinding the process.</li>
- <li>Some behaviors are changed to simplify recording, in ways that should not affect observable behaviors.  For example, incremental GCs (a non-deterministic component) work by posting events to the main thread (a deterministic component), so for now incremental GCs are disabled.  Many of these behavioral changes should eventually be removable.</li>
- <li>Graphics rendering is entirely local to the content process.  Instead of communicating via IPC with a Compositor in the UI process, there is a Compositor in the recording process itself which performs the rendering.</li>
- <li>Some additional instrumentation is performed, per the 'Allowed Non-determinism', section above.</li>
- <li>The IPC, rewind, and debugger components are all active while recording.  These spawn a number of threads which do not participate in the recording: any events they execute are live.  See the sections below for details on how these affect the process' behavior.</li>
-</ol>
-
-<p>To make it easier to ensure that the non-deterministic components do not have an effect on recorded behavior, certain code regions can be marked as disallowing events --- while executing them no thread, lock, or atomic events should be recorded.  This is done in code associated with the non-deterministic components, such as during GC or Ion compilation, to help track down behaviors that should go unrecorded.</p>
-
-<h4 id="Replaying">Replaying</h4>
-
-<p>A replaying content process behaves in the same way as a recording process, except for the following:</p>
-
-<ol>
- <li>The calls and mach messages which were intercepted during recording are also intercepted here.  When a call/message is intercepted, the wrapped call/message is <strong>not</strong> performed, but rather the results of the call/message are read from the data stream and returned to the caller, emulating the behavior of the call/message.  This requires the process to be deterministic enough that events play out in the same order on each thread between recording and replay.  The data stream should have enough error checking in place that we can immediately detect if the replay has gone out of sync with the recording.</li>
- <li>The recorded data streams which specify the acquisition order for each lock are read from and used so that locks are acquired in the same order.  When a thread tries to acquire a lock, it first waits until it is next in line to do so.</li>
- <li>Similarly, atomic accesses which were included in the recording will occur in the same order during replay, as if they were all protected by a single global lock.  Note that while this could potentially be a big drag on performance during both replay and recording, many of the hottest atomics (refcounts, GC counters, and so forth) are associated with non-deterministic components and are not recorded.</li>
-</ol>
-
-<h3 id="IPC_integration">IPC integration</h3>
-
-<p>Communication between the chrome process and a recording or replaying process --- hereafter referred to as the child process --- is managed via a separate middleman content process.  The child process is extended so that it can communicate with the middleman, using a special bidirectional channel and messages separate from IPDL state.</p>
-
-<h4 id="Middleman_process">Middleman process</h4>
-
-<p>The middleman is the same as a normal content process, except that it spawns and communicates with the child process, and avoids creating any documents itself.  Using the middleman provides the following advantages:</p>
-
-<ol>
- <li>IPDL communication is greatly simplified.  The chrome and middleman processes communicate using the standard browser protocols (PContent, PBrowser, etc.) and implementations for their actors, while the middleman and child processes communicate with their own channel and messages, which is tuned to the demands of the recording/replaying process.</li>
- <li>The middleman can perform actions that would be extremely difficult to manage in a replaying process without going out of sync with the recording.  This mainly includes running devtools content-side scripts.</li>
- <li>The middleman can spawn multiple child processes at once, and coordinate their behavior so they run in parallel.  There can be up to one recording child and two replaying children at once.  The advantage of spawning both recording and replaying children is that by switching between different children the middleman can effectively rewind a live recording, then play forward and allow the user to resume interacting with the tab after they have finished inspecting state in the past.  The advantage of using two replaying processes is to provide a smoother experience when rewinding.</li>
-</ol>
-
-<h4 id="Recordingreplaying_process_extensions">Recording/replaying process extensions</h4>
-
-<p>During initialization the child process spawns a thread that does not participate in the recording --- any IPC or other system calls it performs are live, even when replaying.  This thread sends and receives messages from the middleman.</p>
-
-<p>Messages describe actions the child process is able to do independently from the recording; currently this includes sending graphics updates, taking and restoring process snapshots, and responding to debugger requests.</p>
-
-<h3 id="Rewinding_infrastructure">Rewinding infrastructure</h3>
-
-<p>A child process can be rewound to an earlier state in response to a message from the middleman.  After a recording process rewinds, it becomes a replaying process.  Rewinding happens by periodically taking memory snapshots during execution, and then later restoring them.  Care must be taken for efficiency when taking/restoring snapshots and for managing system resources when restoring.</p>
-
-<h4 id="Snapshots">Snapshots</h4>
-
-<p>Late in process initialization the first snapshot is taken, which is simply a copy of the stacks/registers for each thread.  Each subsequent snapshot includes copies of thread stacks/registers as well as a diff containing the original contents of all pages of heap and static memory that were modified since the previous snapshot.  Certain memory regions are excluded from snapshots; these memory regions are allocated with a special API and are used for state that needs to be preserved when rewinding.  Snapshot data may be stored in memory or on disk.  Diffs are computed by first setting up an exception handler thread (mac only) very similar to the one used by asm.js.  When taking the first snapshot all addressable memory in the process is enumerated and write-protected, and as faults occur a special exception handler thread unprotects the memory, copies its contents and marks it as dirty.  When the next snapshot is taken, only the dirty memory is examined for any changes vs. the copy made.</p>
-
-<p>This mechanism requires intercepting mmap (or similar low level allocation functions) so that any newly addressable memory is known --- anonymous mappings would not otherwise be intercepted or included in the recording, as heap allocation is non-deterministic while replaying.  mprotect is intercepted and nop'ed to avoid interference with the dirty memory mechanism, and munmap is intercepted with no actual unmapping performed, so that memory does not need to be remapped when restoring a snapshot (a set of free regions is maintained to allow reusing this memory).</p>
-
-<p>All snapshots are taken from the main thread.  Before taking the snapshot, all threads participating in the recording must enter an idle state, waiting on a thread-specific condition variable.  Threads enter this state whenever they are waiting to acquire a lock or perform an atomic action that is part of the recording.  While recording, threads may make blocking calls to libraries (e.g. kevent).  To allow these threads to be snapshotted, the call is instead performed on a separate thread that does not participate in the recording, so that the calling thread may enter the correct idle state even while its progress is blocked on the call completing.  Once all thread are idle, the main thread computes the memory diff, reads the stacks from each thread and their register state (which each thread recorded by calling setjmp before idling).</p>
-
-<p>Restoring snapshots is also done from the main thread.  As for taking a snapshot, all other threads enter an idle state.  The dirty memory information computed since the last snapshot was taken is used to restore the heap to the state at that last snapshot, and then the memory diffs can be used to restore an earlier snapshot if necessary.  Threads are individually responsible for restoring their stacks; when they wake up from the idle state they see the main thread has prepared a new stack to restore to, so they longjmp to the new register state and copy in the new stack's contents.</p>
-
-<h4 id="Managing_system_resources">Managing system resources</h4>
-
-<p>When the child process restores a snapshot, the state of any system resources it has open is unchanged.  Care must be taken to make sure these resources are coherent to the process after the restore completes.  This is done in the following ways:</p>
-
-<ol>
- <li>Instead of creating or destroying threads on demand, while recording/replaying all threads which will be needed are created during process initialization.  If during the recording the content tries to create more threads than were spawned up front, then the recording fails.  These threads idle until the recording/replaying content tries to 'create' them, then they run their main function, and after completing it will idle indefinitely.  This ensures that no matter when we create or restore a snapshot, the same set of threads will exist and will have consistent stacks locations.</li>
- <li>Locks and condition variables are to some extent system resources, and to avoid problems we make sure each thread is waiting on a consistent variable when saving or restoring a snapshot (see section above).</li>
- <li>IPC integration uses a file descriptor for communicating with the middleman.  This is left alone when restoring a snapshot, so whenever saving or restoring a snapshot they should be in a consistent state for the child process.  Constraints are used for when messages may be sent between the middleman and child process, ensuring that the middleman process cannot send a message at a time when the child process may be rewinding.</li>
-</ol>
-
-<h3 id="Debugger_integration">Debugger integration</h3>
-
-<p>When debugging a normal content process, the devtools JS debugger runs quite a bit of JS code in the content process, communicating with the chrome process primarily through streams of JSON data.  When debugging a child content process, this JS code runs in the middleman process.  When the code creates a Debugger object, that Debugger provides information about the child process rather than the current (middleman) process.  While the Debugger can indicate it is for a child process, the interface should be as transparent as possible to the devtools JS code; the Debugger can still create script/object/etc. debug objects, which refer to specific things in the child process.</p>
-
-<p>As with the devtools JS code, this Debugger lives in the middleman process, and instead of wrapping things from another compartment the debug objects hold heap structures with information about some thing in the child process.  The Debugger can explore the heap by sending messages to the child process to fill in the contents of the debug objects it creates.  Whenever the Debugger is interacting with the child process the child process is paused at some point in execution, and the contents of the debug objects are only valid until the middleman notifies the child process that it can resume forward execution or must rewind to an earlier snapshot.  When the child process pauses again (at a breakpoint, say) the debug objects must be reconstructed.</p>
-
-<p>There is an exception to this, for scripts and script source objects; debug objects for these will continue to hold the same referent after resuming or rewinding the replaying process.  This is necessary for script breakpoints to work, and is implemented by ensuring that the ordering of creation of scripts and script sources is deterministic (mainly by disabling off thread parsing, which is one of the behavior changes during recording/replay).</p>
-
-<p>The user's interface to the devtools for a child process is the same as for a normal content process, except that new UI buttons are added for rewinding (find the last time a breakpoint was hit), and for reverse step/step-in/step-out.  For now only JS state can be inspected by the debugger, though extending this to cover DOM inspection and other devtools features should not be too hard.</p>
-
-<h2 id="Unrecordable_executions">Unrecordable executions</h2>
-
-<p>There are restrictions on the executions that can be recorded.  These should all be detectable during recording, so that we don't attempt to replay an execution we know will not match up with the recording.  The following executions run into fundamental limits of the approach and cannot be replayed:</p>
-
-<ol>
- <li>Executions which throw overrecursion JS exceptions can't be reliably replayed; overrecursion happens at different times depending on how scripts are compiled, which can vary between recording and replaying.</li>
- <li>Similarly, executions which run out of memory at some point can't be reliably replayed.</li>
- <li>Executions which are stopped at some point by the slow script dialog can't be reliably replayed.  Keeping track of the exact point where an interrupt occurred would require quite a bit of recording overhead, and it doesn't seem worth it to try to do this.</li>
-</ol>
-
-<p>The following executions are unlikely to be supported by the initial release, but should be able to be handled at some point in the future:</p>
-
-<ol>
- <li>On x64, asm.js code relies on mprotect to handle out of bounds heap accesses; mprotect works differently while replaying, so some cooperation will be needed between the asm.js exception handler and the dirty memory exception handler.</li>
- <li>Shared array buffers can be used by web content to introduce data races to the browser on the contents of those buffers, going against a fundamental assumption of the record/replay infrastructure.  Recording and replaying executions using these buffers will require new techniques like treating all accesses on the buffers as atomic (probably unacceptable overhead) or performing all accesses on the buffer on a single core and keeping track of context switches.</li>
- <li>DOM workers are not supported yet.  For simplicity, debugger integration is currently only able to handle JS code that runs on the main thread.</li>
- <li>WebGL is not supported yet, as it uses a pretty different rendering path from normal web content.</li>
- <li>Media elements are not supported yet, as many of these run third party multithreaded code which hasn't been tested with the infrastructure.</li>
-</ol>
-
-<h2 id="Porting">Porting</h2>
-
-<p>Almost all implementation work so far has been on macOS.  Windows port work is underway, but is not yet working.  The difficulties are in figuring out the set of system library APIs to intercept, in getting the memory management and dirty memory parts of the rewind infrastructure to work, and in handling the different graphics and IPC pathways on different platforms.</p>
-
-<h2 id="Comparison_with_other_projects">Comparison with other projects</h2>
-
-<p>There is lots of existing work in this area.  The closest projects are <a href="http://rr-project.org/">rr</a>, WebKit's <a href="https://trac.webkit.org/wiki/WebReplayMechanics">replay project</a>, and Microsoft's <a href="https://channel9.msdn.com/blogs/Marron/Time-Travel-Debugging-for-JavaScriptHTML">Time-Travel Debugger</a>.  Compared to rr:</p>
-
-<ol>
- <li>This should work on all platforms and architectures supported by Gecko, though with substantial port work required.</li>
- <li>This will be part of Gecko itself, rather than a separate tool, which means both that developers won't need additional software to use it and that this can't be used to debug other software.</li>
- <li>This can use multiple cores during recording and replay.</li>
- <li>This does not preserve exact behavior. Context switches can occur at different times and data races can lead to different behavior between recording and replay. Data races are bugs in and of themselves, however, so this sort of non-determinism should be fixed regardless.</li>
- <li>This design allows the replaying process to behave differently from the recording process, which allows for a fairly straightforward implementation of IPC and Debugger integration.</li>
-</ol>
-
-<p>Microsoft's and WebKit's replay projects operate at a higher level than rr.  Inputs to the browser and non-deterministic behaviors are recorded so that they can be replayed later.  In Microsoft's project the abstraction layer appears to be the boundary between the JS engine and the rest of the browser, while in WebKit's project the layer appears to be at internal WebKit APIs that can cause JS to run or the behavior of JS code to vary.</p>
-
-<p>Broadly, all of these projects sit on a spectrum: at what level is the boundary between components whose behavior is recorded and the rest of the system?  rr records all behavior in the user space of a process; the boundary is the system calls which are made into the kernel.  This project records all behavior outside of system library calls which the process makes, with exceptions carved out for the allowed non-determinism and for draw targets.  Microsoft's and WebKit's projects record a smaller subset of the browser's behavior.</p>
-
-<p>This project is at a good point on this spectrum.  Compared to a higher level project, this is able to operate on stable, thoroughly documented library APIs.  By focusing on intercepting these APIs, browser instrumentation, recording overhead, and the maintenance burden going forward are all minimized.  Compared to a lower level project, this is able to tolerate more non-determinism.  All code whose behavior is recorded is compiled into Gecko (rather than being part of immutable, usually closed-source libraries) and can be lightly modified to deal with behaviors that function intercepting cannot handle, such as varying hash table layouts and the ordering of atomic accesses.</p>
-
-<h2 id="Appendix_Debugger_Details">Appendix: Debugger Details</h2>
-
-<p>Here is some more detailed information about how a recording/replaying process affects the debugger, and options for future improvements.</p>
-
-<h4 id="Debugger_changes">Debugger changes</h4>
-
-<p>From the perspective of a devtools server, debugging a recording/replaying process is very similar to debugging a live process.  When execution is paused, the Debugger JS object and its various child objects can be used to inspect the execution state in the same way for a either kind of process.  Here are the main differences:</p>
-
-<ol>
- <li>Explicit commands must be sent to the debugger to control execution.  The replayResumeBackward() and replayResumeForward() members may be called to resume execution, and the replayPause() member may be called to pause execution at the next opportunity.  A child process can only pause at breakpoints and at snapshot points (currently these only happen when graphics updates are performed, at which point there is no JS on the stack).</li>
- <li>There is a new onPopFrame handler, which is needed when doing reverse-step-in operations.</li>
- <li>Operations on the debuggee which require interaction with the system will fail.  These operations may be property accesses, evals, or object calls, and an example is accessing the "font" property of a CanvasRenderingContext2D.  Failed operations currently just produce a placeholder "INCOMPLETE" result.</li>
- <li>Operations on the debuggee which have side effects --- eval("x.f = 3") --- should be avoided.  When the process resumes forward or backward these side effects will be lost (the process reverts to its original state) and while paused at a breakpoint these effects can cause some strange behavior --- after the above eval, getting the x.f property directly could produce a different value from eval("x.f").  While the strange behavior could be fixed (it's due to caching) it would be good to prevent or at least discourage users from performing such effectful operations.</li>
- <li>The underlying object of a Debugger.Object is inaccessible; object.unsafeDereference is null.</li>
- <li>As described above under "Debugger integration", child objects besides scripts and script sources become invalid when the debugger resumes execution, and must be reconstructed each time the replaying process pauses.</li>
-</ol>
-
-<h4 id="Inspecting_a_replaying_process">Inspecting a replaying process</h4>
-
-<p>Access to JS objects in the replaying process is currently only done through the JS Debugger interface --- Debugger.Object, Debugger.Frame.eval, and so forth.  This interface overlays a separate implementation from the C++ Debugger, implemented in devtools/server/actors/replay/debugger.js.  This communicates with the replaying process via JSON and is fairly easy to extend for new features (such as web console support).</p>
-
-<h2 id="Appendix_Impacts_on_Gecko_Development">Appendix: Impacts on Gecko Development</h2>
-
-<p>Web replay is designed to minimize the places where other parts of Gecko need to know about it or interact with it.  There are, however, areas where Gecko development is impacted by Web Replay.  This section describes the main areas where ongoing development can break Web Replay and cause its tests to fail.  needinfo? :bhackett on Bugzilla with any questions or concerns.</p>
-
-<p>On treeherder, Web Replay tests currently only run on MacOS opt builds, and are prefixed with browser_dbg_rr.</p>
-
-<h4 id="Calls_to_new_library_functions">Calls to new library functions</h4>
-
-<p>Most non-deterministic behaviors in a recorded/replayed process are captured by redirecting the system library functions which the process calls into --- rewriting their machine code so they invoke a record/replay specific function with the same signature, which records any results of the function and then replays those results later without actually invoking the underlying library function.  Redirected functions include both low level system call wrappers like sendmsg/recvmsg, and higher level functions such as various Cocoa interfaces.  The list of redirected functions can be found in toolkit/recordreplay/ProcessRedirectDarwin.cpp.</p>
-
-<p>When calls are added to Gecko for new system library functions, those functions may need redirections.  In general, redirections are needed for any function that is (a) not compiled as part of Gecko, and either (b) may behave differently between recording and replaying, or (c) depends on data produced by other redirected functions (for example, CoreFoundation types like CFArrayRef and CFStringRef).  A simpler way of telling that a redirection is needed for a function is that the web replay tests crash inside it while replaying.</p>
-
-<p>New redirections can be added to toolkit/recordreplay/ProcessRedirectDarwin.cpp, adding just a few lines for functions with simple interfaces using the various RRFunction macros.  Missing redirections can also be temporarily worked around by avoiding the call when mozilla::recordreplay::IsRecordingOrReplaying().</p>
-
-<h4 id="Recording_events_in_disallowed_areas">Recording events in disallowed areas</h4>
-
-<p>GC marking and finalization may behave differently when recording and replaying, and recording events for a thread --- calling redirected library functions, using recorded locks or recorded atomics --- is disallowed at these times.  There are some other areas where recorded events are also disallowed, such as during JS interrupt callbacks.  Recording an event in one of these areas will fail a !AreThreadEventsDisallowed() assertion.</p>
-
-<p>These failures usually result from accessing a recorded lock or atomic.  Core xpcom and mozglue lock classes and mozilla::Atomic atomics are recorded by default, but many locks and atomics don't actually need to be recorded in order to correctly replay.  Recording for a lock or atomic can be turned off by specifying recordreplay::Behavior::DontPreserve in either the lock's contructor argument or the atomic's template arguments.</p>
-
-<h4 id="Interactions_with_the_middleman_process">Interactions with the middleman process</h4>
-
-<p>When recording or replaying an execution, there is an extra content process involved, the middleman process as described above.  The presence of the middleman requires special handling in IPC internals and some graphics code.  Additionally, IPC channels used to communicate with middleman processes can also communicate with the recording process child of the middleman.  Problems can happen if IPDL actors for a protocol are setup by both the recording and middleman processes, while the UI process only expects to see one such actor.  The usual solution here is to avoid setting up the actor in the middleman process, when mozilla::recordreplay::IsMiddleman().</p>