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

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

Issue 2702273004: bindings: Simplifies WindowProxyManager and its relation to Frame. (Closed)
Patch Set: Fixed WindowProxyManager::createWindowProxy(ForFrame). Created 3 years, 9 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/WindowProxyManager.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp b/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp
index a96d286f31687deeaf88dc932298b25d0dcbc2f4..8097cdb8d78b1b4d6a63a04a8e1eecc41eb9f76c 100644
--- a/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.cpp
@@ -8,81 +8,86 @@
namespace blink {
-namespace {
-
-WindowProxy* createWindowProxyForFrame(v8::Isolate* isolate,
- Frame& frame,
-
- RefPtr<DOMWrapperWorld> world) {
- if (frame.isLocalFrame()) {
- return LocalWindowProxy::create(isolate, toLocalFrame(frame),
- std::move(world));
- }
- return RemoteWindowProxy::create(isolate, toRemoteFrame(frame),
- std::move(world));
-}
-}
-
-DEFINE_TRACE(WindowProxyManagerBase) {
+DEFINE_TRACE(WindowProxyManager) {
visitor->trace(m_frame);
visitor->trace(m_windowProxy);
visitor->trace(m_isolatedWorlds);
}
-WindowProxy* WindowProxyManagerBase::windowProxy(DOMWrapperWorld& world) {
- WindowProxy* windowProxy = nullptr;
- if (world.isMainWorld()) {
- windowProxy = m_windowProxy.get();
- } else {
- IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId());
- if (iter != m_isolatedWorlds.end()) {
- windowProxy = iter->value.get();
- } else {
- windowProxy = createWindowProxyForFrame(m_isolate, *m_frame, &world);
- m_isolatedWorlds.set(world.worldId(), windowProxy);
- }
- }
- return windowProxy;
-}
-
-void WindowProxyManagerBase::clearForClose() {
+void WindowProxyManager::clearForClose() {
m_windowProxy->clearForClose();
for (auto& entry : m_isolatedWorlds)
entry.value->clearForClose();
}
-void WindowProxyManagerBase::clearForNavigation() {
+void WindowProxyManager::clearForNavigation() {
m_windowProxy->clearForNavigation();
for (auto& entry : m_isolatedWorlds)
entry.value->clearForNavigation();
}
-void WindowProxyManagerBase::releaseGlobals(GlobalsVector& globals) {
+void WindowProxyManager::releaseGlobals(GlobalsVector& globals) {
globals.reserveInitialCapacity(1 + m_isolatedWorlds.size());
globals.emplace_back(&m_windowProxy->world(), m_windowProxy->releaseGlobal());
for (auto& entry : m_isolatedWorlds) {
- globals.emplace_back(&entry.value->world(),
- windowProxy(entry.value->world())->releaseGlobal());
+ globals.emplace_back(
+ &entry.value->world(),
+ windowProxyMaybeUninitialized(entry.value->world())->releaseGlobal());
}
}
-void WindowProxyManagerBase::setGlobals(const GlobalsVector& globals) {
+void WindowProxyManager::setGlobals(const GlobalsVector& globals) {
for (const auto& entry : globals)
- windowProxy(*entry.first)->setGlobal(entry.second);
+ windowProxyMaybeUninitialized(*entry.first)->setGlobal(entry.second);
}
-WindowProxyManagerBase::WindowProxyManagerBase(Frame& frame)
+WindowProxyManager::WindowProxyManager(Frame& frame, FrameType frameType)
: m_isolate(v8::Isolate::GetCurrent()),
m_frame(&frame),
- m_windowProxy(createWindowProxyForFrame(m_isolate,
- frame,
- &DOMWrapperWorld::mainWorld())) {}
+ m_frameType(frameType),
+ m_windowProxy(createWindowProxy(DOMWrapperWorld::mainWorld())) {}
+
+WindowProxy* WindowProxyManager::createWindowProxy(DOMWrapperWorld& world) {
+ switch (m_frameType) {
+ case FrameType::Local:
+ // Directly use static_cast instead of toLocalFrame because
+ // WindowProxyManager gets instantiated during a construction of
+ // LocalFrame and at that time virtual member functions are not yet
+ // available (we cannot use LocalFrame::isLocalFrame). Ditto for
+ // RemoteFrame.
dcheng 2017/03/16 08:43:16 This makes me a little nervous: I remember hitting
Yuki 2017/03/16 12:41:21 I personally prefer making Frame::m_windowProxyMan
+ return LocalWindowProxy::create(
+ m_isolate, *static_cast<LocalFrame*>(m_frame.get()), &world);
+ case FrameType::Remote:
+ return RemoteWindowProxy::create(
+ m_isolate, *static_cast<RemoteFrame*>(m_frame.get()), &world);
+ }
+ NOTREACHED();
+ return nullptr;
+}
+
+WindowProxy* WindowProxyManager::windowProxyMaybeUninitialized(
+ DOMWrapperWorld& world) {
+ WindowProxy* windowProxy = nullptr;
+ if (world.isMainWorld()) {
+ windowProxy = m_windowProxy.get();
+ } else {
+ IsolatedWorldMap::iterator iter = m_isolatedWorlds.find(world.worldId());
+ if (iter != m_isolatedWorlds.end()) {
+ windowProxy = iter->value.get();
+ } else {
+ windowProxy = createWindowProxy(world);
+ m_isolatedWorlds.set(world.worldId(), windowProxy);
+ }
+ }
+ return windowProxy;
+}
void LocalWindowProxyManager::updateSecurityOrigin(
SecurityOrigin* securityOrigin) {
- static_cast<LocalWindowProxy*>(mainWorldProxy())
+ static_cast<LocalWindowProxy*>(m_windowProxy.get())
->updateSecurityOrigin(securityOrigin);
- for (auto& entry : isolatedWorlds()) {
+
+ for (auto& entry : m_isolatedWorlds) {
auto* isolatedWindowProxy =
static_cast<LocalWindowProxy*>(entry.value.get());
SecurityOrigin* isolatedSecurityOrigin =
« no previous file with comments | « third_party/WebKit/Source/bindings/core/v8/WindowProxyManager.h ('k') | third_party/WebKit/Source/core/frame/Frame.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698