146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifndef CHROME_BROWSER_RENDERER_HOST_CHROME_EXTENSION_MESSAGE_FILTER_H_
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define CHROME_BROWSER_RENDERER_HOST_CHROME_EXTENSION_MESSAGE_FILTER_H_
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <string>
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/sequenced_task_runner_helpers.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/browser/browser_message_filter.h"
12d7582f30d3b217d8144db8429955efdca442508fBo Liu#include "content/public/browser/notification_observer.h"
13d7582f30d3b217d8144db8429955efdca442508fBo Liu#include "content/public/browser/notification_registrar.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class GURL;
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class Profile;
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct ExtensionHostMsg_APIActionOrEvent_Params;
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct ExtensionHostMsg_DOMAction_Params;
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)struct ExtensionMsg_ExternalConnectionInfo;
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace base {
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class FilePath;
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace extensions {
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class InfoMap;
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// This class filters out incoming Chrome-specific IPC messages from the
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// extension process on the IPC thread.
31d7582f30d3b217d8144db8429955efdca442508fBo Liuclass ChromeExtensionMessageFilter : public content::BrowserMessageFilter,
32d7582f30d3b217d8144db8429955efdca442508fBo Liu                                     public content::NotificationObserver {
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ChromeExtensionMessageFilter(int render_process_id, Profile* profile);
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // content::BrowserMessageFilter methods:
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual void OverrideThreadForMessage(
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const IPC::Message& message,
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      content::BrowserThread::ID* thread) OVERRIDE;
41d7582f30d3b217d8144db8429955efdca442508fBo Liu  virtual void OnDestruct() const OVERRIDE;
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  friend class content::BrowserThread;
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  friend class base::DeleteHelper<ChromeExtensionMessageFilter>;
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~ChromeExtensionMessageFilter();
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnCanTriggerClipboardRead(const GURL& origin, bool* allowed);
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnCanTriggerClipboardWrite(const GURL& origin, bool* allowed);
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // TODO(jamescook): Move these functions into the extensions module. Ideally
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // this would be in extensions::ExtensionMessageFilter but that will require
5446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // resolving the MessageService and ActivityLog dependencies on src/chrome.
5546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // http://crbug.com/339637
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnOpenChannelToExtension(int routing_id,
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                const ExtensionMsg_ExternalConnectionInfo& info,
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                const std::string& channel_name,
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                bool include_tls_channel_id,
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                int* port_id);
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OpenChannelToExtensionOnUIThread(
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      int source_process_id,
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      int source_routing_id,
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      int receiver_port_id,
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const ExtensionMsg_ExternalConnectionInfo& info,
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& channel_name,
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      bool include_tls_channel_id);
6846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnOpenChannelToNativeApp(int routing_id,
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                const std::string& source_extension_id,
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                const std::string& native_app_name,
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                int* port_id);
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OpenChannelToNativeAppOnUIThread(int source_routing_id,
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                        int receiver_port_id,
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                        const std::string& source_extension_id,
7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                        const std::string& native_app_name);
7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnOpenChannelToTab(int routing_id, int tab_id,
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          const std::string& extension_id,
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          const std::string& channel_name, int* port_id);
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OpenChannelToTabOnUIThread(int source_process_id, int source_routing_id,
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  int receiver_port_id,
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  int tab_id, const std::string& extension_id,
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                  const std::string& channel_name);
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnGetExtMessageBundle(const std::string& extension_id,
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                             IPC::Message* reply_msg);
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnGetExtMessageBundleOnBlockingPool(
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const base::FilePath& extension_path,
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& extension_id,
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& default_locale,
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      IPC::Message* reply_msg);
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnExtensionCloseChannel(int port_id, const std::string& error_message);
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnAddAPIActionToExtensionActivityLog(
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& extension_id,
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const ExtensionHostMsg_APIActionOrEvent_Params& params);
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnAddBlockedCallToExtensionActivityLog(
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& extension_id,
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& function_name);
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnAddDOMActionToExtensionActivityLog(
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& extension_id,
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const ExtensionHostMsg_DOMAction_Params& params);
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void OnAddEventToExtensionActivityLog(
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const std::string& extension_id,
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      const ExtensionHostMsg_APIActionOrEvent_Params& params);
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
104d7582f30d3b217d8144db8429955efdca442508fBo Liu  // content::NotificationObserver implementation.
105d7582f30d3b217d8144db8429955efdca442508fBo Liu  virtual void Observe(int type,
106d7582f30d3b217d8144db8429955efdca442508fBo Liu                       const content::NotificationSource& source,
107d7582f30d3b217d8144db8429955efdca442508fBo Liu                       const content::NotificationDetails& details) OVERRIDE;
108d7582f30d3b217d8144db8429955efdca442508fBo Liu
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int render_process_id_;
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The Profile associated with our renderer process.  This should only be
112d7582f30d3b217d8144db8429955efdca442508fBo Liu  // accessed on the UI thread! Furthermore since this class is refcounted it
113d7582f30d3b217d8144db8429955efdca442508fBo Liu  // may outlive |profile_|, so make sure to NULL check if in doubt; async
114d7582f30d3b217d8144db8429955efdca442508fBo Liu  // calls and the like.
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Profile* profile_;
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_refptr<extensions::InfoMap> extension_info_map_;
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
119d7582f30d3b217d8144db8429955efdca442508fBo Liu  content::NotificationRegistrar notification_registrar_;
120d7582f30d3b217d8144db8429955efdca442508fBo Liu
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChromeExtensionMessageFilter);
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif  // CHROME_BROWSER_RENDERER_HOST_CHROME_EXTENSION_MESSAGE_FILTER_H_
125