| Index: chrome/browser/guest_view/guest_view_manager.cc
|
| diff --git a/chrome/browser/guest_view/guest_view_manager.cc b/chrome/browser/guest_view/guest_view_manager.cc
|
| deleted file mode 100644
|
| index e9f2044d51849b1d45b6f7ce261663e568a95a8e..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/guest_view/guest_view_manager.cc
|
| +++ /dev/null
|
| @@ -1,238 +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_manager.h"
|
| -
|
| -#include "base/strings/stringprintf.h"
|
| -#include "chrome/browser/guest_view/guest_view_base.h"
|
| -#include "chrome/browser/guest_view/guest_view_manager_factory.h"
|
| -#include "content/public/browser/browser_context.h"
|
| -#include "content/public/browser/render_process_host.h"
|
| -#include "content/public/browser/user_metrics.h"
|
| -#include "content/public/browser/web_contents_observer.h"
|
| -#include "content/public/common/result_codes.h"
|
| -#include "content/public/common/url_constants.h"
|
| -#include "extensions/browser/extension_system.h"
|
| -#include "extensions/browser/guest_view/guest_view_constants.h"
|
| -#include "net/base/escape.h"
|
| -#include "url/gurl.h"
|
| -
|
| -using content::BrowserContext;
|
| -using content::SiteInstance;
|
| -using content::WebContents;
|
| -
|
| -// static
|
| -GuestViewManagerFactory* GuestViewManager::factory_ = NULL;
|
| -
|
| -GuestViewManager::GuestViewManager(content::BrowserContext* context)
|
| - : current_instance_id_(0), last_instance_id_removed_(0), context_(context) {
|
| -}
|
| -
|
| -GuestViewManager::~GuestViewManager() {}
|
| -
|
| -// static.
|
| -GuestViewManager* GuestViewManager::FromBrowserContext(
|
| - BrowserContext* context) {
|
| - GuestViewManager* guest_manager =
|
| - static_cast<GuestViewManager*>(context->GetUserData(
|
| - guestview::kGuestViewManagerKeyName));
|
| - if (!guest_manager) {
|
| - if (factory_) {
|
| - guest_manager = factory_->CreateGuestViewManager(context);
|
| - } else {
|
| - guest_manager = new GuestViewManager(context);
|
| - }
|
| - context->SetUserData(guestview::kGuestViewManagerKeyName, guest_manager);
|
| - }
|
| - return guest_manager;
|
| -}
|
| -
|
| -content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely(
|
| - int guest_instance_id,
|
| - int embedder_render_process_id) {
|
| - if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id,
|
| - guest_instance_id)) {
|
| - return NULL;
|
| - }
|
| - return GetGuestByInstanceID(guest_instance_id);
|
| -}
|
| -
|
| -int GuestViewManager::GetNextInstanceID() {
|
| - return ++current_instance_id_;
|
| -}
|
| -
|
| -void GuestViewManager::CreateGuest(const std::string& view_type,
|
| - const std::string& embedder_extension_id,
|
| - content::WebContents* embedder_web_contents,
|
| - const base::DictionaryValue& create_params,
|
| - const WebContentsCreatedCallback& callback) {
|
| - int guest_instance_id = GetNextInstanceID();
|
| - GuestViewBase* guest =
|
| - GuestViewBase::Create(context_, guest_instance_id, view_type);
|
| - if (!guest) {
|
| - callback.Run(NULL);
|
| - return;
|
| - }
|
| - guest->Init(
|
| - embedder_extension_id, embedder_web_contents, create_params, callback);
|
| -}
|
| -
|
| -content::WebContents* GuestViewManager::CreateGuestWithWebContentsParams(
|
| - const std::string& view_type,
|
| - const std::string& embedder_extension_id,
|
| - int embedder_render_process_id,
|
| - const content::WebContents::CreateParams& create_params) {
|
| - int guest_instance_id = GetNextInstanceID();
|
| - GuestViewBase* guest =
|
| - GuestViewBase::Create(context_, guest_instance_id, view_type);
|
| - if (!guest)
|
| - return NULL;
|
| - content::WebContents::CreateParams guest_create_params(create_params);
|
| - guest_create_params.guest_delegate = guest;
|
| - content::WebContents* guest_web_contents =
|
| - WebContents::Create(guest_create_params);
|
| - guest->InitWithWebContents(embedder_extension_id,
|
| - embedder_render_process_id,
|
| - guest_web_contents);
|
| - return guest_web_contents;
|
| -}
|
| -
|
| -void GuestViewManager::MaybeGetGuestByInstanceIDOrKill(
|
| - int guest_instance_id,
|
| - int embedder_render_process_id,
|
| - const GuestByInstanceIDCallback& callback) {
|
| - if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id,
|
| - guest_instance_id)) {
|
| - // If we kill the embedder, then don't bother calling back.
|
| - return;
|
| - }
|
| - content::WebContents* guest_web_contents =
|
| - GetGuestByInstanceID(guest_instance_id);
|
| - callback.Run(guest_web_contents);
|
| -}
|
| -
|
| -SiteInstance* GuestViewManager::GetGuestSiteInstance(
|
| - const GURL& guest_site) {
|
| - for (GuestInstanceMap::const_iterator it =
|
| - guest_web_contents_by_instance_id_.begin();
|
| - it != guest_web_contents_by_instance_id_.end(); ++it) {
|
| - if (it->second->GetSiteInstance()->GetSiteURL() == guest_site)
|
| - return it->second->GetSiteInstance();
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -bool GuestViewManager::ForEachGuest(WebContents* embedder_web_contents,
|
| - const GuestCallback& callback) {
|
| - for (GuestInstanceMap::iterator it =
|
| - guest_web_contents_by_instance_id_.begin();
|
| - it != guest_web_contents_by_instance_id_.end(); ++it) {
|
| - WebContents* guest = it->second;
|
| - GuestViewBase* guest_view = GuestViewBase::FromWebContents(guest);
|
| - if (embedder_web_contents != guest_view->embedder_web_contents())
|
| - continue;
|
| -
|
| - if (callback.Run(guest))
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -void GuestViewManager::AddGuest(int guest_instance_id,
|
| - WebContents* guest_web_contents) {
|
| - CHECK(!ContainsKey(guest_web_contents_by_instance_id_, guest_instance_id));
|
| - CHECK(CanUseGuestInstanceID(guest_instance_id));
|
| - guest_web_contents_by_instance_id_[guest_instance_id] = guest_web_contents;
|
| -}
|
| -
|
| -void GuestViewManager::RemoveGuest(int guest_instance_id) {
|
| - GuestInstanceMap::iterator it =
|
| - guest_web_contents_by_instance_id_.find(guest_instance_id);
|
| - DCHECK(it != guest_web_contents_by_instance_id_.end());
|
| - guest_web_contents_by_instance_id_.erase(it);
|
| -
|
| - // All the instance IDs that lie within [0, last_instance_id_removed_]
|
| - // are invalid.
|
| - // The remaining sparse invalid IDs are kept in |removed_instance_ids_| set.
|
| - // The following code compacts the set by incrementing
|
| - // |last_instance_id_removed_|.
|
| - if (guest_instance_id == last_instance_id_removed_ + 1) {
|
| - ++last_instance_id_removed_;
|
| - // Compact.
|
| - std::set<int>::iterator iter = removed_instance_ids_.begin();
|
| - while (iter != removed_instance_ids_.end()) {
|
| - int instance_id = *iter;
|
| - // The sparse invalid IDs must not lie within
|
| - // [0, last_instance_id_removed_]
|
| - DCHECK(instance_id > last_instance_id_removed_);
|
| - if (instance_id != last_instance_id_removed_ + 1)
|
| - break;
|
| - ++last_instance_id_removed_;
|
| - removed_instance_ids_.erase(iter++);
|
| - }
|
| - } else {
|
| - removed_instance_ids_.insert(guest_instance_id);
|
| - }
|
| -}
|
| -
|
| -content::WebContents* GuestViewManager::GetGuestByInstanceID(
|
| - int guest_instance_id) {
|
| - GuestInstanceMap::const_iterator it =
|
| - guest_web_contents_by_instance_id_.find(guest_instance_id);
|
| - if (it == guest_web_contents_by_instance_id_.end())
|
| - return NULL;
|
| - return it->second;
|
| -}
|
| -
|
| -bool GuestViewManager::CanEmbedderAccessInstanceIDMaybeKill(
|
| - int embedder_render_process_id,
|
| - int guest_instance_id) {
|
| - if (!CanEmbedderAccessInstanceID(embedder_render_process_id,
|
| - guest_instance_id)) {
|
| - // The embedder process is trying to access a guest it does not own.
|
| - content::RecordAction(
|
| - base::UserMetricsAction("BadMessageTerminate_BPGM"));
|
| - base::KillProcess(
|
| - content::RenderProcessHost::FromID(embedder_render_process_id)->
|
| - GetHandle(),
|
| - content::RESULT_CODE_KILLED_BAD_MESSAGE, false);
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -bool GuestViewManager::CanUseGuestInstanceID(int guest_instance_id) {
|
| - if (guest_instance_id <= last_instance_id_removed_)
|
| - return false;
|
| - return !ContainsKey(removed_instance_ids_, guest_instance_id);
|
| -}
|
| -
|
| -bool GuestViewManager::CanEmbedderAccessInstanceID(
|
| - int embedder_render_process_id,
|
| - int guest_instance_id) {
|
| - // The embedder is trying to access a guest with a negative or zero
|
| - // instance ID.
|
| - if (guest_instance_id <= guestview::kInstanceIDNone)
|
| - return false;
|
| -
|
| - // The embedder is trying to access an instance ID that has not yet been
|
| - // allocated by GuestViewManager. This could cause instance ID
|
| - // collisions in the future, and potentially give one embedder access to a
|
| - // guest it does not own.
|
| - if (guest_instance_id > current_instance_id_)
|
| - return false;
|
| -
|
| - // We might get some late arriving messages at tear down. Let's let the
|
| - // embedder tear down in peace.
|
| - GuestInstanceMap::const_iterator it =
|
| - guest_web_contents_by_instance_id_.find(guest_instance_id);
|
| - if (it == guest_web_contents_by_instance_id_.end())
|
| - return true;
|
| -
|
| - GuestViewBase* guest_view = GuestViewBase::FromWebContents(it->second);
|
| - if (!guest_view)
|
| - return false;
|
| -
|
| - return embedder_render_process_id == guest_view->embedder_render_process_id();
|
| -}
|
|
|