При использовании инструментов разработчика Chrome кажется, что каждое окно приложения (и фоновая «страница») имеет свой собственный контекст javascript (пространство объектов, поток выполнения), и все же обратный вызов createdWindow для chrome.app.window.create, по-видимому, обеспечивает прямой доступ к объектам только что созданного «другого» окна.

Учитывая это, я не знаю, как лучше всего общаться между окнами; например если я открываю второе окно, которое действует как диалоговое окно, когда пользователь нажимает кнопку «ОК» для сохранения изменений, следует ли мне использовать postMessage, sendMessage или просто вызывать функцию для объекта в главном окне. Я просмотрел образцы обмена сообщениями, и, похоже, они сосредоточены на взаимодействии между двумя разными приложениями или между приложением и расширением.

Итак, я ищу четкое описание памяти и модели выполнения в одном приложении. Действительно ли существуют отдельные контексты или это всего лишь одно пространство объектов с одним потоком выполнения? Как лучше всего взаимодействовать между окнами одного и того же приложения Chrome?

6
James Synge 24 Дек 2013 в 23:25

2 ответа

Лучший ответ

Это отличный вопрос, Джеймс!

Несколько хромированных окон не полностью разделены. Они разделяют один поток и пространство объектов, однако объект окна у каждого свой. В javascript ссылки на объекты с незаданной областью ищутся в текущем окне, поэтому окна выглядят как разные объектные пространства, но на самом деле это не так.

Таким образом, вы можете войти в другое окно и выполнить там функцию или манипулировать состоянием другими способами (например, установить переменную в другом окне на функцию из текущего окна), и это приемлемо и поддерживается.

6
Ben Wells 6 Янв 2014 в 02:49

Вы можете найти chrome.app.window.getAll () и < полезные методы href = "http://developer.chrome.com/apps/app_window.html#method-get" rel = "nofollow"> chrome.app.window.get () . Однако они являются новыми для Chrome 33, который еще не находится в стабильном канале.

В качестве альтернативы вы можете хранить массив открытых объектов AppWindow в контексте фоновой страницы.

Затем вы можете получить ссылку на контекст фоновой страницы из любого окна, используя chrome.runtime .getBackgroundPage () метод

3
lostsource 26 Дек 2013 в 11:03