Имя: Пароль:
1C
 
Как сохранить и восстановить снимок живого HTML документа?
,
0 TormozIT
 
гуру
26.06.21
20:28
Хочу сохранить в файл и восстановить из этого файла снимок живого HTML документа, т.е. чтобы он после восстановления продолжил "жить" как будто и не было этого прерывания его жизни, т.е. восстановились все обработчики событий и прочее.
Серверной стороны нет, т.е. куки не нужны.
Желательно сделать встроенными средствами ОС Windows и платформы 1С.
1 TormozIT
 
гуру
26.06.21
20:30
Сохранение выполняется всегда из ПолеHTMLДокумента. Восстанавливать предполагается в ПолеHTMLДокумента и в браузере.
2 Вафель
 
26.06.21
20:38
Если в переменных есть ссылки на функции то никак наверно
3 Вафель
 
26.06.21
20:38
А так
For (i in global)
4 TormozIT
 
гуру
26.06.21
20:41
(3) Спасибо. Очень информативно.
5 mistеr
 
26.06.21
20:44
(0) Не очень понятно. Примеры "жизни", которая не восстанавливается обычным образом?
6 Garykom
 
гуру
26.06.21
20:47
(2) можно всю историю общения с сервером сохранить и потом прокрутить
7 Вафель
 
26.06.21
20:49
Как я понял задача восстановить работу скриптов
8 TormozIT
 
гуру
26.06.21
20:50
(7) Да. Скрипты должны тоже восстановить свое состояние.
9 Garykom
 
гуру
26.06.21
20:51
(0) во многих случаях это невозможно

JS полноценный ЯП/движок с "фоновыми", например на страничке после последнего обновления работает некий таймер/счетчик
после сохранения и восстановления таймер собьется относительно реального времени и сервера

ну и как минимум все токены доступа умрут
10 Garykom
 
гуру
26.06.21
20:52
имхо сценарий использования подобного изврата придумал реальный тормоз
11 TormozIT
 
гуру
26.06.21
20:54
Понятно. Что есть вещи которые восстановить не получится. Надеюсь здесь мне их подскажут.
Но думаю бОльшую часть состояния можно восстановить.
12 Вафель
 
26.06.21
20:57
Если скрипт сам пишешь, то можно его сделать сохраняемым
13 Гений 1С
 
гуру
26.06.21
21:19
(11) покури в сторону селениума, как это делается у Взрослых Парней Джавы
14 Вафель
 
26.06.21
21:19
(13) а сем нажиматель кнопок поможет?
15 TormozIT
 
гуру
26.06.21
21:26
Как я пока себе представляю решение задачи (0):

Сериализация
1. Сериализовать DOM дерево, куда как я понимаю и подключения обработчиков событий тоже попадут.
2. Обойти все глобальные переменные, проверить сериализацию каждой отдельно и выкинуть несериализуемые. Получить список из этих переменных и сериализовать его.

Восстановление
1. Десериализовать DOM дерево, обеспечив невозможность выполнения обработчиков событий.
2. Восстановить глобальные переменные.
3. Разблокировать обработчики событий.
16 Garykom
 
гуру
26.06.21
21:27
меня иногда удивляет узкость кругозора некоторых ИТшников
и они каким то местом вполне даже себе успешны
17 TormozIT
 
гуру
26.06.21
21:27
Что будет с таймерами?
18 Garykom
 
гуру
26.06.21
21:27
(16) к (14) на прикол из (13)
19 Вафель
 
26.06.21
21:27
Не назначай обработчики скриптом, тогда и просто вме будет
20 Вафель
 
26.06.21
21:28
(17) откажись от таймеров тоже
21 TormozIT
 
гуру
26.06.21
21:30
(19) Не понял. Я не являюсь автором целевых скриптов. Они - в общем случае черные ящики.
22 Garykom
 
гуру
26.06.21
21:30
(15) блин тебе же написали еще в (6)

есть некое исходное/начальное состояние страницы которое легко получить ибо оно одинаково и загружается откуда то
и есть некое куда пришли после кучи действий

ну дык сохрани последовательность действий и далее где надо восстановить берешь исходное и прокручиваешь "последовательность действий" быстро
и вуаля мы "восстановили"

и тут даже хрень про селениум вполне в тему
23 Garykom
 
гуру
26.06.21
21:32
Хотя надо знать задачу исходную

Думаю как обычно она намного проще и без подобных извратов решается
24 Вафель
 
26.06.21
21:32
(21) тогда твоя задача не решаема в общем виде.
Юзай виртуалки
25 TormozIT
 
гуру
26.06.21
21:37
(22) Хорошо. Как универсально все события ввода (клавиатура и мышь) залогировать и воспроизвести? Есть какие то готовые поделки для этого?
26 Garykom
 
