Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(406)

Unified Diff: third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp

Issue 2843603002: Move ScriptWrappable and dependencies to platform/bindings (Closed)
Patch Set: Rebase and try again Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp b/third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp
deleted file mode 100644
index 97f2c12b14ed6dafa231c3c1a386c0c34aa58645..0000000000000000000000000000000000000000
--- a/third_party/WebKit/Source/bindings/core/v8/DOMWrapperWorld.cpp
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright (C) 2009 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "bindings/core/v8/DOMWrapperWorld.h"
-
-#include <memory>
-
-#include "bindings/core/v8/DOMDataStore.h"
-#include "bindings/core/v8/ScriptFunction.h"
-#include "platform/wtf/HashTraits.h"
-#include "platform/wtf/PtrUtil.h"
-#include "platform/wtf/StdLibExtras.h"
-
-namespace blink {
-
-unsigned DOMWrapperWorld::number_of_non_main_worlds_in_main_thread_ = 0;
-
-// This does not contain the main world because the WorldMap needs
-// non-default hashmap traits (WTF::UnsignedWithZeroKeyHashTraits) to contain
-// it for the main world's id (0), and it may change the performance trends.
-// (see https://crbug.com/704778#c6).
-using WorldMap = HashMap<int, DOMWrapperWorld*>;
-static WorldMap& GetWorldMap() {
- DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<WorldMap>, map,
- new ThreadSpecific<WorldMap>);
- return *map;
-}
-
-#if DCHECK_IS_ON()
-static bool IsIsolatedWorldId(int world_id) {
- return DOMWrapperWorld::kMainWorldId < world_id &&
- world_id < DOMWrapperWorld::kIsolatedWorldIdLimit;
-}
-#endif
-
-PassRefPtr<DOMWrapperWorld> DOMWrapperWorld::Create(v8::Isolate* isolate,
- WorldType world_type) {
- DCHECK_NE(WorldType::kIsolated, world_type);
- return AdoptRef(new DOMWrapperWorld(isolate, world_type,
- GenerateWorldIdForType(world_type)));
-}
-
-DOMWrapperWorld::DOMWrapperWorld(v8::Isolate* isolate,
- WorldType world_type,
- int world_id)
- : world_type_(world_type),
- world_id_(world_id),
- dom_data_store_(
- WTF::WrapUnique(new DOMDataStore(isolate, IsMainWorld()))) {
- switch (world_type_) {
- case WorldType::kMain:
- // The main world is managed separately from worldMap(). See worldMap().
- break;
- case WorldType::kIsolated:
- case WorldType::kGarbageCollector:
- case WorldType::kRegExp:
- case WorldType::kTesting:
- case WorldType::kWorker: {
- WorldMap& map = GetWorldMap();
- DCHECK(!map.Contains(world_id_));
- map.insert(world_id_, this);
- if (IsMainThread())
- number_of_non_main_worlds_in_main_thread_++;
- break;
- }
- }
-}
-
-DOMWrapperWorld& DOMWrapperWorld::MainWorld() {
- DCHECK(IsMainThread());
- DEFINE_STATIC_REF(
- DOMWrapperWorld, cached_main_world,
- (DOMWrapperWorld::Create(v8::Isolate::GetCurrent(), WorldType::kMain)));
- return *cached_main_world;
-}
-
-void DOMWrapperWorld::AllWorldsInCurrentThread(
- Vector<RefPtr<DOMWrapperWorld>>& worlds) {
- if (IsMainThread())
- worlds.push_back(&MainWorld());
- for (DOMWrapperWorld* world : GetWorldMap().Values())
- worlds.push_back(world);
-}
-
-void DOMWrapperWorld::MarkWrappersInAllWorlds(
- ScriptWrappable* script_wrappable,
- const ScriptWrappableVisitor* visitor) {
- // Marking for worlds other than the main world.
- DCHECK(ThreadState::Current()->GetIsolate());
- for (DOMWrapperWorld* world : GetWorldMap().Values()) {
- DOMDataStore& data_store = world->DomDataStore();
- if (data_store.ContainsWrapper(script_wrappable))
- data_store.MarkWrapper(script_wrappable);
- }
-
- // Marking for the main world.
- if (IsMainThread())
- script_wrappable->MarkWrapper(visitor);
-}
-
-DOMWrapperWorld::~DOMWrapperWorld() {
- DCHECK(!IsMainWorld());
- if (IsMainThread())
- number_of_non_main_worlds_in_main_thread_--;
-
- // WorkerWorld should be disposed of before the dtor.
- if (!IsWorkerWorld())
- Dispose();
- DCHECK(!GetWorldMap().Contains(world_id_));
-}
-
-void DOMWrapperWorld::Dispose() {
- dom_object_holders_.clear();
- dom_data_store_.reset();
- DCHECK(GetWorldMap().Contains(world_id_));
- GetWorldMap().erase(world_id_);
-}
-
-PassRefPtr<DOMWrapperWorld> DOMWrapperWorld::EnsureIsolatedWorld(
- v8::Isolate* isolate,
- int world_id) {
-#if DCHECK_IS_ON()
- DCHECK(IsIsolatedWorldId(world_id));
-#endif
-
- WorldMap& map = GetWorldMap();
- auto it = map.find(world_id);
- if (it != map.end()) {
- RefPtr<DOMWrapperWorld> world = it->value;
- DCHECK(world->IsIsolatedWorld());
- DCHECK_EQ(world_id, world->GetWorldId());
- return world.Release();
- }
-
- return AdoptRef(new DOMWrapperWorld(isolate, WorldType::kIsolated, world_id));
-}
-
-typedef HashMap<int, RefPtr<SecurityOrigin>> IsolatedWorldSecurityOriginMap;
-static IsolatedWorldSecurityOriginMap& IsolatedWorldSecurityOrigins() {
- DCHECK(IsMainThread());
- DEFINE_STATIC_LOCAL(IsolatedWorldSecurityOriginMap, map, ());
- return map;
-}
-
-SecurityOrigin* DOMWrapperWorld::IsolatedWorldSecurityOrigin() {
- DCHECK(this->IsIsolatedWorld());
- IsolatedWorldSecurityOriginMap& origins = IsolatedWorldSecurityOrigins();
- IsolatedWorldSecurityOriginMap::iterator it = origins.find(GetWorldId());
- return it == origins.end() ? 0 : it->value.Get();
-}
-
-void DOMWrapperWorld::SetIsolatedWorldSecurityOrigin(
- int world_id,
- PassRefPtr<SecurityOrigin> security_origin) {
-#if DCHECK_IS_ON()
- DCHECK(IsIsolatedWorldId(world_id));
-#endif
- if (security_origin)
- IsolatedWorldSecurityOrigins().Set(world_id, std::move(security_origin));
- else
- IsolatedWorldSecurityOrigins().erase(world_id);
-}
-
-typedef HashMap<int, String> IsolatedWorldHumanReadableNameMap;
-static IsolatedWorldHumanReadableNameMap& IsolatedWorldHumanReadableNames() {
- DCHECK(IsMainThread());
- DEFINE_STATIC_LOCAL(IsolatedWorldHumanReadableNameMap, map, ());
- return map;
-}
-
-String DOMWrapperWorld::IsolatedWorldHumanReadableName() {
- ASSERT(this->IsIsolatedWorld());
- return IsolatedWorldHumanReadableNames().at(GetWorldId());
-}
-
-void DOMWrapperWorld::SetIsolatedWorldHumanReadableName(
- int world_id,
- const String& human_readable_name) {
-#if DCHECK_IS_ON()
- DCHECK(IsIsolatedWorldId(world_id));
-#endif
- IsolatedWorldHumanReadableNames().Set(world_id, human_readable_name);
-}
-
-typedef HashMap<int, bool> IsolatedWorldContentSecurityPolicyMap;
-static IsolatedWorldContentSecurityPolicyMap&
-IsolatedWorldContentSecurityPolicies() {
- DCHECK(IsMainThread());
- DEFINE_STATIC_LOCAL(IsolatedWorldContentSecurityPolicyMap, map, ());
- return map;
-}
-
-bool DOMWrapperWorld::IsolatedWorldHasContentSecurityPolicy() {
- DCHECK(this->IsIsolatedWorld());
- IsolatedWorldContentSecurityPolicyMap& policies =
- IsolatedWorldContentSecurityPolicies();
- IsolatedWorldContentSecurityPolicyMap::iterator it =
- policies.find(GetWorldId());
- return it == policies.end() ? false : it->value;
-}
-
-void DOMWrapperWorld::SetIsolatedWorldContentSecurityPolicy(
- int world_id,
- const String& policy) {
-#if DCHECK_IS_ON()
- DCHECK(IsIsolatedWorldId(world_id));
-#endif
- if (!policy.IsEmpty())
- IsolatedWorldContentSecurityPolicies().Set(world_id, true);
- else
- IsolatedWorldContentSecurityPolicies().erase(world_id);
-}
-
-void DOMWrapperWorld::RegisterDOMObjectHolderInternal(
- std::unique_ptr<DOMObjectHolderBase> holder_base) {
- DCHECK(!dom_object_holders_.Contains(holder_base.get()));
- holder_base->SetWorld(this);
- holder_base->SetWeak(&DOMWrapperWorld::WeakCallbackForDOMObjectHolder);
- dom_object_holders_.insert(std::move(holder_base));
-}
-
-void DOMWrapperWorld::UnregisterDOMObjectHolder(
- DOMObjectHolderBase* holder_base) {
- DCHECK(dom_object_holders_.Contains(holder_base));
- dom_object_holders_.erase(holder_base);
-}
-
-void DOMWrapperWorld::WeakCallbackForDOMObjectHolder(
- const v8::WeakCallbackInfo<DOMObjectHolderBase>& data) {
- DOMObjectHolderBase* holder_base = data.GetParameter();
- holder_base->World()->UnregisterDOMObjectHolder(holder_base);
-}
-
-int DOMWrapperWorld::GenerateWorldIdForType(WorldType world_type) {
- DEFINE_THREAD_SAFE_STATIC_LOCAL(ThreadSpecific<int>, next_world_id,
- new ThreadSpecific<int>);
- if (!next_world_id.IsSet())
- *next_world_id = WorldId::kUnspecifiedWorldIdStart;
- switch (world_type) {
- case WorldType::kMain:
- return kMainWorldId;
- case WorldType::kIsolated:
- // This function should not be called for IsolatedWorld because an
- // identifier for the world is given from out of DOMWrapperWorld.
- NOTREACHED();
- return kInvalidWorldId;
- case WorldType::kGarbageCollector:
- case WorldType::kRegExp:
- case WorldType::kTesting:
- case WorldType::kWorker:
- int world_id = *next_world_id;
- CHECK_GE(world_id, WorldId::kUnspecifiedWorldIdStart);
- *next_world_id = world_id + 1;
- return world_id;
- }
- NOTREACHED();
- return kInvalidWorldId;
-}
-
-void DOMWrapperWorld::DissociateDOMWindowWrappersInAllWorlds(
- ScriptWrappable* script_wrappable) {
- DCHECK(script_wrappable);
- DCHECK(IsMainThread());
-
- script_wrappable->UnsetWrapperIfAny();
-
- for (auto& world : GetWorldMap().Values())
- world->DomDataStore().UnsetWrapperIfAny(script_wrappable);
-}
-
-} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698