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