гуру
26.06.21
21:38
(25) js прекрасно перехватывает все клики и ввод с клавы
27 TormozIT
 
гуру
26.06.21
21:39
(26) Я не спрашивал насколько прекрасно он это делает, если что.
28 TormozIT
 
гуру
26.06.21
21:41
Кроме событий ввода на документ HTML конечно воздействует и код из 1С. Например обработчики событий ДокументСформирован, onClick и т.д.
29 TormozIT
 
гуру
26.06.21
21:42
(28) Если мне нужно будет в другой форме 1С или в браузере восстановить состояние, то все эти воздействия воспроизвести не получится.
30 Вафель
 
26.06.21
21:48
Говорят Яндекс браузер умеет гибернировать вкладки
31 TormozIT
 
гуру
26.06.21
21:49
(30) Хорошо ему) Ну понятно что браузер имеет доступ КО ВСЕМУ. Поэтому это лишь вопрос желания сделать такую фичу.
У меня же источник - строго в 1С.
32 Вафель
 
26.06.21
21:54
А что за задача такая что производьные страницы нужно гибернировать?
33 TormozIT
 
гуру
26.06.21
21:57
(32) Одна из целей - предоставить разработчику 1С возможность удобной отладки работы поля HTML документа. Встроенное средство (CTRL+ALT+SHIFT+F12) довольно кривое. Хочется переносить состояние HTML документа в браузер и там его пытать.
34 Вафель
 
26.06.21
22:00
Бросай, нерешпемая это задача.
Даже у Яндекса до конца не получилось
35 Гений 1С
 
гуру
26.06.21
22:06
(33) ну тогда копай аналитически.
1. Дом модель ты можешь сохранить.
2. Кури, как сохранить состояние перменных джавы, возможно ли это и загруженные скрипты
36 TormozIT
 
гуру
26.06.21
22:09
(34) Так мне и не обязательно на 100% решать ее. Достаточно будет решить с ограничениями. Конечно хочется минимизировать их.
37 Вафель
 
26.06.21
22:10
Ссылку на функцию нельзя сохранить, ибо это нужно кусок памяти сохранить, а доступа к этому нет
38 Вафель
 
26.06.21
22:11
А если это реакт какой, то там все вот так на ссылках
39 acht
 
26.06.21
23:16
(36) Ты не с той стороны заходишь. Ты просишь решения абстрактного вопроса, на которые получаешь не менее абстрактные ответы. Определи предметно "возможность удобной отладки работы поля HTML документа" и возможно, тебе расскажут как сделать каждую конкретную часть.

Иначе это "хочу, чтобы всё и всем"
40 acht
 
26.06.21
23:19
(35) > Кури ... возможно ли это
Спасибо, геня, что осветил вопрос с неожиданной стороны.
41 ДедМорроз
 
27.06.21
01:22
Самый простой вариант - браузер в виртуалку и делать снимок виртуалки и повторно его запускать.
42 Вафель
 
27.06.21
07:31
(41) так страница открыта не в браузере в этом то весь и вопрос
43 TormozIT
 
гуру
27.06.21
08:14
(15) + Еще надо сохранить Canvas, что тоже решаемо.
https://stackoverflow.com/questions/766137/javascript-canvas-serialization-deserialization
44 TormozIT
 
гуру
27.06.21
09:25
Тут https://www.sqlpac.com/en/documents/javascript-listing-active-event-listeners.html написано,
что обработчики подключенные через addEventListener нельзя обойти встроенными методами.
No native method exists yet in the DOM specifications to retrieve the events defined through the method addEventListener.

Только в консоли отладки браузеров доступна функция перечисления обработчиков событий.
getEventListeners(domElement)

Таким образом даже получить все обработчики событий оказалось на удивление сложнее, чем я думал.
Ну и дальше идет конечно огромное препятствие в виде ссылок на функции, которые как уже писали выше невозможно восстановить штатными средствами.
В ссылке на функцию есть указатель на скрипт и номер строки, т.е. найти это строку то можно, но вот создать указатель на определенную в ней функцию штатными средствами нельзя.
https://i.imgur.com/m5KTu2x.png
45 Вафель
 
27.06.21
10:09
А если учесть что функции могут иметь замыкания, то все...
46 Вафель
 
27.06.21
10:10
Типа
А=1;
F=x=>x+A
47 sikuda
 
27.06.21
21:29
(46) Да современный сайт без кода серверной части в общем случае не востанавливается.
ТС смирись
48 TormozIT
 
гуру
27.06.21
22:22
(47) Вроде в (0) написано, что серверной части нет.