1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Use of this source code is governed by a BSD-style license that can be
3731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// found in the LICENSE file.
4731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_H_
6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#define CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_H_
7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#pragma once
8731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
9731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <map>
10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <set>
11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include <string>
12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
16731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
17731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass GURL;
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass Extension;
19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ExtensionDevToolsManager;
20731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass Profile;
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RenderProcessHost;
22731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
23731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass ExtensionEventRouter : public NotificationObserver {
24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Returns true if the given extension can see events and data from another
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // sub-profile (incognito to original profile, or vice versa).
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool CanCrossIncognito(Profile* profile,
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                const std::string& extension_id);
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool CanCrossIncognito(Profile* profile, const Extension* extension);
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit ExtensionEventRouter(Profile* profile);
32731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~ExtensionEventRouter();
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Add or remove the process/extension pair as a listener for |event_name|.
35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Note that multiple extensions can share a process due to process
36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // collapsing. Also, a single extension can have 2 processes if it is a split
37731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // mode extension.
38731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void AddEventListener(const std::string& event_name,
39731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        RenderProcessHost* process,
40731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                        const std::string& extension_id);
41731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void RemoveEventListener(const std::string& event_name,
42731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           RenderProcessHost* process,
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                           const std::string& extension_id);
44731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
45731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns true if there is at least one listener for the given event.
46731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool HasEventListener(const std::string& event_name);
47731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns true if the extension is listening to the given event.
49731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  bool ExtensionHasEventListener(const std::string& extension_id,
50731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                 const std::string& event_name);
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
52731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Send an event to every registered extension renderer. If
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |restrict_to_profile| is non-NULL, then the event will not be sent to other
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // profiles unless the extension has permission (e.g. incognito tab update ->
55731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // normal profile only works if extension is allowed incognito access). If
56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // |event_url| is not empty, the event is only sent to extension with host
57731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // permissions for this url.
58731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void DispatchEventToRenderers(
59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const std::string& event_name, const std::string& event_args,
60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      Profile* restrict_to_profile, const GURL& event_url);
61731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
62731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Same as above, except only send the event to the given extension.
63731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void DispatchEventToExtension(
64731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const std::string& extension_id,
65731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const std::string& event_name, const std::string& event_args,
66731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      Profile* restrict_to_profile, const GURL& event_url);
67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick protected:
69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Shared by DispatchEvent*. If |extension_id| is empty, the event is
70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // broadcast.
71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void DispatchEventImpl(
72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const std::string& extension_id,
73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      const std::string& event_name, const std::string& event_args,
74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      Profile* restrict_to_profile, const GURL& event_url);
75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // An extension listening to an event.
78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  struct EventListener;
79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void Observe(NotificationType type,
81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                       const NotificationSource& source,
82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                       const NotificationDetails& details);
83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Profile* profile_;
85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  NotificationRegistrar registrar_;
87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  scoped_refptr<ExtensionDevToolsManager> extension_devtools_manager_;
89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // A map between an event name and a set of extensions that are listening
91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // to that event.
92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  typedef std::map<std::string, std::set<EventListener> > ListenerMap;
93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ListenerMap listeners_;
94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(ExtensionEventRouter);
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_H_
99