blob: 74ce6090c7844db81007c2615f9c660ca3b1958f [file] [log] [blame]
// 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/controlled_frame/api/controlled_frame_internal_api.h"
#include <memory>
#include "chrome/browser/controlled_frame/controlled_frame_menu_icon_loader.h"
#include "chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h"
#include "chrome/browser/extensions/menu_manager.h"
#include "chrome/common/extensions/api/chrome_web_view_internal.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
namespace webview = extensions::api::chrome_web_view_internal;
namespace controlled_frame {
ExtensionFunction::ResponseAction
ControlledFrameInternalContextMenusCreateFunction::Run() {
CHECK(!extension())
<< "controlledFrame should only be available to Isolated Web Apps.";
std::optional<webview::ContextMenusCreate::Params> params =
webview::ContextMenusCreate::Params::Create(args());
EXTENSION_FUNCTION_VALIDATE(params);
extensions::MenuItem::Id id(
Profile::FromBrowserContext(browser_context())->IsOffTheRecord(),
extensions::MenuItem::ExtensionKey(
/*extension_id=*/std::string(),
render_frame_host()->GetProcess()->GetID(),
render_frame_host()->GetRoutingID(), params->instance_id));
auto* menu_manager = extensions::MenuManager::Get(browser_context());
menu_manager->SetMenuIconLoader(
id.extension_key, std::make_unique<ControlledFrameMenuIconLoader>());
id.string_uid = *params->create_properties.id;
std::string error;
bool success = extensions::context_menus_api_helpers::CreateMenuItem(
params->create_properties, Profile::FromBrowserContext(browser_context()),
/*extension=*/nullptr, id, &error);
return RespondNow(success ? NoArguments() : Error(error));
}
} // namespace controlled_frame