1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
|
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/lobster/lobster_bubble_coordinator.h"
#include <optional>
#include <string_view>
#include "ash/constants/ash_features.h"
#include "base/feature_list.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/ash/lobster/lobster_view.h"
#include "chrome/browser/ui/webui/ash/mako/mako_ui.h"
#include "chrome/browser/ui/webui/ash/mako/url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "net/base/url_util.h"
namespace ash {
LobsterBubbleCoordinator::LobsterBubbleCoordinator() = default;
LobsterBubbleCoordinator::~LobsterBubbleCoordinator() {
CloseUI();
}
void LobsterBubbleCoordinator::LoadUI(Profile* profile,
std::optional<std::string_view> query,
LobsterMode mode,
const gfx::Rect& caret_bounds,
bool should_show_feedback_ui) {
if (IsShowingUI()) {
contents_wrapper_->CloseUI();
}
GURL url = GURL(kChromeUILobsterURL);
if (query.has_value()) {
url = net::AppendOrReplaceQueryParameter(url, kLobsterPromptParamKey,
query.value());
}
url = net::AppendOrReplaceQueryParameter(url, kLobsterModeParamKey,
mode == LobsterMode::kInsert
? kLobsterInsertModeValue
: kLobsterDownloadModeValue);
url = net::AppendOrReplaceQueryParameter(
url, kLobsterFeedbackEnabledParamKey,
should_show_feedback_ui ? "true" : "false");
contents_wrapper_ = std::make_unique<WebUIContentsWrapperT<MakoUntrustedUI>>(
url, profile, IDS_ACCNAME_ORCA,
/*esc_closes_ui=*/false);
std::unique_ptr<LobsterView> lobster_view =
std::make_unique<LobsterView>(contents_wrapper_.get(), caret_bounds);
auto bubble = lobster_view->GetWeakPtr();
views::BubbleDialogDelegateView::CreateBubble(std::move(lobster_view));
if (bubble->GetWidget()) {
widget_observation_.Observe(bubble->GetWidget());
}
}
void LobsterBubbleCoordinator::ShowUI() {
if (contents_wrapper_) {
contents_wrapper_->ShowUI();
}
}
void LobsterBubbleCoordinator::CloseUI() {
if (contents_wrapper_) {
contents_wrapper_->CloseUI();
contents_wrapper_ = nullptr;
}
widget_observation_.Reset();
}
bool LobsterBubbleCoordinator::IsShowingUI() const {
// TODO(b/301518440): To accurately check if the bubble is open, detect when
// the JS has finished loading instead of checking this pointer.
return contents_wrapper_ != nullptr &&
contents_wrapper_->GetHost() != nullptr;
}
void LobsterBubbleCoordinator::OnWidgetDestroying(views::Widget* widget) {
CloseUI();
}
} // namespace ash
|