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