Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2011 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 // IPC messages for extensions.
      6 // Multiply-included message file, hence no include guard.
      7 
      8 #include "base/shared_memory.h"
      9 #include "base/values.h"
     10 #include "chrome/common/extensions/extension.h"
     11 #include "chrome/common/extensions/extension_extent.h"
     12 #include "chrome/common/extensions/url_pattern.h"
     13 #include "chrome/common/web_apps.h"
     14 #include "ipc/ipc_message_macros.h"
     15 
     16 #define IPC_MESSAGE_START ExtensionMsgStart
     17 
     18 // Parameters structure for ExtensionHostMsg_Request.
     19 IPC_STRUCT_BEGIN(ExtensionHostMsg_DomMessage_Params)
     20   // Message name.
     21   IPC_STRUCT_MEMBER(std::string, name)
     22 
     23   // List of message arguments.
     24   IPC_STRUCT_MEMBER(ListValue, arguments)
     25 
     26   // URL of the frame request was sent from.
     27   IPC_STRUCT_MEMBER(GURL, source_url)
     28 
     29   // Unique request id to match requests and responses.
     30   IPC_STRUCT_MEMBER(int, request_id)
     31 
     32   // True if request has a callback specified.
     33   IPC_STRUCT_MEMBER(bool, has_callback)
     34 
     35   // True if request is executed in response to an explicit user gesture.
     36   IPC_STRUCT_MEMBER(bool, user_gesture)
     37 IPC_STRUCT_END()
     38 
     39 // Allows an extension to execute code in a tab.
     40 IPC_STRUCT_BEGIN(ExtensionMsg_ExecuteCode_Params)
     41   // The extension API request id, for responding.
     42   IPC_STRUCT_MEMBER(int, request_id)
     43 
     44   // The ID of the requesting extension. To know which isolated world to
     45   // execute the code inside of.
     46   IPC_STRUCT_MEMBER(std::string, extension_id)
     47 
     48   // Whether the code is JavaScript or CSS.
     49   IPC_STRUCT_MEMBER(bool, is_javascript)
     50 
     51   // String of code to execute.
     52   IPC_STRUCT_MEMBER(std::string, code)
     53 
     54   // Whether to inject into all frames, or only the root frame.
     55   IPC_STRUCT_MEMBER(bool, all_frames)
     56 
     57   // Whether to execute code in the main world (as opposed to an isolated
     58   // world).
     59   IPC_STRUCT_MEMBER(bool, in_main_world)
     60 IPC_STRUCT_END()
     61 
     62 IPC_STRUCT_TRAITS_BEGIN(WebApplicationInfo::IconInfo)
     63   IPC_STRUCT_TRAITS_MEMBER(url)
     64   IPC_STRUCT_TRAITS_MEMBER(width)
     65   IPC_STRUCT_TRAITS_MEMBER(height)
     66   IPC_STRUCT_TRAITS_MEMBER(data)
     67 IPC_STRUCT_TRAITS_END()
     68 
     69 IPC_STRUCT_TRAITS_BEGIN(WebApplicationInfo)
     70   IPC_STRUCT_TRAITS_MEMBER(title)
     71   IPC_STRUCT_TRAITS_MEMBER(description)
     72   IPC_STRUCT_TRAITS_MEMBER(app_url)
     73   IPC_STRUCT_TRAITS_MEMBER(icons)
     74   IPC_STRUCT_TRAITS_MEMBER(permissions)
     75   IPC_STRUCT_TRAITS_MEMBER(launch_container)
     76 IPC_STRUCT_TRAITS_END()
     77 
     78 // Singly-included section for custom IPC traits.
     79 #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_MESSAGES_H_
     80 #define CHROME_COMMON_EXTENSIONS_EXTENSION_MESSAGES_H_
     81 
     82 // IPC_MESSAGE macros choke on extra , in the std::map, when expanding. We need
     83 // to typedef it to avoid that.
     84 // Substitution map for l10n messages.
     85 typedef std::map<std::string, std::string> SubstitutionMap;
     86 
     87 struct ExtensionMsg_Loaded_Params {
     88   ExtensionMsg_Loaded_Params();
     89   ~ExtensionMsg_Loaded_Params();
     90   explicit ExtensionMsg_Loaded_Params(const Extension* extension);
     91 
     92   // A copy constructor is needed because this structure can end up getting
     93   // copied inside the IPC machinery on gcc <= 4.2.
     94   ExtensionMsg_Loaded_Params(const ExtensionMsg_Loaded_Params& other);
     95 
     96   // Creates a new extension from the data in this object.
     97   scoped_refptr<Extension> ConvertToExtension() const;
     98 
     99   // The subset of the extension manifest data we send to renderers.
    100   scoped_ptr<DictionaryValue> manifest;
    101 
    102   // The location the extension was installed from.
    103   Extension::Location location;
    104 
    105   // The path the extension was loaded from. This is used in the renderer only
    106   // to generate the extension ID for extensions that are loaded unpacked.
    107   FilePath path;
    108 
    109   // We keep this separate so that it can be used in logging.
    110   std::string id;
    111 };
    112 
    113 namespace IPC {
    114 
    115 template <>
    116 struct ParamTraits<URLPattern> {
    117   typedef URLPattern param_type;
    118   static void Write(Message* m, const param_type& p);
    119   static bool Read(const Message* m, void** iter, param_type* p);
    120   static void Log(const param_type& p, std::string* l);
    121 };
    122 
    123 template <>
    124 struct ParamTraits<ExtensionExtent> {
    125   typedef ExtensionExtent param_type;
    126   static void Write(Message* m, const param_type& p);
    127   static bool Read(const Message* m, void** iter, param_type* p);
    128   static void Log(const param_type& p, std::string* l);
    129 };
    130 
    131 template <>
    132 struct ParamTraits<ExtensionMsg_Loaded_Params> {
    133   typedef ExtensionMsg_Loaded_Params param_type;
    134   static void Write(Message* m, const param_type& p);
    135   static bool Read(const Message* m, void** iter, param_type* p);
    136   static void Log(const param_type& p, std::string* l);
    137 };
    138 
    139 }  // namespace IPC
    140 
    141 #endif  // CHROME_COMMON_EXTENSIONS_EXTENSION_MESSAGES_H_
    142 
    143 // Messages sent from the browser to the renderer.
    144 
    145 // The browser sends this message in response to all extension api calls.
    146 IPC_MESSAGE_ROUTED4(ExtensionMsg_Response,
    147                     int /* request_id */,
    148                     bool /* success */,
    149                     std::string /* response */,
    150                     std::string /* error */)
    151 
    152 // This message is optionally routed.  If used as a control message, it
    153 // will call a javascript function in every registered context in the
    154 // target process.  If routed, it will be restricted to the contexts that
    155 // are part of the target RenderView.
    156 // If |extension_id| is non-empty, the function will be invoked only in
    157 // contexts owned by the extension. |args| is a list of primitive Value types
    158 // that are passed to the function.
    159 IPC_MESSAGE_ROUTED4(ExtensionMsg_MessageInvoke,
    160                     std::string /* extension_id */,
    161                     std::string /* function_name */,
    162                     ListValue /* args */,
    163                     GURL /* event URL */)
    164 
    165 // Tell the renderer process all known extension function names.
    166 IPC_MESSAGE_CONTROL1(ExtensionMsg_SetFunctionNames,
    167                      std::vector<std::string>)
    168 
    169 // TODO(aa): SetAPIPermissions, SetHostPermissions, and possibly
    170 // UpdatePageActions should be replaced with just sending additional data in
    171 // ExtensionLoaded. See: crbug.com/70516.
    172 
    173 // Tell the renderer process which permissions the given extension has. See
    174 // Extension::Permissions for which elements correspond to which permissions.
    175 IPC_MESSAGE_CONTROL2(ExtensionMsg_SetAPIPermissions,
    176                      std::string /* extension_id */,
    177                      std::set<std::string> /* permissions */)
    178 
    179 // Tell the renderer process which host permissions the given extension has.
    180 IPC_MESSAGE_CONTROL2(ExtensionMsg_SetHostPermissions,
    181                      GURL /* source extension's origin */,
    182                      /* URLPatterns the extension can access */
    183                      std::vector<URLPattern>)
    184 
    185 // Tell the renderer process all known page action ids for a particular
    186 // extension.
    187 IPC_MESSAGE_CONTROL2(ExtensionMsg_UpdatePageActions,
    188                      std::string /* extension_id */,
    189                      std::vector<std::string> /* page_action_ids */)
    190 
    191 // Notifies the renderer that an extension was loaded in the browser.
    192 IPC_MESSAGE_CONTROL1(ExtensionMsg_Loaded,
    193                      ExtensionMsg_Loaded_Params)
    194 
    195 // Notifies the renderer that an extension was unloaded in the browser.
    196 IPC_MESSAGE_CONTROL1(ExtensionMsg_Unloaded,
    197                      std::string)
    198 
    199 // Updates the scripting whitelist for extensions in the render process. This is
    200 // only used for testing.
    201 IPC_MESSAGE_CONTROL1(ExtensionMsg_SetScriptingWhitelist,
    202                      Extension::ScriptingWhitelist /* extenison ids */)
    203 
    204 // Notification that renderer should run some JavaScript code.
    205 IPC_MESSAGE_ROUTED1(ExtensionMsg_ExecuteCode,
    206                     ExtensionMsg_ExecuteCode_Params)
    207 
    208 // Notification that the user scripts have been updated. It has one
    209 // SharedMemoryHandle argument consisting of the pickled script data. This
    210 // handle is valid in the context of the renderer.
    211 IPC_MESSAGE_CONTROL1(ExtensionMsg_UpdateUserScripts,
    212                      base::SharedMemoryHandle)
    213 
    214 // Requests application info for the page. The renderer responds back with
    215 // ExtensionHostMsg_DidGetApplicationInfo.
    216 IPC_MESSAGE_ROUTED1(ExtensionMsg_GetApplicationInfo,
    217                     int32 /*page_id*/)
    218 
    219 // Messages sent from the renderer to the browser.
    220 
    221 // A renderer sends this message when an extension process starts an API
    222 // request. The browser will always respond with a ExtensionMsg_Response.
    223 IPC_MESSAGE_ROUTED1(ExtensionHostMsg_Request,
    224                     ExtensionHostMsg_DomMessage_Params)
    225 
    226 // Notify the browser that the given extension added a listener to an event.
    227 IPC_MESSAGE_CONTROL2(ExtensionHostMsg_AddListener,
    228                      std::string /* extension_id */,
    229                      std::string /* name */)
    230 
    231 // Notify the browser that the given extension removed a listener from an
    232 // event.
    233 IPC_MESSAGE_CONTROL2(ExtensionHostMsg_RemoveListener,
    234                      std::string /* extension_id */,
    235                      std::string /* name */)
    236 
    237 // Open a channel to all listening contexts owned by the extension with
    238 // the given ID.  This always returns a valid port ID which can be used for
    239 // sending messages.  If an error occurred, the opener will be notified
    240 // asynchronously.
    241 IPC_SYNC_MESSAGE_CONTROL4_1(ExtensionHostMsg_OpenChannelToExtension,
    242                             int /* routing_id */,
    243                             std::string /* source_extension_id */,
    244                             std::string /* target_extension_id */,
    245                             std::string /* channel_name */,
    246                             int /* port_id */)
    247 
    248 // Get a port handle to the given tab.  The handle can be used for sending
    249 // messages to the extension.
    250 IPC_SYNC_MESSAGE_CONTROL4_1(ExtensionHostMsg_OpenChannelToTab,
    251                             int /* routing_id */,
    252                             int /* tab_id */,
    253                             std::string /* extension_id */,
    254                             std::string /* channel_name */,
    255                             int /* port_id */)
    256 
    257 // Send a message to an extension process.  The handle is the value returned
    258 // by ViewHostMsg_OpenChannelTo*.
    259 IPC_MESSAGE_ROUTED2(ExtensionHostMsg_PostMessage,
    260                     int /* port_id */,
    261                     std::string /* message */)
    262 
    263 // Send a message to an extension process.  The handle is the value returned
    264 // by ViewHostMsg_OpenChannelTo*.
    265 IPC_MESSAGE_CONTROL1(ExtensionHostMsg_CloseChannel,
    266                      int /* port_id */)
    267 
    268 // Used to get the extension message bundle.
    269 IPC_SYNC_MESSAGE_CONTROL1_1(ExtensionHostMsg_GetMessageBundle,
    270                             std::string /* extension id */,
    271                             SubstitutionMap /* message bundle */)
    272 
    273 // Send from the renderer to the browser to return the script running result.
    274 IPC_MESSAGE_ROUTED3(ExtensionHostMsg_ExecuteCodeFinished,
    275                     int /* request id */,
    276                     bool /* whether the script ran successfully */,
    277                     std::string /* error message */)
    278 
    279 IPC_MESSAGE_ROUTED2(ExtensionHostMsg_DidGetApplicationInfo,
    280                     int32 /* page_id */,
    281                     WebApplicationInfo)
    282 
    283 // Sent by the renderer to implement chrome.app.installApplication().
    284 IPC_MESSAGE_ROUTED1(ExtensionHostMsg_InstallApplication,
    285                     WebApplicationInfo)
    286