Commit 71c63dc7 authored by fsamuel@chromium.org's avatar fsamuel@chromium.org

Refactor GuestView construction

Each GuestView derived type is now responsible for managing it's own construction.

BUG=none

Review URL: https://codereview.chromium.org/409603003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@284527 0039d316-1c4b-4281-b951-d872f2087c98
parent 8a9712c2
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chrome/browser/guest_view/app_view/app_view_guest.h" #include "chrome/browser/guest_view/app_view/app_view_guest.h"
#include "base/command_line.h"
#include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h"
#include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/guest_view/app_view/app_view_constants.h" #include "chrome/browser/guest_view/app_view/app_view_constants.h"
...@@ -11,6 +12,7 @@ ...@@ -11,6 +12,7 @@
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_context_menu/context_menu_delegate.h" #include "chrome/browser/renderer_context_menu/context_menu_delegate.h"
#include "chrome/browser/renderer_context_menu/render_view_context_menu.h" #include "chrome/browser/renderer_context_menu/render_view_context_menu.h"
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/render_view_host.h" #include "content/public/browser/render_view_host.h"
#include "content/public/common/renderer_preferences.h" #include "content/public/common/renderer_preferences.h"
#include "extensions/browser/api/app_runtime/app_runtime_api.h" #include "extensions/browser/api/app_runtime/app_runtime_api.h"
...@@ -87,6 +89,16 @@ bool AppViewGuest::CompletePendingRequest( ...@@ -87,6 +89,16 @@ bool AppViewGuest::CompletePendingRequest(
return true; return true;
} }
// static
GuestViewBase* AppViewGuest::Create(content::BrowserContext* browser_context,
int guest_instance_id) {
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableAppView)) {
return NULL;
}
return new AppViewGuest(browser_context, guest_instance_id);
}
AppViewGuest::AppViewGuest(content::BrowserContext* browser_context, AppViewGuest::AppViewGuest(content::BrowserContext* browser_context,
int guest_instance_id) int guest_instance_id)
: GuestView<AppViewGuest>(browser_context, guest_instance_id), : GuestView<AppViewGuest>(browser_context, guest_instance_id),
......
...@@ -15,7 +15,7 @@ class ExtensionHost; ...@@ -15,7 +15,7 @@ class ExtensionHost;
}; };
// An AppViewGuest provides the browser-side implementation of <appview> API. // An AppViewGuest provides the browser-side implementation of <appview> API.
// AppViewGuest is created on attachment. That is, when a guest WEbContnets is // AppViewGuest is created on attachment. That is, when a guest WebContents is
// associated with a particular embedder WebContents. This happens on calls to // associated with a particular embedder WebContents. This happens on calls to
// the connect API. // the connect API.
class AppViewGuest : public GuestView<AppViewGuest>, class AppViewGuest : public GuestView<AppViewGuest>,
...@@ -31,8 +31,8 @@ class AppViewGuest : public GuestView<AppViewGuest>, ...@@ -31,8 +31,8 @@ class AppViewGuest : public GuestView<AppViewGuest>,
int guest_instance_id, int guest_instance_id,
const std::string& guest_extension_id); const std::string& guest_extension_id);
AppViewGuest(content::BrowserContext* browser_context, static GuestViewBase* Create(content::BrowserContext* browser_context,
int guest_instance_id); int guest_instance_id);
// ExtensionFunctionDispatcher::Delegate implementation. // ExtensionFunctionDispatcher::Delegate implementation.
virtual extensions::WindowController* GetExtensionWindowController() const virtual extensions::WindowController* GetExtensionWindowController() const
...@@ -58,6 +58,9 @@ class AppViewGuest : public GuestView<AppViewGuest>, ...@@ -58,6 +58,9 @@ class AppViewGuest : public GuestView<AppViewGuest>,
virtual void DidInitialize() OVERRIDE; virtual void DidInitialize() OVERRIDE;
private: private:
AppViewGuest(content::BrowserContext* browser_context,
int guest_instance_id);
virtual ~AppViewGuest(); virtual ~AppViewGuest();
void OnRequest(const ExtensionHostMsg_Request_Params& params); void OnRequest(const ExtensionHostMsg_Request_Params& params);
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#ifndef CHROME_BROWSER_GUEST_VIEW_GUEST_VIEW_H_ #ifndef CHROME_BROWSER_GUEST_VIEW_GUEST_VIEW_H_
#define CHROME_BROWSER_GUEST_VIEW_GUEST_VIEW_H_ #define CHROME_BROWSER_GUEST_VIEW_GUEST_VIEW_H_
#include "base/bind.h"
#include "chrome/browser/guest_view/guest_view_base.h" #include "chrome/browser/guest_view/guest_view_base.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
...@@ -14,6 +15,10 @@ ...@@ -14,6 +15,10 @@
template <typename T> template <typename T>
class GuestView : public GuestViewBase { class GuestView : public GuestViewBase {
public: public:
static void Register() {
GuestViewBase::RegisterGuestViewType(T::Type, base::Bind(&T::Create));
}
static T* From(int embedder_process_id, int guest_instance_id) { static T* From(int embedder_process_id, int guest_instance_id) {
GuestViewBase* guest = GuestViewBase* guest =
GuestViewBase::From(embedder_process_id, guest_instance_id); GuestViewBase::From(embedder_process_id, guest_instance_id);
......
...@@ -4,14 +4,12 @@ ...@@ -4,14 +4,12 @@
#include "chrome/browser/guest_view/guest_view_base.h" #include "chrome/browser/guest_view/guest_view_base.h"
#include "base/command_line.h"
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chrome/browser/guest_view/app_view/app_view_guest.h" #include "chrome/browser/guest_view/app_view/app_view_guest.h"
#include "chrome/browser/guest_view/guest_view_constants.h" #include "chrome/browser/guest_view/guest_view_constants.h"
#include "chrome/browser/guest_view/guest_view_manager.h" #include "chrome/browser/guest_view/guest_view_manager.h"
#include "chrome/browser/guest_view/web_view/web_view_guest.h" #include "chrome/browser/guest_view/web_view/web_view_guest.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/content_settings.h" #include "chrome/common/content_settings.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
...@@ -25,6 +23,11 @@ using content::WebContents; ...@@ -25,6 +23,11 @@ using content::WebContents;
namespace { namespace {
typedef std::map<std::string, GuestViewBase::GuestCreationCallback>
GuestViewCreationMap;
static base::LazyInstance<GuestViewCreationMap> guest_view_registry =
LAZY_INSTANCE_INITIALIZER;
typedef std::map<WebContents*, GuestViewBase*> WebContentsGuestViewMap; typedef std::map<WebContents*, GuestViewBase*> WebContentsGuestViewMap;
static base::LazyInstance<WebContentsGuestViewMap> webcontents_guestview_map = static base::LazyInstance<WebContentsGuestViewMap> webcontents_guestview_map =
LAZY_INSTANCE_INITIALIZER; LAZY_INSTANCE_INITIALIZER;
...@@ -139,22 +142,34 @@ void GuestViewBase::InitWithWebContents( ...@@ -139,22 +142,34 @@ void GuestViewBase::InitWithWebContents(
DidInitialize(); DidInitialize();
} }
// static
void GuestViewBase::RegisterGuestViewTypes() {
GuestView<WebViewGuest>::Register();
GuestView<AppViewGuest>::Register();
}
// static
void GuestViewBase::RegisterGuestViewType(
const std::string& view_type,
const GuestCreationCallback& callback) {
GuestViewCreationMap::iterator it =
guest_view_registry.Get().find(view_type);
DCHECK(it == guest_view_registry.Get().end());
guest_view_registry.Get()[view_type] = callback;
}
// static // static
GuestViewBase* GuestViewBase::Create( GuestViewBase* GuestViewBase::Create(
content::BrowserContext* browser_context, content::BrowserContext* browser_context,
int guest_instance_id, int guest_instance_id,
const std::string& view_type) { const std::string& view_type) {
if (view_type == WebViewGuest::Type) { GuestViewCreationMap::iterator it =
return new WebViewGuest(browser_context, guest_instance_id); guest_view_registry.Get().find(view_type);
} else if (view_type == AppViewGuest::Type) { if (it == guest_view_registry.Get().end()) {
if (!base::CommandLine::ForCurrentProcess()->HasSwitch( NOTREACHED();
switches::kEnableAppView)) { return NULL;
return NULL;
}
return new AppViewGuest(browser_context, guest_instance_id);
} }
NOTREACHED(); return it->second.Run(browser_context, guest_instance_id);
return NULL;
} }
// static // static
......
...@@ -52,6 +52,13 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, ...@@ -52,6 +52,13 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate,
return NULL; return NULL;
} }
static void RegisterGuestViewTypes();
typedef base::Callback<GuestViewBase*(
content::BrowserContext*, int)> GuestCreationCallback;
static void RegisterGuestViewType(const std::string& view_type,
const GuestCreationCallback& callback);
static GuestViewBase* Create(content::BrowserContext* browser_context, static GuestViewBase* Create(content::BrowserContext* browser_context,
int guest_instance_id, int guest_instance_id,
const std::string& view_type); const std::string& view_type);
......
...@@ -30,6 +30,7 @@ GuestViewManagerFactory* GuestViewManager::factory_ = NULL; ...@@ -30,6 +30,7 @@ GuestViewManagerFactory* GuestViewManager::factory_ = NULL;
GuestViewManager::GuestViewManager(content::BrowserContext* context) GuestViewManager::GuestViewManager(content::BrowserContext* context)
: current_instance_id_(0), last_instance_id_removed_(0), context_(context) { : current_instance_id_(0), last_instance_id_removed_(0), context_(context) {
GuestViewBase::RegisterGuestViewTypes();
} }
GuestViewManager::~GuestViewManager() {} GuestViewManager::~GuestViewManager() {}
......
...@@ -169,15 +169,10 @@ void ParsePartitionParam(const base::DictionaryValue& create_params, ...@@ -169,15 +169,10 @@ void ParsePartitionParam(const base::DictionaryValue& create_params,
} // namespace } // namespace
WebViewGuest::WebViewGuest(content::BrowserContext* browser_context, // static
int guest_instance_id) GuestViewBase* WebViewGuest::Create(content::BrowserContext* browser_context,
: GuestView<WebViewGuest>(browser_context, guest_instance_id), int guest_instance_id) {
pending_context_menu_request_id_(0), return new WebViewGuest(browser_context, guest_instance_id);
is_overriding_user_agent_(false),
chromevox_injected_(false),
current_zoom_factor_(1.0),
find_helper_(this),
javascript_dialog_helper_(this) {
} }
// static // static
...@@ -698,6 +693,17 @@ bool WebViewGuest::ClearData(const base::Time remove_since, ...@@ -698,6 +693,17 @@ bool WebViewGuest::ClearData(const base::Time remove_since,
return true; return true;
} }
WebViewGuest::WebViewGuest(content::BrowserContext* browser_context,
int guest_instance_id)
: GuestView<WebViewGuest>(browser_context, guest_instance_id),
pending_context_menu_request_id_(0),
is_overriding_user_agent_(false),
chromevox_injected_(false),
current_zoom_factor_(1.0),
find_helper_(this),
javascript_dialog_helper_(this) {
}
WebViewGuest::~WebViewGuest() { WebViewGuest::~WebViewGuest() {
} }
......
...@@ -45,8 +45,8 @@ class SimpleMenuModel; ...@@ -45,8 +45,8 @@ class SimpleMenuModel;
class WebViewGuest : public GuestView<WebViewGuest>, class WebViewGuest : public GuestView<WebViewGuest>,
public content::NotificationObserver { public content::NotificationObserver {
public: public:
WebViewGuest(content::BrowserContext* browser_context, static GuestViewBase* Create(content::BrowserContext* browser_context,
int guest_instance_id); int guest_instance_id);
// For WebViewGuest, we create special guest processes, which host the // For WebViewGuest, we create special guest processes, which host the
// tag content separately from the main application that embeds the tag. // tag content separately from the main application that embeds the tag.
...@@ -238,6 +238,9 @@ class WebViewGuest : public GuestView<WebViewGuest>, ...@@ -238,6 +238,9 @@ class WebViewGuest : public GuestView<WebViewGuest>,
private: private:
friend class WebViewPermissionHelper; friend class WebViewPermissionHelper;
WebViewGuest(content::BrowserContext* browser_context,
int guest_instance_id);
virtual ~WebViewGuest(); virtual ~WebViewGuest();
// Returns the top level items (ignoring submenus) as Value. // Returns the top level items (ignoring submenus) as Value.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment