chrome_extension_message_filter.h revision d7582f30d3b217d8144db8429955efdca442508f
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