1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CHROME_BROWSER_GUESTVIEW_GUESTVIEW_H_
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define CHROME_BROWSER_GUESTVIEW_GUESTVIEW_H_
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <queue>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/values.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/browser_plugin_guest_delegate.h"
12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/browser/web_contents.h"
13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass AdViewGuest;
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass WebViewGuest;
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)struct RendererContentSettingRules;
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// A GuestView is the base class browser-side API implementation for a <*view>
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// tag. GuestView maintains an association between a guest WebContents and an
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// embedder WebContents. It receives events issued from the guest and relays
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// them to the embedder.
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass GuestView : public content::BrowserPluginGuestDelegate {
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum Type {
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    WEBVIEW,
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ADVIEW,
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    UNKNOWN
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class Event {
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   public:
32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)     Event(const std::string& name, scoped_ptr<DictionaryValue> args);
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch     ~Event();
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& name() const { return name_; }
36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<DictionaryValue> GetArguments();
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   private:
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string name_;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_ptr<DictionaryValue> args_;
42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static Type GetViewTypeFromString(const std::string& api_type);
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static GuestView* Create(content::WebContents* guest_web_contents,
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                           const std::string& extension_id,
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           Type view_type);
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static GuestView* FromWebContents(content::WebContents* web_contents);
51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static GuestView* From(int embedder_process_id, int instance_id);
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // For GuestViews, we create special guest processes, which host the
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // tag content separately from the main application that embeds the tag.
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // A GuestView can specify both the partition name and whether the storage
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // for that partition should be persisted. Each tag gets a SiteInstance with
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // a specially formatted URL, based on the application it is hosted by and
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the partition requested by it. The format for that URL is:
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // chrome-guest://partition_domain/persist?partition_name
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static bool GetGuestPartitionConfigForSite(const GURL& site,
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             std::string* partition_domain,
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             std::string* partition_name,
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                             bool* in_memory);
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // By default, JavaScript and images are enabled in guest content.
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static void GetDefaultContentSettingRules(
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      RendererContentSettingRules* rules, bool incognito);
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Attach(content::WebContents* embedder_web_contents,
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      const base::DictionaryValue& args);
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::WebContents* embedder_web_contents() const {
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return embedder_web_contents_;
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the guest WebContents.
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::WebContents* guest_web_contents() const {
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return guest_web_contents_;
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual Type GetViewType() const;
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns a WebViewGuest if this GuestView belongs to a <webview>.
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual WebViewGuest* AsWebView() = 0;
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns an AdViewGuest if the GuestView belongs to an <adview>.
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual AdViewGuest* AsAdView() = 0;
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns whether this guest has an associated embedder.
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool attached() const { return !!embedder_web_contents_; }
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the instance ID of the <*view> element.
94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int view_instance_id() const { return view_instance_id_; }
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the instance ID of the guest WebContents.
97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int guest_instance_id() const { return guest_instance_id_; }
98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the extension ID of the embedder.
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::string& extension_id() const { return extension_id_; }
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the user browser context of the embedder.
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::BrowserContext* browser_context() const { return browser_context_; }
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the embedder's process ID.
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int embedder_render_process_id() const { return embedder_render_process_id_; }
107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch protected:
1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  GuestView(content::WebContents* guest_web_contents,
1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            const std::string& extension_id);
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~GuestView();
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Dispatches an event |event_name| to the embedder with the |event| fields.
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void DispatchEvent(Event* event);
115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void SendQueuedEvents();
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::WebContents* const guest_web_contents_;
120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  content::WebContents* embedder_web_contents_;
1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const std::string extension_id_;
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int embedder_render_process_id_;
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  content::BrowserContext* const browser_context_;
124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |guest_instance_id_| is a profile-wide unique identifier for a guest
125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // WebContents.
126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int guest_instance_id_;
127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |view_instance_id_| is an identifier that's unique within a particular
128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // embedder RenderViewHost for a particular <*view> instance.
129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int view_instance_id_;
130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This is a queue of Events that are destined to be sent to the embedder once
132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the guest is attached to a particular embedder.
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::queue<Event*> pending_events_;
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(GuestView);
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif  // CHROME_BROWSER_GUESTVIEW_GUESTVIEW_H_
139