Home | History | Annotate | Download | only in renderer_host
      1 // Copyright 2014 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 #ifndef CHROME_BROWSER_RENDERER_HOST_CHROME_EXTENSION_MESSAGE_FILTER_H_
      6 #define CHROME_BROWSER_RENDERER_HOST_CHROME_EXTENSION_MESSAGE_FILTER_H_
      7 
      8 #include <string>
      9 
     10 #include "base/sequenced_task_runner_helpers.h"
     11 #include "content/public/browser/browser_message_filter.h"
     12 #include "content/public/browser/notification_observer.h"
     13 #include "content/public/browser/notification_registrar.h"
     14 
     15 class GURL;
     16 class Profile;
     17 struct ExtensionHostMsg_APIActionOrEvent_Params;
     18 struct ExtensionHostMsg_DOMAction_Params;
     19 struct ExtensionMsg_ExternalConnectionInfo;
     20 
     21 namespace base {
     22 class FilePath;
     23 }
     24 
     25 namespace extensions {
     26 class InfoMap;
     27 struct Message;
     28 }
     29 
     30 // This class filters out incoming Chrome-specific IPC messages from the
     31 // extension process on the IPC thread.
     32 class ChromeExtensionMessageFilter : public content::BrowserMessageFilter,
     33                                      public content::NotificationObserver {
     34  public:
     35   ChromeExtensionMessageFilter(int render_process_id, Profile* profile);
     36 
     37   // content::BrowserMessageFilter methods:
     38   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     39   virtual void OverrideThreadForMessage(
     40       const IPC::Message& message,
     41       content::BrowserThread::ID* thread) OVERRIDE;
     42   virtual void OnDestruct() const OVERRIDE;
     43 
     44  private:
     45   friend class content::BrowserThread;
     46   friend class base::DeleteHelper<ChromeExtensionMessageFilter>;
     47 
     48   virtual ~ChromeExtensionMessageFilter();
     49 
     50   // TODO(jamescook): Move these functions into the extensions module. Ideally
     51   // this would be in extensions::ExtensionMessageFilter but that will require
     52   // resolving the MessageService and ActivityLog dependencies on src/chrome.
     53   // http://crbug.com/339637
     54   void OnOpenChannelToExtension(int routing_id,
     55                                 const ExtensionMsg_ExternalConnectionInfo& info,
     56                                 const std::string& channel_name,
     57                                 bool include_tls_channel_id,
     58                                 int* port_id);
     59   void OpenChannelToExtensionOnUIThread(
     60       int source_process_id,
     61       int source_routing_id,
     62       int receiver_port_id,
     63       const ExtensionMsg_ExternalConnectionInfo& info,
     64       const std::string& channel_name,
     65       bool include_tls_channel_id);
     66   void OnOpenChannelToNativeApp(int routing_id,
     67                                 const std::string& source_extension_id,
     68                                 const std::string& native_app_name,
     69                                 int* port_id);
     70   void OpenChannelToNativeAppOnUIThread(int source_routing_id,
     71                                         int receiver_port_id,
     72                                         const std::string& source_extension_id,
     73                                         const std::string& native_app_name);
     74   void OnOpenChannelToTab(int routing_id, int tab_id,
     75                           const std::string& extension_id,
     76                           const std::string& channel_name, int* port_id);
     77   void OpenChannelToTabOnUIThread(int source_process_id, int source_routing_id,
     78                                   int receiver_port_id,
     79                                   int tab_id, const std::string& extension_id,
     80                                   const std::string& channel_name);
     81   void OnPostMessage(int port_id, const extensions::Message& message);
     82   void OnGetExtMessageBundle(const std::string& extension_id,
     83                              IPC::Message* reply_msg);
     84   void OnGetExtMessageBundleOnBlockingPool(
     85       const base::FilePath& extension_path,
     86       const std::string& extension_id,
     87       const std::string& default_locale,
     88       IPC::Message* reply_msg);
     89   void OnExtensionCloseChannel(int port_id, const std::string& error_message);
     90   void OnAddAPIActionToExtensionActivityLog(
     91       const std::string& extension_id,
     92       const ExtensionHostMsg_APIActionOrEvent_Params& params);
     93   void OnAddBlockedCallToExtensionActivityLog(
     94       const std::string& extension_id,
     95       const std::string& function_name);
     96   void OnAddDOMActionToExtensionActivityLog(
     97       const std::string& extension_id,
     98       const ExtensionHostMsg_DOMAction_Params& params);
     99   void OnAddEventToExtensionActivityLog(
    100       const std::string& extension_id,
    101       const ExtensionHostMsg_APIActionOrEvent_Params& params);
    102 
    103   // content::NotificationObserver implementation.
    104   virtual void Observe(int type,
    105                        const content::NotificationSource& source,
    106                        const content::NotificationDetails& details) OVERRIDE;
    107 
    108   const int render_process_id_;
    109 
    110   // The Profile associated with our renderer process.  This should only be
    111   // accessed on the UI thread! Furthermore since this class is refcounted it
    112   // may outlive |profile_|, so make sure to NULL check if in doubt; async
    113   // calls and the like.
    114   Profile* profile_;
    115 
    116   scoped_refptr<extensions::InfoMap> extension_info_map_;
    117 
    118   content::NotificationRegistrar notification_registrar_;
    119 
    120   DISALLOW_COPY_AND_ASSIGN(ChromeExtensionMessageFilter);
    121 };
    122 
    123 #endif  // CHROME_BROWSER_RENDERER_HOST_CHROME_EXTENSION_MESSAGE_FILTER_H_
    124