File: controlled_frame_internal_api.cc

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (100 lines) | stat: -rw-r--r-- 3,922 bytes parent folder | download | duplicates (4)
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
92
93
94
95
96
97
98
99
100
// 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/context_menu_helpers.h"
#include "chrome/browser/extensions/menu_manager.h"
#include "chrome/common/controlled_frame/api/controlled_frame_internal.h"
#include "chrome/common/extensions/api/chrome_web_view_internal.h"
#include "components/guest_view/browser/guest_view.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h"

namespace webview = extensions::api::chrome_web_view_internal;
namespace controlled_frame_internal =
    controlled_frame::api::controlled_frame_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()->GetDeprecatedID(),
          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_menu_helpers::CreateMenuItem(
      params->create_properties, Profile::FromBrowserContext(browser_context()),
      /*extension=*/nullptr, id, &error);
  return RespondNow(success ? NoArguments() : Error(error));
}

ExtensionFunction::ResponseAction
ControlledFrameInternalContextMenusUpdateFunction::Run() {
  std::optional<webview::ContextMenusUpdate::Params> params =
      webview::ContextMenusUpdate::Params::Create(args());

  extensions::MenuItem::Id id(
      browser_context()->IsOffTheRecord(),
      extensions::MenuItem::ExtensionKey(
          /*extension_id=*/std::string(),
          render_frame_host()->GetProcess()->GetDeprecatedID(),
          render_frame_host()->GetRoutingID(), params->instance_id));

  if (params->id.as_string) {
    id.string_uid = *params->id.as_string;
  } else if (params->id.as_integer) {
    id.uid = *params->id.as_integer;
  } else {
    NOTREACHED();
  }

  std::string error;
  bool success = extensions::context_menu_helpers::UpdateMenuItem(
      params->update_properties, Profile::FromBrowserContext(browser_context()),
      /*extension=*/nullptr, id, &error);
  return RespondNow(success ? NoArguments() : Error(error));
}

ExtensionFunction::ResponseAction
ControlledFrameInternalSetClientHintsEnabledFunction::Run() {
  std::optional<controlled_frame_internal::SetClientHintsEnabled::Params>
      params = controlled_frame_internal::SetClientHintsEnabled::Params::Create(
          args());
  EXTENSION_FUNCTION_VALIDATE(params);

  extensions::WebViewGuest& webview = GetGuest();

  webview.SetClientHintsEnabled(params->enabled);

  return RespondNow(NoArguments());
}

bool ControlledFrameInternalSetClientHintsEnabledFunction::PreRunValidation(
    std::string* error) {
  // Controlled Frame does not have an associated extension.
  EXTENSION_FUNCTION_PRERUN_VALIDATE(!extension());
  return extensions::WebViewInternalExtensionFunction::PreRunValidation(error);
}

}  // namespace controlled_frame