• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 EXTENSIONS_BROWSER_GUEST_VIEW_GUEST_VIEW_MANAGER_H_
6 #define EXTENSIONS_BROWSER_GUEST_VIEW_GUEST_VIEW_MANAGER_H_
7 
8 #include <map>
9 
10 #include "base/gtest_prod_util.h"
11 #include "base/lazy_instance.h"
12 #include "base/macros.h"
13 #include "content/public/browser/browser_plugin_guest_manager.h"
14 #include "content/public/browser/site_instance.h"
15 #include "content/public/browser/web_contents.h"
16 
17 class GURL;
18 
19 namespace content {
20 class BrowserContext;
21 class WebContents;
22 }  // namespace content
23 
24 namespace extensions{
25 class GuestViewBase;
26 class GuestViewManagerFactory;
27 
28 class GuestViewManager : public content::BrowserPluginGuestManager,
29                          public base::SupportsUserData::Data {
30  public:
31   explicit GuestViewManager(content::BrowserContext* context);
32   virtual ~GuestViewManager();
33 
34   static GuestViewManager* FromBrowserContext(content::BrowserContext* context);
35 
36   // Overrides factory for testing. Default (NULL) value indicates regular
37   // (non-test) environment.
set_factory_for_testing(GuestViewManagerFactory * factory)38   static void set_factory_for_testing(GuestViewManagerFactory* factory) {
39     GuestViewManager::factory_ = factory;
40   }
41   // Returns the guest WebContents associated with the given |guest_instance_id|
42   // if the provided |embedder_render_process_id| is allowed to access it.
43   // If the embedder is not allowed access, the embedder will be killed, and
44   // this method will return NULL. If no WebContents exists with the given
45   // instance ID, then NULL will also be returned.
46   content::WebContents* GetGuestByInstanceIDSafely(
47       int guest_instance_id,
48       int embedder_render_process_id);
49 
50   // Associates the Browser Plugin with |element_instance_id| to a
51   // guest that has ID of |guest_instance_id| and sets initialization
52   // parameters, |params| for it.
53   void AttachGuest(int embedder_render_process_id,
54                    int embedder_routing_id,
55                    int element_instance_id,
56                    int guest_instance_id,
57                    const base::DictionaryValue& attach_params);
58 
59   int GetNextInstanceID();
60   int GetGuestInstanceIDForElementID(
61       content::WebContents* embedder_web_contents,
62       int element_instance_id);
63 
64   typedef base::Callback<void(content::WebContents*)>
65       WebContentsCreatedCallback;
66   void CreateGuest(const std::string& view_type,
67                    const std::string& embedder_extension_id,
68                    content::WebContents* embedder_web_contents,
69                    const base::DictionaryValue& create_params,
70                    const WebContentsCreatedCallback& callback);
71 
72   content::WebContents* CreateGuestWithWebContentsParams(
73       const std::string& view_type,
74       const std::string& embedder_extension_id,
75       int embedder_render_process_id,
76       const content::WebContents::CreateParams& create_params);
77 
78   content::SiteInstance* GetGuestSiteInstance(
79       const GURL& guest_site);
80 
81   // BrowserPluginGuestManager implementation.
82   virtual content::WebContents* GetGuestByInstanceID(
83       content::WebContents* embedder_web_contents,
84       int element_instance_id) OVERRIDE;
85   virtual bool ForEachGuest(content::WebContents* embedder_web_contents,
86                             const GuestCallback& callback) OVERRIDE;
87  protected:
88   friend class GuestViewBase;
89   FRIEND_TEST_ALL_PREFIXES(GuestViewManagerTest, AddRemove);
90 
91   // Can be overriden in tests.
92   virtual void AddGuest(int guest_instance_id,
93                         content::WebContents* guest_web_contents);
94 
95   // Can be overriden in tests.
96   virtual void RemoveGuest(int guest_instance_id);
97 
98   content::WebContents* GetGuestByInstanceID(int guest_instance_id);
99 
100   bool CanEmbedderAccessInstanceIDMaybeKill(
101       int embedder_render_process_id,
102       int guest_instance_id);
103 
104   bool CanEmbedderAccessInstanceID(int embedder_render_process_id,
105                                    int guest_instance_id);
106 
107   // Returns true if |guest_instance_id| can be used to add a new guest to this
108   // manager.
109   // We disallow adding new guest with instance IDs that were previously removed
110   // from this manager using RemoveGuest.
111   bool CanUseGuestInstanceID(int guest_instance_id);
112 
113   // Static factory instance (always NULL for non-test).
114   static GuestViewManagerFactory* factory_;
115 
116   // Contains guests' WebContents, mapping from their instance ids.
117   typedef std::map<int, content::WebContents*> GuestInstanceMap;
118   GuestInstanceMap guest_web_contents_by_instance_id_;
119 
120   struct ElementInstanceKey {
121     content::WebContents* embedder_web_contents;
122     int element_instance_id;
ElementInstanceKeyElementInstanceKey123     ElementInstanceKey(content::WebContents* embedder_web_contents,
124                        int element_instance_id)
125         : embedder_web_contents(embedder_web_contents),
126           element_instance_id(element_instance_id) {}
127     bool operator<(const ElementInstanceKey& other) const {
128       if (embedder_web_contents != other.embedder_web_contents)
129         return embedder_web_contents < other.embedder_web_contents;
130       return element_instance_id < other.element_instance_id;
131     }
132   };
133 
134   typedef std::map<ElementInstanceKey, int> GuestInstanceIDMap;
135   GuestInstanceIDMap instance_id_map_;
136   // The reverse map of GuestInstanceIDMap.
137   typedef std::map<int, ElementInstanceKey> GuestInstanceIDReverseMap;
138   GuestInstanceIDReverseMap reverse_instance_id_map_;
139 
140   int current_instance_id_;
141 
142   // Any instance ID whose number not greater than this was removed via
143   // RemoveGuest.
144   // This is used so that we don't have store all removed instance IDs in
145   // |removed_instance_ids_|.
146   int last_instance_id_removed_;
147   // The remaining instance IDs that are greater than
148   // |last_instance_id_removed_| are kept here.
149   std::set<int> removed_instance_ids_;
150 
151   content::BrowserContext* context_;
152 
153   DISALLOW_COPY_AND_ASSIGN(GuestViewManager);
154 };
155 
156 }  // namespace extensions
157 
158 #endif  // EXTENSIONS_BROWSER_GUEST_VIEW_GUEST_VIEW_MANAGER_H_
159