1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "bindings/core/v8/V8DOMActivityLogger.h"
8 #include "bindings/core/v8/V8Binding.h"
9 #include "platform/weborigin/KURL.h"
10 #include "wtf/HashMap.h"
11 #include "wtf/MainThread.h"
12 #include "wtf/text/StringHash.h"
16 typedef HashMap<String, OwnPtr<V8DOMActivityLogger> > DOMActivityLoggerMapForMainWorld;
17 typedef HashMap<int, OwnPtr<V8DOMActivityLogger>, WTF::IntHash<int>, WTF::UnsignedWithZeroKeyHashTraits<int> > DOMActivityLoggerMapForIsolatedWorld;
19 static DOMActivityLoggerMapForMainWorld& domActivityLoggersForMainWorld()
21 ASSERT(isMainThread());
22 DEFINE_STATIC_LOCAL(DOMActivityLoggerMapForMainWorld, map, ());
26 static DOMActivityLoggerMapForIsolatedWorld& domActivityLoggersForIsolatedWorld()
28 ASSERT(isMainThread());
29 DEFINE_STATIC_LOCAL(DOMActivityLoggerMapForIsolatedWorld, map, ());
33 void V8DOMActivityLogger::setActivityLogger(int worldId, const String& extensionId, PassOwnPtr<V8DOMActivityLogger> logger)
36 domActivityLoggersForIsolatedWorld().set(worldId, logger);
38 domActivityLoggersForMainWorld().set(extensionId, logger);
41 V8DOMActivityLogger* V8DOMActivityLogger::activityLogger(int worldId, const String& extensionId)
44 DOMActivityLoggerMapForIsolatedWorld& loggers = domActivityLoggersForIsolatedWorld();
45 DOMActivityLoggerMapForIsolatedWorld::iterator it = loggers.find(worldId);
46 return it == loggers.end() ? 0 : it->value.get();
49 if (extensionId.isEmpty())
52 DOMActivityLoggerMapForMainWorld& loggers = domActivityLoggersForMainWorld();
53 DOMActivityLoggerMapForMainWorld::iterator it = loggers.find(extensionId);
54 return it == loggers.end() ? 0 : it->value.get();
57 V8DOMActivityLogger* V8DOMActivityLogger::activityLogger(int worldId, const KURL& url)
59 // extension ID is ignored for worldId != 0.
61 return activityLogger(worldId, String());
63 // To find an activity logger that corresponds to the main world of an
64 // extension, we need to obtain the extension ID. Extension ID is a hostname
65 // of a background page's URL.
66 if (!url.protocolIs("chrome-extension"))
69 return activityLogger(worldId, url.host());
72 V8DOMActivityLogger* V8DOMActivityLogger::currentActivityLogger()
74 v8::Isolate* isolate = v8::Isolate::GetCurrent();
75 if (!isolate->InContext())
78 v8::HandleScope handleScope(isolate);
79 v8::Handle<v8::Context> context = isolate->GetCurrentContext();
80 if (context.IsEmpty() || !toDOMWindow(context))
83 V8PerContextData* contextData = ScriptState::from(context)->perContextData();
87 return contextData->activityLogger();
90 V8DOMActivityLogger* V8DOMActivityLogger::currentActivityLoggerIfIsolatedWorld()
92 v8::Isolate* isolate = v8::Isolate::GetCurrent();
93 if (!isolate->InContext())
96 v8::HandleScope handleScope(isolate);
97 v8::Handle<v8::Context> context = isolate->GetCurrentContext();
98 if (context.IsEmpty() || !toDOMWindow(context))
101 ScriptState* scriptState = ScriptState::from(context);
102 if (!scriptState->world().isIsolatedWorld())
105 V8PerContextData* contextData = scriptState->perContextData();
109 return contextData->activityLogger();