• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/extensions/suggest_permission_util.h"
6 
7 #include "chrome/browser/extensions/extension_system.h"
8 #include "chrome/common/extensions/extension_messages.h"
9 #include "content/public/browser/render_view_host.h"
10 #include "content/public/common/console_message_level.h"
11 #include "extensions/browser/process_manager.h"
12 #include "extensions/common/extension.h"
13 #include "extensions/common/permissions/permissions_info.h"
14 
15 using content::CONSOLE_MESSAGE_LEVEL_WARNING;
16 using content::RenderViewHost;
17 
18 const char kPermissionsHelpURLForExtensions[] =
19     "http://developer.chrome.com/extensions/manifest.html#permissions";
20 const char kPermissionsHelpURLForApps[] =
21     "http://developer.chrome.com/apps/declare_permissions.html";
22 
23 namespace extensions {
24 
SuggestAPIPermissionInDevToolsConsole(APIPermission::ID permission,const Extension * extension,content::RenderViewHost * host)25 void SuggestAPIPermissionInDevToolsConsole(APIPermission::ID permission,
26                                            const Extension* extension,
27                                            content::RenderViewHost* host) {
28   if (!extension || !host)
29     return;
30 
31   const APIPermissionInfo* permission_info =
32       PermissionsInfo::GetInstance()->GetByID(permission);
33   CHECK(permission_info);
34 
35   // Note, intentionally not internationalizing this string, as it is output
36   // as a log message to developers in the developer tools console.
37   std::string message = base::StringPrintf(
38       "Is the '%s' permission appropriate? See %s.",
39       permission_info->name(),
40       extension->is_platform_app() ?
41           kPermissionsHelpURLForApps : kPermissionsHelpURLForExtensions);
42 
43   host->Send(new ExtensionMsg_AddMessageToConsole(
44       host->GetRoutingID(), CONSOLE_MESSAGE_LEVEL_WARNING, message));
45 }
46 
SuggestAPIPermissionInDevToolsConsole(APIPermission::ID permission,const Extension * extension,Profile * profile)47 void SuggestAPIPermissionInDevToolsConsole(APIPermission::ID permission,
48                                            const Extension* extension,
49                                            Profile* profile) {
50   extensions::ProcessManager* process_manager =
51       extensions::ExtensionSystem::Get(profile)->process_manager();
52 
53   std::set<content::RenderViewHost*> views =
54       process_manager->GetRenderViewHostsForExtension(extension->id());
55 
56   for (std::set<RenderViewHost*>::const_iterator iter = views.begin();
57        iter != views.end(); ++iter) {
58     RenderViewHost* host = *iter;
59     SuggestAPIPermissionInDevToolsConsole(permission, extension, host);
60   }
61 }
62 
IsExtensionWithPermissionOrSuggestInConsole(APIPermission::ID permission,const Extension * extension,content::RenderViewHost * host)63 bool IsExtensionWithPermissionOrSuggestInConsole(
64     APIPermission::ID permission,
65     const Extension* extension,
66     content::RenderViewHost* host) {
67   if (extension && extension->HasAPIPermission(permission))
68     return true;
69 
70   if (extension)
71     SuggestAPIPermissionInDevToolsConsole(permission, extension, host);
72 
73   return false;
74 }
75 
IsExtensionWithPermissionOrSuggestInConsole(APIPermission::ID permission,const Extension * extension,Profile * profile)76 bool IsExtensionWithPermissionOrSuggestInConsole(
77     APIPermission::ID permission,
78     const Extension* extension,
79     Profile* profile) {
80   if (extension && extension->HasAPIPermission(permission))
81     return true;
82 
83   if (extension)
84     SuggestAPIPermissionInDevToolsConsole(permission, extension, profile);
85 
86   return false;
87 }
88 
89 } // namespace extensions
90