# MicrosoftLoginDialog.qml Окно входа в аккаунт Microsoft. Работает так же, как официальный лаунчер: страница входа открывается внутри приложения в `WebEngineView`, а лаунчер ждёт, когда браузер перейдёт на `redirect_uri` с кодом в адресе. Файл попадает в QML-модуль, только если CMake нашёл `Qt6::WebEngineQuick`. Поэтому [Main](Main.md) не объявляет окно в разметке, а создаёт его через `Qt.createComponent()` при первом входе (`openMicrosoftLogin()`). ## Интерфейс | | | |---|---| | `backend` (required) | `LauncherBackend` | | `openAt(url)` | открыть страницу входа | | `failed(message)` | вход не удался. Окно ничего не знает о плашке сообщений главного окна и сообщает о неудаче сигналом | ## Как работает На каждое `urlChanged` вызывается `handleUrl()`. Он передаёт адрес в `backend.inspectMicrosoftRedirect()`. Разбор сделан в C++, чтобы правила совпадали с тем, как [MsaAuthService](../cpp/MsaAuthService.md) строит `redirect_uri`. Когда адрес совпал: - окно закрывается, `codeTaken` выставляется в `true`; - если есть код, вызывается `backend.finishMicrosoftLogin(code)`; - если кода нет, вызывается `backend.cancelMicrosoftLogin()` и испускается `failed` с текстом от Microsoft или общим «вход не завершён». `codeTaken` нужен потому, что `WebEngineView` может сообщить об одном и том же адресе несколько раз, а отдавать код дважды нельзя. Кнопка «Отмена» выставляет `codeTaken`, закрывает окно и вызывает `cancelMicrosoftLogin()`. Щелчок мимо окна и Esc его не закрывают. ## Куки Профиль браузера создаётся через `WebEngineProfilePrototype` без `storageName`, то есть только в памяти. Куки живут, пока работает лаунчер, и в общий браузер не попадают. Выбрать другой аккаунт в пределах одного запуска позволяет `prompt=select_account` в адресе входа. --- При создании этого документа использовался ИИ.