Gdzie idzie operacja kopiowania?
Strona widzi metodę o nazwie clipboard.write. Jego implementacja w preload jest opakowaniem. Przydatne pytanie brzmi, co wysyła to opakowanie i który Kod je odbiera.
Użyj REA, aby prześledzić, w jaki sposób Notion kopiuje tekst i HTML do schowka systemowego. Pokaż kod na każdym kroku.
Przykładowy monit z lokalnym pakietem aplikacji Notion Dostępny dla agenta kodującego.
REA znajduje, gdzie zacząć czytać
Analiza wstępnego ładowania karty za pomocą REA lokalizuje interfejs API wystawiony na stronę i wywołanie, które wysyła żądanie IPC. Oba ustalenia pochodzą z zakresów źródłowych w minified bundle:
REA → dwa miejsca do otwarcia
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 wynik na karcie Notion preload, nagrany z REA 4.1.0. Pozycje używają wiersza oryginalnego pakietu i kolumny zerowej.
Agent otwiera te lokalizacje, znajduje element schowka w zmontowanym interfejsie API i czyta invokerInMain. Jej Call site supplies notion:clipboard:write. Ta nazwa daje agentowi coś precyzyjnego, czego można szukać w głównym pakiecie. Cztery fragmenty poniżej pokazują trasę, którą łączy.
Cztery krótkie fragmenty kodu
Uproszczony z pakowanego JavaScript, z czytelnymi nazwami zmiennych. Niepowiązani członkowie są pomijani.
-
Zacznij od interfejsu API wyświetlanego na stronie
tab_browser_view / preload.js * członek APIconst clipboardApi = { write: invokerInMain("notion:clipboard:write") }; // Included in the API exposed through contextBridge: // window.__electronApi.clipboardTen członek podaje nazwę kanału. Realizacja
invokerInMaininformuje nas, w jaki sposób żądanie opuszcza proces strony. -
Rozwiąż opakowanie wstępnego obciążenia
tab_browser_view / preload.js * IPC helperfunction invokerInMain(channel) { return (...args) => invokeInMainAndReturnResult(channel, ...args); } function invokeInMainAndReturnResult(channel, ...args) { return ipcRenderer.invoke(channel, ...args); }Zwrócona funkcja przekazuje argumenty za pośrednictwem IPC żądania i odpowiedzi Electron. Możemy teraz szukać
notion:clipboard:writepo stronie głównej-proces. -
Sprawdź, jak zarejestrowany jest odbiorca
główna/index.js * Pomocnik obsługiconst handleRequestFromRenderer = { addListener(channel, handler) { ipcMain.handle(channel, handler); } };Główny proces wykorzystuje inne opakowanie. Jego
addListenermetoda rejestrujeipcMain.handleodbiornik dla tego kanału. -
Znajdź zapis i sprawdzenie jego nadawcy
główna/index.js * odbiornik schowkahandleRequestFromRenderer.addListener( "notion:clipboard:write", (event, data) => isNotionWebContents(event.sender) ? clipboard.write(data) : undefined );To jest cel podróży. Po sprawdzeniu nadawcy program obsługi przekazuje dostarczone dane do interfejsu API schowka Electron. Kanał i dwa rozwiązane opakowania łączą odsłoniętą metodę z tym wywołaniem.
Jak skopiowany blok zachowuje swoją strukturę?
Edytor internetowy Notion wysyła tekst i HTML poprzez electronApi.clipboard.write. Przechowuje dane bloku lokalnie i umieszcza identyfikator w skopiowanym kodzie HTML, aby je połączyć.
Linki HTML do zapisanych danych blokowych
text: "Project notes"
html: "<p>Project notes</p>"
+ "<!-- notionvc: <copy-id> -->"
id: <copy-id>
mimeTypes:
text/_notion-blocks-v3-production
→ structured block data
- Przeczytaj identyfikator HTML
- Znajdź ten sam lokalny identyfikator
- Przywróć dane bloku Notion
Po wklejeniu Notion szuka identyfikatora HTML i sprawdza go z zapisaną kopią. Pasujące identyfikatory przywracają dane bloku.
Format schowka nagrany z zasobów internetowych buforowanych 13 lipca 2026 r.
Więcej przykładów i źródeł
Inny przykład: tabele przeceny
Notion analizuje Markdown na dane blokowe. Ten przykład pokazuje, jak tabela staje się nagłówkiem i wierszami danych.
Tabela za pośrednictwem parsera Markdown Notion
| A | B |
| - | - |
| 1 | 2 |
table · headerRow: true
table_row
cells: ["A"], ["B"]
table_row
cells: ["1"], ["2"]
Inna ścieżka: połączenie offline SQLite
Żądania renderowania Notion getSqliteMeta przez IPC. Główny proces tworzy kanał wiadomości i daje jeden port rendererowi, a drugi procesowi narzędziowemu SQLite. Kolejne partie wyciągów i wyniki przemieszczają się przez ten port.
Po tym przekazaniu wyjaśniono, gdzie działa baza danych i dlaczego śledzenie tylko początkowego żądania IPC pomija późniejszą rozmowę.
Źródła i jak czytać fragmenty
Mostek schowka pochodzi z Notion Desktop 7.6.1 app.asar: zakładka preload i main/index.js. Fragmenty rozszerzają minifikowane nazwy zmiennych i pomijają niepowiązany kod; Pomocnik sender-check jest wyświetlany wraz z jego podstawą isNotionWebContents zadzwoń.
Przykłady Wirtualnego schowka i Markdown pochodzą z zasobów internetowych buforowanych 13 lipca 2026 r., w tym modułów 747001, 58169, 736810 oraz 422457. Te aktywa mają swoją własną wersję. Zapisane sondy wykonywały wyodrębnione moduły i małe wiązki; ich wyjścia opisują te sondy, a nie przechwyconą sesję interfejsu użytkownika pulpitu.
Pokazany tutaj wynik REA jest skoncentrowaną analizą zapisanego obciążenia wstępnego karty, zarejestrowanego z opublikowanym pakietem REA 4.1.0. Lokalizuje API i wywołuje operację. Element składowy schowka i pasujący odbiornik są połączone poprzez odczytanie ich implementacji opakowania w pakiecie.
Przykład Markdown wykorzystuje moduł parsera 422457. Zapisane testy modułów pokazują, że zarówno filtry strony, jak i czatu zachowują tę tabelę. Parsery paste/import, structured Markdown i AI/chat mają oddzielne punkty wejścia i formaty pośrednie.
- JavaScript Przewodnik aplikacjiPostępuj zgodnie z funkcją eksportu małej aplikacji Electron.
- DX-BallPostępuj zgodnie z natywnymi instrukcjami sprawdzonej funkcji C.