geolocation_permission_context_extensions.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/geolocation/geolocation_permission_context_extensions.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/callback.h" 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/content_settings/permission_request_id.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/extensions/suggest_permission_util.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/guest_view/web_view/web_view_guest.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/extension_registry.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/process_map.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/browser/view_type_utils.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "extensions/common/extension.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using extensions::APIPermission; 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using extensions::ExtensionRegistry; 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GeolocationPermissionContextExtensions:: 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GeolocationPermissionContextExtensions(Profile* profile) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : profile_(profile) { 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GeolocationPermissionContextExtensions:: 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)~GeolocationPermissionContextExtensions() { 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool GeolocationPermissionContextExtensions::RequestPermission( 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::WebContents* web_contents, 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const PermissionRequestID& request_id, 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bridge_id, 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const GURL& requesting_frame, 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool user_gesture, 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Callback<void(bool)> callback, 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool* permission_set, 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool* new_permission) { 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GURL requesting_frame_origin = requesting_frame.GetOrigin(); 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebViewGuest* guest = WebViewGuest::FromWebContents(web_contents); 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (guest) { 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) guest->RequestGeolocationPermission(bridge_id, 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) requesting_frame, 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) user_gesture, 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) callback); 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *permission_set = false; 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *new_permission = false; 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ExtensionRegistry* extension_registry = ExtensionRegistry::Get(profile_); 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (extension_registry) { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const extensions::Extension* extension = 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension_registry->enabled_extensions().GetExtensionOrAppByURL( 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) requesting_frame_origin); 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (IsExtensionWithPermissionOrSuggestInConsole( 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) APIPermission::kGeolocation, extension, 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_contents->GetRenderViewHost())) { 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Make sure the extension is in the calling process. 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (extensions::ProcessMap::Get(profile_)->Contains( 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extension->id(), request_id.render_process_id())) { 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *permission_set = true; 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *new_permission = true; 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (extensions::GetViewType(web_contents) != 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) extensions::VIEW_TYPE_TAB_CONTENTS) { 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The tab may have gone away, or the request may not be from a tab at all. 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(mpcomplete): the request could be from a background page or 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // extension popup (web_contents will have a different ViewType). But why do 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // we care? Shouldn't we still put an infobar up in the current tab? 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(WARNING) << "Attempt to use geolocation tabless renderer: " 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << request_id.ToString() 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << " (can't prompt user without a visible tab)"; 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *permission_set = true; 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) *new_permission = false; 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool GeolocationPermissionContextExtensions::CancelPermissionRequest( 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::WebContents* web_contents, 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int bridge_id) { 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_EXTENSIONS) 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebViewGuest* guest = 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_contents ? WebViewGuest::FromWebContents(web_contents) : NULL; 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (guest) { 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) guest->CancelGeolocationPermissionRequest(bridge_id); 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return true; 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(ENABLE_EXTENSIONS) 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return false; 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 103