11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/api/context_menus/context_menus_api.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/extensions/api/context_menus/context_menus_api_helpers.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/profiles/profile.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/common/extensions/api/chrome_web_view_internal.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/common/error_utils.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace helpers = extensions::context_menus_api_helpers;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace webview = extensions::api::chrome_web_view_internal;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace extensions {
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(lazyboy): Add checks similar to
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// WebViewInternalExtensionFunction::RunAsyncSafe(WebViewGuest*).
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ChromeWebViewInternalContextMenusCreateFunction::RunAsync() {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<webview::ContextMenusCreate::Params> params(
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      webview::ContextMenusCreate::Params::Create(*args_));
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXTENSION_FUNCTION_VALIDATE(params.get());
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MenuItem::Id id(
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Profile::FromBrowserContext(browser_context())->IsOffTheRecord(),
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MenuItem::ExtensionKey(extension_id(), params->instance_id));
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (params->create_properties.id.get()) {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    id.string_uid = *params->create_properties.id;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // The Generated Id is added by web_view_internal_custom_bindings.js.
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::DictionaryValue* properties = NULL;
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &properties));
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXTENSION_FUNCTION_VALIDATE(
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        properties->GetInteger(helpers::kGeneratedIdKey, &id.uid));
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool success = extensions::context_menus_api_helpers::CreateMenuItem(
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      params->create_properties,
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Profile::FromBrowserContext(browser_context()),
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      extension(),
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      id,
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      &error_);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendResponse(success);
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return success;
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ChromeWebViewInternalContextMenusUpdateFunction::RunAsync() {
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<webview::ContextMenusUpdate::Params> params(
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      webview::ContextMenusUpdate::Params::Create(*args_));
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXTENSION_FUNCTION_VALIDATE(params.get());
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  Profile* profile = Profile::FromBrowserContext(browser_context());
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MenuItem::Id item_id(
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile->IsOffTheRecord(),
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MenuItem::ExtensionKey(extension_id(), params->instance_id));
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (params->id.as_string)
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    item_id.string_uid = *params->id.as_string;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else if (params->id.as_integer)
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    item_id.uid = *params->id.as_integer;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  else
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool success = extensions::context_menus_api_helpers::UpdateMenuItem(
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      params->update_properties, profile, extension(), item_id, &error_);
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendResponse(success);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return success;
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ChromeWebViewInternalContextMenusRemoveFunction::RunAsync() {
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<webview::ContextMenusRemove::Params> params(
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      webview::ContextMenusRemove::Params::Create(*args_));
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXTENSION_FUNCTION_VALIDATE(params.get());
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MenuManager* menu_manager =
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MenuManager::Get(Profile::FromBrowserContext(browser_context()));
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MenuItem::Id id(
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Profile::FromBrowserContext(browser_context())->IsOffTheRecord(),
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MenuItem::ExtensionKey(extension_id(), params->instance_id));
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (params->menu_item_id.as_string) {
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    id.string_uid = *params->menu_item_id.as_string;
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (params->menu_item_id.as_integer) {
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    id.uid = *params->menu_item_id.as_integer;
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NOTREACHED();
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool success = true;
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MenuItem* item = menu_manager->GetItemById(id);
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Ensure one <webview> can't remove another's menu items.
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!item || item->id().extension_key != id.extension_key) {
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    error_ = ErrorUtils::FormatErrorMessage(
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        context_menus_api_helpers::kCannotFindItemError,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        context_menus_api_helpers::GetIDString(id));
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    success = false;
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else if (!menu_manager->RemoveContextMenuItem(id)) {
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    success = false;
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendResponse(success);
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return success;
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ChromeWebViewInternalContextMenusRemoveAllFunction::RunAsync() {
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<webview::ContextMenusRemoveAll::Params> params(
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      webview::ContextMenusRemoveAll::Params::Create(*args_));
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXTENSION_FUNCTION_VALIDATE(params.get());
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MenuManager* menu_manager =
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MenuManager::Get(Profile::FromBrowserContext(browser_context()));
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int webview_instance_id = params->instance_id;
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  menu_manager->RemoveAllContextItems(
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      MenuItem::ExtensionKey(extension()->id(), webview_instance_id));
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendResponse(true);
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciChromeWebViewInternalShowContextMenuFunction::
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ChromeWebViewInternalShowContextMenuFunction() {
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciChromeWebViewInternalShowContextMenuFunction::
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ~ChromeWebViewInternalShowContextMenuFunction() {
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ChromeWebViewInternalShowContextMenuFunction::RunAsyncSafe(
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WebViewGuest* guest) {
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<webview::ShowContextMenu::Params> params(
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      webview::ShowContextMenu::Params::Create(*args_));
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXTENSION_FUNCTION_VALIDATE(params.get());
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(lazyboy): Actually implement filtering menu items, we pass NULL for
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // now.
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  guest->ShowContextMenu(params->request_id, NULL);
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SendResponse(true);
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace extensions
147