summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/devtools/embedded_worker_devtools_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/devtools/embedded_worker_devtools_manager.h')
-rw-r--r--chromium/content/browser/devtools/embedded_worker_devtools_manager.h138
1 files changed, 138 insertions, 0 deletions
diff --git a/chromium/content/browser/devtools/embedded_worker_devtools_manager.h b/chromium/content/browser/devtools/embedded_worker_devtools_manager.h
new file mode 100644
index 00000000000..3b15c8f2099
--- /dev/null
+++ b/chromium/content/browser/devtools/embedded_worker_devtools_manager.h
@@ -0,0 +1,138 @@
+// 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.
+
+#ifndef CONTENT_BROWSER_DEVTOOLS_EMBEDDED_WORKER_DEVTOOLS_MANAGER_H_
+#define CONTENT_BROWSER_DEVTOOLS_EMBEDDED_WORKER_DEVTOOLS_MANAGER_H_
+
+#include "base/basictypes.h"
+#include "base/containers/scoped_ptr_hash_map.h"
+#include "base/gtest_prod_util.h"
+#include "base/memory/scoped_vector.h"
+#include "base/memory/singleton.h"
+#include "base/strings/string16.h"
+#include "content/browser/shared_worker/shared_worker_instance.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+class DevToolsAgentHost;
+class ServiceWorkerContextCore;
+
+// EmbeddedWorkerDevToolsManager is used instead of WorkerDevToolsManager when
+// "enable-embedded-shared-worker" flag is set.
+// This class lives on UI thread.
+class CONTENT_EXPORT EmbeddedWorkerDevToolsManager {
+ public:
+ typedef std::pair<int, int> WorkerId;
+ class EmbeddedWorkerDevToolsAgentHost;
+
+ class ServiceWorkerIdentifier {
+ public:
+ ServiceWorkerIdentifier(
+ const ServiceWorkerContextCore* const service_worker_context,
+ int64 service_worker_version_id);
+ explicit ServiceWorkerIdentifier(const ServiceWorkerIdentifier& other);
+ ~ServiceWorkerIdentifier() {}
+
+ bool Matches(const ServiceWorkerIdentifier& other) const;
+
+ private:
+ const ServiceWorkerContextCore* const service_worker_context_;
+ const int64 service_worker_version_id_;
+ };
+
+ // Returns the EmbeddedWorkerDevToolsManager singleton.
+ static EmbeddedWorkerDevToolsManager* GetInstance();
+
+ DevToolsAgentHost* GetDevToolsAgentHostForWorker(int worker_process_id,
+ int worker_route_id);
+ DevToolsAgentHost* GetDevToolsAgentHostForServiceWorker(
+ const ServiceWorkerIdentifier& service_worker_id);
+
+ // Returns true when the worker must be paused on start because a DevTool
+ // window for the same former SharedWorkerInstance is still opened.
+ bool SharedWorkerCreated(int worker_process_id,
+ int worker_route_id,
+ const SharedWorkerInstance& instance);
+ // Returns true when the worker must be paused on start because a DevTool
+ // window for the same former ServiceWorkerIdentifier is still opened or
+ // debug-on-start is enabled in chrome://serviceworker-internals.
+ bool ServiceWorkerCreated(int worker_process_id,
+ int worker_route_id,
+ const ServiceWorkerIdentifier& service_worker_id);
+ void WorkerContextStarted(int worker_process_id, int worker_route_id);
+ void WorkerDestroyed(int worker_process_id, int worker_route_id);
+
+ void set_debug_service_worker_on_start(bool debug_on_start) {
+ debug_service_worker_on_start_ = debug_on_start;
+ }
+ bool debug_service_worker_on_start() const {
+ return debug_service_worker_on_start_;
+ }
+
+ private:
+ friend struct DefaultSingletonTraits<EmbeddedWorkerDevToolsManager>;
+ friend class EmbeddedWorkerDevToolsManagerTest;
+ FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerDevToolsManagerTest, BasicTest);
+ FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerDevToolsManagerTest, AttachTest);
+
+ enum WorkerState {
+ WORKER_UNINSPECTED,
+ WORKER_INSPECTED,
+ WORKER_TERMINATED,
+ WORKER_PAUSED_FOR_DEBUG_ON_START,
+ WORKER_PAUSED_FOR_REATTACH,
+ };
+
+ class WorkerInfo {
+ public:
+ // Creates WorkerInfo for SharedWorker.
+ explicit WorkerInfo(const SharedWorkerInstance& instance);
+ // Creates WorkerInfo for ServiceWorker.
+ explicit WorkerInfo(const ServiceWorkerIdentifier& service_worker_id);
+ ~WorkerInfo();
+
+ WorkerState state() { return state_; }
+ void set_state(WorkerState new_state) { state_ = new_state; }
+ EmbeddedWorkerDevToolsAgentHost* agent_host() { return agent_host_; }
+ void set_agent_host(EmbeddedWorkerDevToolsAgentHost* agent_host) {
+ agent_host_ = agent_host;
+ }
+ bool Matches(const SharedWorkerInstance& other);
+ bool Matches(const ServiceWorkerIdentifier& other);
+
+ private:
+ scoped_ptr<SharedWorkerInstance> shared_worker_instance_;
+ scoped_ptr<ServiceWorkerIdentifier> service_worker_id_;
+ WorkerState state_;
+ EmbeddedWorkerDevToolsAgentHost* agent_host_;
+ };
+
+ typedef base::ScopedPtrHashMap<WorkerId, WorkerInfo> WorkerInfoMap;
+
+ EmbeddedWorkerDevToolsManager();
+ virtual ~EmbeddedWorkerDevToolsManager();
+
+ void RemoveInspectedWorkerData(EmbeddedWorkerDevToolsAgentHost* agent_host);
+
+ WorkerInfoMap::iterator FindExistingSharedWorkerInfo(
+ const SharedWorkerInstance& instance);
+ WorkerInfoMap::iterator FindExistingServiceWorkerInfo(
+ const ServiceWorkerIdentifier& service_worker_id);
+
+ void MoveToPausedState(const WorkerId& id, const WorkerInfoMap::iterator& it);
+
+ // Resets to its initial state as if newly created.
+ void ResetForTesting();
+
+ WorkerInfoMap workers_;
+
+ bool debug_service_worker_on_start_;
+
+ DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerDevToolsManager);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_DEVTOOLS_EMBEDDED_WORKER_DEVTOOLS_MANAGER_H_