| Index: chrome/browser/guest_view/guest_view_base.cc
|
| diff --git a/chrome/browser/guest_view/guest_view_base.cc b/chrome/browser/guest_view/guest_view_base.cc
|
| deleted file mode 100644
|
| index ddc4a0bf32be1be68f24b574659d32b81de33709..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/guest_view/guest_view_base.cc
|
| +++ /dev/null
|
| @@ -1,450 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/guest_view/guest_view_base.h"
|
| -
|
| -#include "base/lazy_instance.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/guest_view/guest_view_manager.h"
|
| -#include "content/public/browser/render_frame_host.h"
|
| -#include "content/public/browser/render_process_host.h"
|
| -#include "content/public/browser/render_view_host.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "content/public/common/url_constants.h"
|
| -#include "extensions/browser/api/extensions_api_client.h"
|
| -#include "extensions/browser/event_router.h"
|
| -#include "extensions/browser/extension_registry.h"
|
| -#include "extensions/browser/guest_view/guest_view_constants.h"
|
| -#include "extensions/browser/process_map.h"
|
| -#include "extensions/common/features/feature.h"
|
| -#include "extensions/common/features/feature_provider.h"
|
| -#include "third_party/WebKit/public/web/WebInputEvent.h"
|
| -
|
| -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;
|
| -
|
| -} // namespace
|
| -
|
| -GuestViewBase::Event::Event(const std::string& name,
|
| - scoped_ptr<base::DictionaryValue> args)
|
| - : name_(name), args_(args.Pass()) {
|
| -}
|
| -
|
| -GuestViewBase::Event::~Event() {
|
| -}
|
| -
|
| -scoped_ptr<base::DictionaryValue> GuestViewBase::Event::GetArguments() {
|
| - return args_.Pass();
|
| -}
|
| -
|
| -// This observer ensures that the GuestViewBase destroys itself when its
|
| -// embedder goes away.
|
| -class GuestViewBase::EmbedderWebContentsObserver : public WebContentsObserver {
|
| - public:
|
| - explicit EmbedderWebContentsObserver(GuestViewBase* guest)
|
| - : WebContentsObserver(guest->embedder_web_contents()),
|
| - destroyed_(false),
|
| - guest_(guest) {
|
| - }
|
| -
|
| - virtual ~EmbedderWebContentsObserver() {
|
| - }
|
| -
|
| - // WebContentsObserver implementation.
|
| - virtual void WebContentsDestroyed() OVERRIDE {
|
| - Destroy();
|
| - }
|
| -
|
| - virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE {
|
| - Destroy();
|
| - }
|
| -
|
| - private:
|
| - bool destroyed_;
|
| - GuestViewBase* guest_;
|
| -
|
| - void Destroy() {
|
| - if (destroyed_)
|
| - return;
|
| - destroyed_ = true;
|
| - guest_->embedder_web_contents_ = NULL;
|
| - guest_->EmbedderDestroyed();
|
| - guest_->Destroy();
|
| - }
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(EmbedderWebContentsObserver);
|
| -};
|
| -
|
| -GuestViewBase::GuestViewBase(content::BrowserContext* browser_context,
|
| - int guest_instance_id)
|
| - : embedder_web_contents_(NULL),
|
| - embedder_render_process_id_(0),
|
| - browser_context_(browser_context),
|
| - guest_instance_id_(guest_instance_id),
|
| - view_instance_id_(guestview::kInstanceIDNone),
|
| - initialized_(false),
|
| - auto_size_enabled_(false),
|
| - weak_ptr_factory_(this) {
|
| -}
|
| -
|
| -void GuestViewBase::Init(const std::string& embedder_extension_id,
|
| - content::WebContents* embedder_web_contents,
|
| - const base::DictionaryValue& create_params,
|
| - const WebContentsCreatedCallback& callback) {
|
| - if (initialized_)
|
| - return;
|
| - initialized_ = true;
|
| -
|
| - extensions::Feature* feature =
|
| - extensions::FeatureProvider::GetAPIFeatures()->GetFeature(
|
| - GetAPINamespace());
|
| - CHECK(feature);
|
| -
|
| - extensions::ProcessMap* process_map =
|
| - extensions::ProcessMap::Get(browser_context());
|
| - CHECK(process_map);
|
| -
|
| - const extensions::Extension* embedder_extension =
|
| - extensions::ExtensionRegistry::Get(browser_context_)
|
| - ->enabled_extensions()
|
| - .GetByID(embedder_extension_id);
|
| - int embedder_process_id =
|
| - embedder_web_contents->GetRenderProcessHost()->GetID();
|
| -
|
| - extensions::Feature::Availability availability =
|
| - feature->IsAvailableToContext(
|
| - embedder_extension,
|
| - process_map->GetMostLikelyContextType(embedder_extension,
|
| - embedder_process_id),
|
| - embedder_web_contents->GetLastCommittedURL());
|
| - if (!availability.is_available()) {
|
| - callback.Run(NULL);
|
| - return;
|
| - }
|
| -
|
| - CreateWebContents(embedder_extension_id,
|
| - embedder_process_id,
|
| - create_params,
|
| - base::Bind(&GuestViewBase::CompleteInit,
|
| - AsWeakPtr(),
|
| - embedder_extension_id,
|
| - embedder_process_id,
|
| - callback));
|
| -}
|
| -
|
| -void GuestViewBase::InitWithWebContents(
|
| - const std::string& embedder_extension_id,
|
| - int embedder_render_process_id,
|
| - content::WebContents* guest_web_contents) {
|
| - DCHECK(guest_web_contents);
|
| - content::RenderProcessHost* embedder_render_process_host =
|
| - content::RenderProcessHost::FromID(embedder_render_process_id);
|
| -
|
| - embedder_extension_id_ = embedder_extension_id;
|
| - embedder_render_process_id_ = embedder_render_process_host->GetID();
|
| - embedder_render_process_host->AddObserver(this);
|
| -
|
| - WebContentsObserver::Observe(guest_web_contents);
|
| - guest_web_contents->SetDelegate(this);
|
| - webcontents_guestview_map.Get().insert(
|
| - std::make_pair(guest_web_contents, this));
|
| - GuestViewManager::FromBrowserContext(browser_context_)->
|
| - AddGuest(guest_instance_id_, guest_web_contents);
|
| -
|
| - // Give the derived class an opportunity to perform additional initialization.
|
| - DidInitialize();
|
| -}
|
| -
|
| -void GuestViewBase::SetAutoSize(bool enabled,
|
| - const gfx::Size& min_size,
|
| - const gfx::Size& max_size) {
|
| - min_auto_size_ = min_size;
|
| - min_auto_size_.SetToMin(max_size);
|
| - max_auto_size_ = max_size;
|
| - max_auto_size_.SetToMax(min_size);
|
| -
|
| - enabled &= !min_auto_size_.IsEmpty() && !max_auto_size_.IsEmpty() &&
|
| - IsAutoSizeSupported();
|
| - if (!enabled && !auto_size_enabled_)
|
| - return;
|
| -
|
| - auto_size_enabled_ = enabled;
|
| -
|
| - if (!attached())
|
| - return;
|
| -
|
| - content::RenderViewHost* rvh = guest_web_contents()->GetRenderViewHost();
|
| - if (auto_size_enabled_) {
|
| - rvh->EnableAutoResize(min_auto_size_, max_auto_size_);
|
| - } else {
|
| - rvh->DisableAutoResize(element_size_);
|
| - guest_size_ = element_size_;
|
| - GuestSizeChangedDueToAutoSize(guest_size_, element_size_);
|
| - }
|
| -}
|
| -
|
| -// 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 (guest_view_registry.Get().empty())
|
| - RegisterGuestViewTypes();
|
| -
|
| - 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
|
| -GuestViewBase* GuestViewBase::FromWebContents(WebContents* web_contents) {
|
| - WebContentsGuestViewMap* guest_map = webcontents_guestview_map.Pointer();
|
| - WebContentsGuestViewMap::iterator it = guest_map->find(web_contents);
|
| - return it == guest_map->end() ? NULL : it->second;
|
| -}
|
| -
|
| -// static
|
| -GuestViewBase* GuestViewBase::From(int embedder_process_id,
|
| - int guest_instance_id) {
|
| - content::RenderProcessHost* host =
|
| - content::RenderProcessHost::FromID(embedder_process_id);
|
| - if (!host)
|
| - return NULL;
|
| -
|
| - content::WebContents* guest_web_contents =
|
| - GuestViewManager::FromBrowserContext(host->GetBrowserContext())->
|
| - GetGuestByInstanceIDSafely(guest_instance_id, embedder_process_id);
|
| - if (!guest_web_contents)
|
| - return NULL;
|
| -
|
| - return GuestViewBase::FromWebContents(guest_web_contents);
|
| -}
|
| -
|
| -// static
|
| -bool GuestViewBase::IsGuest(WebContents* web_contents) {
|
| - return !!GuestViewBase::FromWebContents(web_contents);
|
| -}
|
| -
|
| -base::WeakPtr<GuestViewBase> GuestViewBase::AsWeakPtr() {
|
| - return weak_ptr_factory_.GetWeakPtr();
|
| -}
|
| -
|
| -bool GuestViewBase::IsAutoSizeSupported() const {
|
| - return false;
|
| -}
|
| -
|
| -bool GuestViewBase::IsDragAndDropEnabled() const {
|
| - return false;
|
| -}
|
| -
|
| -void GuestViewBase::RenderProcessExited(content::RenderProcessHost* host,
|
| - base::ProcessHandle handle,
|
| - base::TerminationStatus status,
|
| - int exit_code) {
|
| - // GuestViewBase tracks the lifetime of its embedder render process until it
|
| - // is attached to a particular embedder WebContents. At that point, its
|
| - // lifetime is restricted in scope to the lifetime of its embedder
|
| - // WebContents.
|
| - CHECK(!attached());
|
| - CHECK_EQ(host->GetID(), embedder_render_process_id());
|
| -
|
| - // This code path may be reached if the embedder WebContents is killed for
|
| - // whatever reason immediately after a called to GuestViewInternal.createGuest
|
| - // and before attaching the new guest to a frame.
|
| - Destroy();
|
| -}
|
| -
|
| -void GuestViewBase::Destroy() {
|
| - DCHECK(guest_web_contents());
|
| - content::RenderProcessHost* host =
|
| - content::RenderProcessHost::FromID(embedder_render_process_id());
|
| - if (host)
|
| - host->RemoveObserver(this);
|
| - WillDestroy();
|
| - if (!destruction_callback_.is_null())
|
| - destruction_callback_.Run();
|
| -
|
| - webcontents_guestview_map.Get().erase(guest_web_contents());
|
| - GuestViewManager::FromBrowserContext(browser_context_)->
|
| - RemoveGuest(guest_instance_id_);
|
| - pending_events_.clear();
|
| -
|
| - delete guest_web_contents();
|
| -}
|
| -
|
| -void GuestViewBase::DidAttach() {
|
| - // Give the derived class an opportunity to perform some actions.
|
| - DidAttachToEmbedder();
|
| -
|
| - SendQueuedEvents();
|
| -}
|
| -
|
| -void GuestViewBase::ElementSizeChanged(const gfx::Size& old_size,
|
| - const gfx::Size& new_size) {
|
| - element_size_ = new_size;
|
| -}
|
| -
|
| -int GuestViewBase::GetGuestInstanceID() const {
|
| - return guest_instance_id_;
|
| -}
|
| -
|
| -void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size,
|
| - const gfx::Size& new_size) {
|
| - if (!auto_size_enabled_)
|
| - return;
|
| - guest_size_ = new_size;
|
| - GuestSizeChangedDueToAutoSize(old_size, new_size);
|
| -}
|
| -
|
| -void GuestViewBase::SetOpener(GuestViewBase* guest) {
|
| - if (guest && guest->IsViewType(GetViewType())) {
|
| - opener_ = guest->AsWeakPtr();
|
| - return;
|
| - }
|
| - opener_ = base::WeakPtr<GuestViewBase>();
|
| -}
|
| -
|
| -void GuestViewBase::RegisterDestructionCallback(
|
| - const DestructionCallback& callback) {
|
| - destruction_callback_ = callback;
|
| -}
|
| -
|
| -void GuestViewBase::WillAttach(content::WebContents* embedder_web_contents,
|
| - const base::DictionaryValue& extra_params) {
|
| - // After attachment, this GuestViewBase's lifetime is restricted to the
|
| - // lifetime of its embedder WebContents. Observing the RenderProcessHost
|
| - // of the embedder is no longer necessary.
|
| - embedder_web_contents->GetRenderProcessHost()->RemoveObserver(this);
|
| - embedder_web_contents_ = embedder_web_contents;
|
| - embedder_web_contents_observer_.reset(
|
| - new EmbedderWebContentsObserver(this));
|
| - extra_params.GetInteger(guestview::kParameterInstanceId, &view_instance_id_);
|
| - extra_params_.reset(extra_params.DeepCopy());
|
| -
|
| - WillAttachToEmbedder();
|
| -}
|
| -
|
| -void GuestViewBase::DidStopLoading(content::RenderViewHost* render_view_host) {
|
| - if (!IsDragAndDropEnabled()) {
|
| - const char script[] = "window.addEventListener('dragstart', function() { "
|
| - " window.event.preventDefault(); "
|
| - "});";
|
| - render_view_host->GetMainFrame()->ExecuteJavaScript(
|
| - base::ASCIIToUTF16(script));
|
| - }
|
| - DidStopLoading();
|
| -}
|
| -
|
| -void GuestViewBase::RenderViewReady() {
|
| - GuestReady();
|
| - content::RenderViewHost* rvh = guest_web_contents()->GetRenderViewHost();
|
| - if (auto_size_enabled_) {
|
| - rvh->EnableAutoResize(min_auto_size_, max_auto_size_);
|
| - } else {
|
| - rvh->DisableAutoResize(element_size_);
|
| - }
|
| -}
|
| -
|
| -void GuestViewBase::WebContentsDestroyed() {
|
| - GuestDestroyed();
|
| - delete this;
|
| -}
|
| -
|
| -bool GuestViewBase::ShouldFocusPageAfterCrash() {
|
| - // Focus is managed elsewhere.
|
| - return false;
|
| -}
|
| -
|
| -bool GuestViewBase::PreHandleGestureEvent(content::WebContents* source,
|
| - const blink::WebGestureEvent& event) {
|
| - return event.type == blink::WebGestureEvent::GesturePinchBegin ||
|
| - event.type == blink::WebGestureEvent::GesturePinchUpdate ||
|
| - event.type == blink::WebGestureEvent::GesturePinchEnd;
|
| -}
|
| -
|
| -GuestViewBase::~GuestViewBase() {
|
| -}
|
| -
|
| -void GuestViewBase::DispatchEventToEmbedder(Event* event) {
|
| - scoped_ptr<Event> event_ptr(event);
|
| - if (!in_extension()) {
|
| - NOTREACHED();
|
| - return;
|
| - }
|
| -
|
| - if (!attached()) {
|
| - pending_events_.push_back(linked_ptr<Event>(event_ptr.release()));
|
| - return;
|
| - }
|
| -
|
| - extensions::EventFilteringInfo info;
|
| - info.SetInstanceID(view_instance_id_);
|
| - scoped_ptr<base::ListValue> args(new base::ListValue());
|
| - args->Append(event->GetArguments().release());
|
| -
|
| - extensions::EventRouter::DispatchEvent(
|
| - embedder_web_contents_,
|
| - browser_context_,
|
| - embedder_extension_id_,
|
| - event->name(),
|
| - args.Pass(),
|
| - extensions::EventRouter::USER_GESTURE_UNKNOWN,
|
| - info);
|
| -}
|
| -
|
| -void GuestViewBase::SendQueuedEvents() {
|
| - if (!attached())
|
| - return;
|
| - while (!pending_events_.empty()) {
|
| - linked_ptr<Event> event_ptr = pending_events_.front();
|
| - pending_events_.pop_front();
|
| - DispatchEventToEmbedder(event_ptr.release());
|
| - }
|
| -}
|
| -
|
| -void GuestViewBase::CompleteInit(const std::string& embedder_extension_id,
|
| - int embedder_render_process_id,
|
| - const WebContentsCreatedCallback& callback,
|
| - content::WebContents* guest_web_contents) {
|
| - if (!guest_web_contents) {
|
| - // The derived class did not create a WebContents so this class serves no
|
| - // purpose. Let's self-destruct.
|
| - delete this;
|
| - callback.Run(NULL);
|
| - return;
|
| - }
|
| - InitWithWebContents(embedder_extension_id,
|
| - embedder_render_process_id,
|
| - guest_web_contents);
|
| - callback.Run(guest_web_contents);
|
| -}
|
| -
|
| -// static
|
| -void GuestViewBase::RegisterGuestViewTypes() {
|
| - extensions::ExtensionsAPIClient::Get()->RegisterGuestViewTypes();
|
| -}
|
|
|