Index: extensions/browser/guest_view/guest_view_manager.cc |
diff --git a/extensions/browser/guest_view/guest_view_manager.cc b/extensions/browser/guest_view/guest_view_manager.cc |
deleted file mode 100644 |
index 0d6b28beb2d8b5b440f0b9ac65d7f6699b4fc581..0000000000000000000000000000000000000000 |
--- a/extensions/browser/guest_view/guest_view_manager.cc |
+++ /dev/null |
@@ -1,375 +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 "extensions/browser/guest_view/guest_view_manager.h" |
- |
-#include "base/strings/stringprintf.h" |
-#include "content/public/browser/browser_context.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/user_metrics.h" |
-#include "content/public/browser/web_contents_observer.h" |
-#include "content/public/common/child_process_host.h" |
-#include "content/public/common/result_codes.h" |
-#include "content/public/common/url_constants.h" |
-#include "extensions/browser/guest_view/guest_view_base.h" |
-#include "extensions/browser/guest_view/guest_view_manager_delegate.h" |
-#include "extensions/browser/guest_view/guest_view_manager_factory.h" |
-#include "extensions/common/guest_view/guest_view_constants.h" |
-#include "net/base/escape.h" |
-#include "url/gurl.h" |
- |
-using content::BrowserContext; |
-using content::SiteInstance; |
-using content::WebContents; |
-using guestview::GuestViewManagerDelegate; |
- |
-namespace extensions { |
- |
-// static |
-GuestViewManagerFactory* GuestViewManager::factory_ = nullptr; |
- |
-GuestViewManager::GuestViewManager( |
- content::BrowserContext* context, |
- scoped_ptr<GuestViewManagerDelegate> delegate) |
- : current_instance_id_(0), |
- last_instance_id_removed_(0), |
- context_(context), |
- delegate_(delegate.Pass()) { |
-} |
- |
-GuestViewManager::~GuestViewManager() {} |
- |
-// static |
-GuestViewManager* GuestViewManager::CreateWithDelegate( |
- BrowserContext* context, |
- scoped_ptr<GuestViewManagerDelegate> delegate) { |
- GuestViewManager* guest_manager = FromBrowserContext(context); |
- if (!guest_manager) { |
- if (factory_) { |
- guest_manager = |
- factory_->CreateGuestViewManager(context, delegate.Pass()); |
- } else { |
- guest_manager = new GuestViewManager(context, delegate.Pass()); |
- } |
- context->SetUserData(guestview::kGuestViewManagerKeyName, guest_manager); |
- } |
- return guest_manager; |
-} |
- |
-// static |
-GuestViewManager* GuestViewManager::FromBrowserContext( |
- BrowserContext* context) { |
- return static_cast<GuestViewManager*>(context->GetUserData( |
- guestview::kGuestViewManagerKeyName)); |
-} |
- |
-content::WebContents* GuestViewManager::GetGuestByInstanceIDSafely( |
- int guest_instance_id, |
- int embedder_render_process_id) { |
- if (!CanEmbedderAccessInstanceIDMaybeKill(embedder_render_process_id, |
- guest_instance_id)) { |
- return nullptr; |
- } |
- return GetGuestByInstanceID(guest_instance_id); |
-} |
- |
-void GuestViewManager::AttachGuest(int embedder_process_id, |
- int element_instance_id, |
- int guest_instance_id, |
- const base::DictionaryValue& attach_params) { |
- auto guest_view = GuestViewBase::From(embedder_process_id, guest_instance_id); |
- if (!guest_view) |
- return; |
- |
- ElementInstanceKey key(embedder_process_id, element_instance_id); |
- auto it = instance_id_map_.find(key); |
- // If there is an existing guest attached to the element, then destroy the |
- // existing guest. |
- if (it != instance_id_map_.end()) { |
- int old_guest_instance_id = it->second; |
- if (old_guest_instance_id == guest_instance_id) |
- return; |
- |
- auto old_guest_view = GuestViewBase::From(embedder_process_id, |
- old_guest_instance_id); |
- old_guest_view->Destroy(); |
- } |
- instance_id_map_[key] = guest_instance_id; |
- reverse_instance_id_map_[guest_instance_id] = key; |
- guest_view->SetAttachParams(attach_params); |
-} |
- |
-void GuestViewManager::DetachGuest(GuestViewBase* guest) { |
- if (!guest->attached()) |
- return; |
- |
- auto reverse_it = reverse_instance_id_map_.find(guest->guest_instance_id()); |
- if (reverse_it == reverse_instance_id_map_.end()) |
- return; |
- |
- const ElementInstanceKey& key = reverse_it->second; |
- |
- auto it = instance_id_map_.find(key); |
- DCHECK(it != instance_id_map_.end()); |
- |
- reverse_instance_id_map_.erase(reverse_it); |
- instance_id_map_.erase(it); |
-} |
- |
-bool GuestViewManager::IsOwnedByExtension(GuestViewBase* guest) { |
- return delegate_->IsOwnedByExtension(guest); |
-} |
- |
-int GuestViewManager::GetNextInstanceID() { |
- return ++current_instance_id_; |
-} |
- |
-void GuestViewManager::CreateGuest(const std::string& view_type, |
- content::WebContents* owner_web_contents, |
- const base::DictionaryValue& create_params, |
- const WebContentsCreatedCallback& callback) { |
- GuestViewBase* guest = CreateGuestInternal(owner_web_contents, view_type); |
- if (!guest) { |
- callback.Run(nullptr); |
- return; |
- } |
- guest->Init(create_params, callback); |
-} |
- |
-content::WebContents* GuestViewManager::CreateGuestWithWebContentsParams( |
- const std::string& view_type, |
- content::WebContents* owner_web_contents, |
- const content::WebContents::CreateParams& create_params) { |
- auto guest = CreateGuestInternal(owner_web_contents, view_type); |
- if (!guest) |
- return nullptr; |
- content::WebContents::CreateParams guest_create_params(create_params); |
- guest_create_params.guest_delegate = guest; |
- auto guest_web_contents = WebContents::Create(guest_create_params); |
- guest->InitWithWebContents(base::DictionaryValue(), guest_web_contents); |
- return guest_web_contents; |
-} |
- |
-content::WebContents* GuestViewManager::GetGuestByInstanceID( |
- int owner_process_id, |
- int element_instance_id) { |
- int guest_instance_id = GetGuestInstanceIDForElementID(owner_process_id, |
- element_instance_id); |
- if (guest_instance_id == guestview::kInstanceIDNone) |
- return nullptr; |
- |
- return GetGuestByInstanceID(guest_instance_id); |
-} |
- |
-int GuestViewManager::GetGuestInstanceIDForElementID(int owner_process_id, |
- int element_instance_id) { |
- auto iter = instance_id_map_.find( |
- ElementInstanceKey(owner_process_id, element_instance_id)); |
- if (iter == instance_id_map_.end()) |
- return guestview::kInstanceIDNone; |
- return iter->second; |
-} |
- |
-SiteInstance* GuestViewManager::GetGuestSiteInstance( |
- const GURL& guest_site) { |
- for (const auto& guest : guest_web_contents_by_instance_id_) { |
- if (guest.second->GetSiteInstance()->GetSiteURL() == guest_site) |
- return guest.second->GetSiteInstance(); |
- } |
- return nullptr; |
-} |
- |
-bool GuestViewManager::ForEachGuest(WebContents* owner_web_contents, |
- const GuestCallback& callback) { |
- for (const auto& guest : guest_web_contents_by_instance_id_) { |
- auto guest_view = GuestViewBase::FromWebContents(guest.second); |
- if (guest_view->owner_web_contents() != owner_web_contents) |
- continue; |
- |
- if (callback.Run(guest_view->web_contents())) |
- return true; |
- } |
- return false; |
-} |
- |
-WebContents* GuestViewManager::GetFullPageGuest( |
- WebContents* embedder_web_contents) { |
- WebContents* result = nullptr; |
- ForEachGuest(embedder_web_contents, |
- base::Bind(&GuestViewManager::GetFullPageGuestHelper, &result)); |
- return result; |
-} |
- |
-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) { |
- auto 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); |
- |
- auto id_iter = reverse_instance_id_map_.find(guest_instance_id); |
- if (id_iter != reverse_instance_id_map_.end()) { |
- const ElementInstanceKey& instance_id_key = id_iter->second; |
- instance_id_map_.erase(instance_id_map_.find(instance_id_key)); |
- reverse_instance_id_map_.erase(id_iter); |
- } |
- |
- // 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. |
- auto 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); |
- } |
-} |
- |
-GuestViewBase* GuestViewManager::CreateGuestInternal( |
- content::WebContents* owner_web_contents, |
- const std::string& view_type) { |
- if (guest_view_registry_.empty()) |
- RegisterGuestViewTypes(); |
- |
- auto it = guest_view_registry_.find(view_type); |
- if (it == guest_view_registry_.end()) { |
- NOTREACHED(); |
- return nullptr; |
- } |
- |
- return it->second.Run(owner_web_contents); |
-} |
- |
-void GuestViewManager::RegisterGuestViewTypes() { |
- delegate_->RegisterAdditionalGuestViewTypes(); |
-} |
- |
-bool GuestViewManager::IsGuestAvailableToContext(GuestViewBase* guest) { |
- return delegate_->IsGuestAvailableToContext(guest); |
-} |
- |
-void GuestViewManager::DispatchEvent(const std::string& event_name, |
- scoped_ptr<base::DictionaryValue> args, |
- GuestViewBase* guest, |
- int instance_id) { |
- delegate_->DispatchEvent(event_name, args.Pass(), guest, instance_id); |
-} |
- |
-content::WebContents* GuestViewManager::GetGuestByInstanceID( |
- int guest_instance_id) { |
- auto it = guest_web_contents_by_instance_id_.find(guest_instance_id); |
- if (it == guest_web_contents_by_instance_id_.end()) |
- return nullptr; |
- 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")); |
- content::RenderProcessHost::FromID(embedder_render_process_id) |
- ->Shutdown(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); |
-} |
- |
-// static |
-bool GuestViewManager::GetFullPageGuestHelper( |
- content::WebContents** result, |
- content::WebContents* guest_web_contents) { |
- auto guest_view = GuestViewBase::FromWebContents(guest_web_contents); |
- if (guest_view && guest_view->is_full_page_plugin()) { |
- *result = guest_web_contents; |
- return true; |
- } |
- return false; |
-} |
- |
-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. |
- auto it = guest_web_contents_by_instance_id_.find(guest_instance_id); |
- if (it == guest_web_contents_by_instance_id_.end()) |
- return true; |
- |
- auto guest_view = GuestViewBase::FromWebContents(it->second); |
- if (!guest_view) |
- return false; |
- |
- return embedder_render_process_id == |
- guest_view->owner_web_contents()->GetRenderProcessHost()->GetID(); |
-} |
- |
-GuestViewManager::ElementInstanceKey::ElementInstanceKey() |
- : embedder_process_id(content::ChildProcessHost::kInvalidUniqueID), |
- element_instance_id(content::ChildProcessHost::kInvalidUniqueID) { |
-} |
- |
-GuestViewManager::ElementInstanceKey::ElementInstanceKey( |
- int embedder_process_id, |
- int element_instance_id) |
- : embedder_process_id(embedder_process_id), |
- element_instance_id(element_instance_id) { |
-} |
- |
-bool GuestViewManager::ElementInstanceKey::operator<( |
- const GuestViewManager::ElementInstanceKey& other) const { |
- if (embedder_process_id != other.embedder_process_id) |
- return embedder_process_id < other.embedder_process_id; |
- |
- return element_instance_id < other.element_instance_id; |
-} |
- |
-bool GuestViewManager::ElementInstanceKey::operator==( |
- const GuestViewManager::ElementInstanceKey& other) const { |
- return (embedder_process_id == other.embedder_process_id) && |
- (element_instance_id == other.element_instance_id); |
-} |
- |
-} // namespace extensions |