Где выполняется операция копирования?
На странице отображается метод под названием clipboard.write. Его реализация в предварительной загрузке является оболочкой. Полезный вопрос заключается в том, что отправляет эта оболочка и какой код ее получает.
Используйте REA, чтобы проследить, как Notion копирует текст и HTML в системный буфер обмена. Показывайте код на каждом шаге.
Пример запроса с локальным пакетом приложений Notion, доступным вашему программисту.
REA находит, с чего начать чтение
Анализ предварительной загрузки вкладок с помощью REA позволяет найти API, доступный для страницы, и вызов, который отправляет запрос IPC. Оба результата представлены с диапазонами исходных текстов в уменьшенном пакете:
REA выводы → два места для открытия
api_key: "__electronApi"
api_status: "dynamic"
source: preload.js:1:22764–22828
operation: "invoke"
channel_expression: "e"
source: preload.js:1:6486–6522
analyze_javascript_applicationрезультата применения analyze_javascript_application в предварительной загрузке вкладки Notion, записанного с помощью REA 4.1.0. Для позиций используются строка исходного пакета и столбец, основанный на нуле.
Агент открывает эти папки, находит элемент clipboard в собранном API и считывает invokerInMain. Его сайт вызова предоставляет notion:clipboard:write. Это имя дает агенту точную информацию для поиска в основном пакете. В четырех приведенных ниже выдержках показан маршрут, по которому он подключается.
Четыре коротких фрагмента кода
Упрощенный по сравнению с пакетным JavaScript, с удобочитаемыми именами переменных. Несвязанные элементы опущены.
-
Начните с API, доступного для этой страницы
tab_browser_view/preload.js · Член APIconst clipboardApi = { write: invokerInMain("notion:clipboard:write") }; // Included in the API exposed through contextBridge: // window.__electronApi.clipboardЭтот участник предоставляет название канала. Реализация
invokerInMainсообщает нам, как запрос завершает обработку страницы. -
Устраните оболочку предварительной загрузки
tab_browser_view/preload.js · Помощник IPCfunction invokerInMain(channel) { return (...args) => invokeInMainAndReturnResult(channel, ...args); } function invokeInMainAndReturnResult(channel, ...args) { return ipcRenderer.invoke(channel, ...args); }Возвращаемая функция перенаправляет аргументы через IPC запроса и ответа Electron. Теперь мы можем искать
notion:clipboard:writeна стороне основного процесса. -
Проверьте, как зарегистрирован получатель
main/index.js · помощник обработчикаconst handleRequestFromRenderer = { addListener(channel, handler) { ipcMain.handle(channel, handler); } };Основной процесс использует другую оболочку. Его метод
addListenerрегистрируетipcMain.handleдля этого канала. -
Найдите запись и проверьте ее отправителя
main/index.js · приемник буфера обменаhandleRequestFromRenderer.addListener( "notion:clipboard:write", (event, data) => isNotionWebContents(event.sender) ? clipboard.write(data) : undefined );Это адресат. После проверки отправителя обработчик передает предоставленные данные в API буфера обмена Electron. Канал и две разрешенные оболочки подключают открытый метод к этому вызову.
Как скопированный блок сохраняет свою структуру?
Веб-редактор Notion отправляет текст и HTML-код через electronApi.clipboard.write. Он сохраняет данные блока локально и вставляет идентификатор в скопированный HTML-код, чтобы связать их.
HTML-ссылки на сохраненные данные блоков
text: "Project notes"
html: "<p>Project notes</p>"
+ "<!-- notionvc: <copy-id> -->"
id: <copy-id>
mimeTypes:
text/_notion-blocks-v3-production
→ structured block data
- Прочитайте HTML-идентификатор
- Найдите тот же локальный идентификатор
- Восстановить данные блока Notion
При вставке Notion ищет HTML-идентификатор и сравнивает его с сохраненной копией. Совпадающие идентификаторы восстанавливают данные блока.
Формат буфера обмена, записанный из веб-ресурсов, кэшированных 13 июля 2026 года.
Дополнительные примеры и источники
Другой пример: таблицы уценки
Notion преобразует Markdown в блочные данные. В этом примере показано, как таблица преобразуется в заголовок и строки данных.
Таблица с помощью анализатора уценки Notion
| A | B |
| - | - |
| 1 | 2 |
table · headerRow: true
table_row
cells: ["A"], ["B"]
table_row
cells: ["1"], ["2"]
Другой путь: автономное подключение к SQLite
Программа визуализации Notion запрашивает getSqliteMeta через IPC. Основной процесс создает канал передачи сообщений и передает один порт программе визуализации, а другой - служебному процессу SQLite. Последующие пакеты инструкций и результаты передаются через этот порт.
После этой передачи обслуживания объясняется, как выполняется работа с базой данных и почему при отслеживании только первоначального IPC-запроса не учитывается последующий диалог.
Источники и как читать выдержки
Интерфейс буфера обмена взят из NotionNotionapp.asar: предварительная загрузка вкладки и main/index.js. В приведенных выдержках приведены сокращенные имена переменных и опущен несвязанный код; показан помощник для проверки отправителя с базовым isNotionWebContentsвызовом isNotionWebContents.
Примеры виртуального буфера обмена и Markdown взяты из веб-ресурсов, кэшированных 13 июля 2026 года, включая модули 747001, 58169, 736810 и 422457. У этих ресурсов есть своя версия. Сохраненные тесты запускали извлеченные модули и небольшие модули управления; их выходные данные описывают эти тесты, а не захваченный сеанс пользовательского интерфейса рабочего стола.
Показанный здесь результат REA представляет собой целенаправленный анализ сохраненной предварительной загрузки вкладок, записанный с помощью опубликованного пакета REA 4.1.0. Он определяет местоположение API и запускает операцию. Элемент буфера обмена и соответствующий приемник подключаются путем считывания их реализаций-оболочек в пакете.
В примере Markdown используется модуль синтаксического анализа 422457. Тесты сохраненного модуля показывают, что и фильтры страницы, и фильтры чата сохраняют эту таблицу. Парсеры вставки/импорта, структурированного Markdown и AI/chat имеют отдельные точки входа и промежуточные форматы.
- Руководство по применению JavaScript Ознакомьтесь с небольшой функцией экспорта приложения Electron.
- Реконструкция DX-Ball Выполняется в соответствии с собственными инструкциями для проверенной функции C.