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 @@
#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/extension_service.h"
#include "chrome/browser/guest_view/app_view/app_view_constants.h"
......@@ -11,6 +12,7 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_context_menu/context_menu_delegate.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/common/renderer_preferences.h"
#include "extensions/browser/api/app_runtime/app_runtime_api.h"
......@@ -87,6 +89,16 @@ bool AppViewGuest::CompletePendingRequest(
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,
int guest_instance_id)
: GuestView<AppViewGuest>(browser_context, guest_instance_id),
......
......@@ -15,7 +15,7 @@ class ExtensionHost;
};
// 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
// the connect API.
class AppViewGuest : public GuestView<AppViewGuest>,
......@@ -31,7 +31,7 @@ class AppViewGuest : public GuestView<AppViewGuest>,
int guest_instance_id,
const std::string& guest_extension_id);
AppViewGuest(content::BrowserContext* browser_context,
static GuestViewBase* Create(content::BrowserContext* browser_context,
int guest_instance_id);
// ExtensionFunctionDispatcher::Delegate implementation.
......@@ -58,6 +58,9 @@ class AppViewGuest : public GuestView<AppViewGuest>,
virtual void DidInitialize() OVERRIDE;
private:
AppViewGuest(content::BrowserContext* browser_context,
int guest_instance_id);
virtual ~AppViewGuest();
void OnRequest(const ExtensionHostMsg_Request_Params& params);
......
......@@ -5,6 +5,7 @@
#ifndef 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 "content/public/browser/render_frame_host.h"
......@@ -14,6 +15,10 @@
template <typename T>
class GuestView : public GuestViewBase {
public:
static void Register() {
GuestViewBase::RegisterGuestViewType(T::Type, base::Bind(&T::Create));
}
static T* From(int embedder_process_id, int guest_instance_id) {
GuestViewBase* guest =
GuestViewBase::From(embedder_process_id, guest_instance_id);
......
......@@ -4,14 +4,12 @@
#include "chrome/browser/guest_view/guest_view_base.h"
#include "base/command_line.h"
#include "base/lazy_instance.h"
#include "base/strings/utf_string_conversions.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_manager.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 "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h"
......@@ -25,6 +23,11 @@ using content::WebContents;
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;
static base::LazyInstance<WebContentsGuestViewMap> webcontents_guestview_map =
LAZY_INSTANCE_INITIALIZER;
......@@ -139,22 +142,34 @@ void GuestViewBase::InitWithWebContents(
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
GuestViewBase* GuestViewBase::Create(
content::BrowserContext* browser_context,
int guest_instance_id,
const std::string& view_type) {
if (view_type == WebViewGuest::Type) {
return new WebViewGuest(browser_context, guest_instance_id);
} else if (view_type == AppViewGuest::Type) {
if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableAppView)) {
return NULL;
}
return new AppViewGuest(browser_context, guest_instance_id);
}
GuestViewCreationMap::iterator it =
guest_view_registry.Get().find(view_type);
if (it == guest_view_registry.Get().end()) {
NOTREACHED();
return NULL;
}
return it->second.Run(browser_context, guest_instance_id);
}
// static
......
......@@ -52,6 +52,13 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate,
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,
int guest_instance_id,
const std::string& view_type);
......
......@@ -30,6 +30,7 @@ GuestViewManagerFactory* GuestViewManager::factory_ = NULL;
GuestViewManager::GuestViewManager(content::BrowserContext* context)
: current_instance_id_(0), last_instance_id_removed_(0), context_(context) {
GuestViewBase::RegisterGuestViewTypes();
}
GuestViewManager::~GuestViewManager() {}
......
......@@ -169,15 +169,10 @@ void ParsePartitionParam(const base::DictionaryValue& create_params,
} // namespace
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) {
// static
GuestViewBase* WebViewGuest::Create(content::BrowserContext* browser_context,
int guest_instance_id) {
return new WebViewGuest(browser_context, guest_instance_id);
}
// static
......@@ -698,6 +693,17 @@ bool WebViewGuest::ClearData(const base::Time remove_since,
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() {
}
......
......@@ -45,7 +45,7 @@ class SimpleMenuModel;
class WebViewGuest : public GuestView<WebViewGuest>,
public content::NotificationObserver {
public:
WebViewGuest(content::BrowserContext* browser_context,
static GuestViewBase* Create(content::BrowserContext* browser_context,
int guest_instance_id);
// For WebViewGuest, we create special guest processes, which host the
......@@ -238,6 +238,9 @@ class WebViewGuest : public GuestView<WebViewGuest>,
private:
friend class WebViewPermissionHelper;
WebViewGuest(content::BrowserContext* browser_context,
int guest_instance_id);
virtual ~WebViewGuest();
// 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