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. 4 5 #ifndef CONTENT_BROWSER_DEVTOOLS_EMBEDDED_WORKER_DEVTOOLS_MANAGER_H_ 6 #define CONTENT_BROWSER_DEVTOOLS_EMBEDDED_WORKER_DEVTOOLS_MANAGER_H_ 7 8 #include "base/basictypes.h" 9 #include "base/containers/scoped_ptr_hash_map.h" 10 #include "base/gtest_prod_util.h" 11 #include "base/memory/scoped_vector.h" 12 #include "base/memory/singleton.h" 13 #include "base/strings/string16.h" 14 #include "content/browser/shared_worker/shared_worker_instance.h" 15 #include "content/common/content_export.h" 16 17 namespace content { 18 19 class DevToolsAgentHost; 20 class ServiceWorkerContextCore; 21 22 // EmbeddedWorkerDevToolsManager is used instead of WorkerDevToolsManager when 23 // "enable-embedded-shared-worker" flag is set. 24 // This class lives on UI thread. 25 class CONTENT_EXPORT EmbeddedWorkerDevToolsManager { 26 public: 27 typedef std::pair<int, int> WorkerId; 28 class EmbeddedWorkerDevToolsAgentHost; 29 30 class ServiceWorkerIdentifier { 31 public: 32 ServiceWorkerIdentifier( 33 const ServiceWorkerContextCore* const service_worker_context, 34 int64 service_worker_version_id); 35 explicit ServiceWorkerIdentifier(const ServiceWorkerIdentifier& other); 36 ~ServiceWorkerIdentifier() {} 37 38 bool Matches(const ServiceWorkerIdentifier& other) const; 39 40 private: 41 const ServiceWorkerContextCore* const service_worker_context_; 42 const int64 service_worker_version_id_; 43 }; 44 45 // Returns the EmbeddedWorkerDevToolsManager singleton. 46 static EmbeddedWorkerDevToolsManager* GetInstance(); 47 48 DevToolsAgentHost* GetDevToolsAgentHostForWorker(int worker_process_id, 49 int worker_route_id); 50 DevToolsAgentHost* GetDevToolsAgentHostForServiceWorker( 51 const ServiceWorkerIdentifier& service_worker_id); 52 53 // Returns true when the worker must be paused on start because a DevTool 54 // window for the same former SharedWorkerInstance is still opened. 55 bool SharedWorkerCreated(int worker_process_id, 56 int worker_route_id, 57 const SharedWorkerInstance& instance); 58 // Returns true when the worker must be paused on start because a DevTool 59 // window for the same former ServiceWorkerIdentifier is still opened or 60 // debug-on-start is enabled in chrome://serviceworker-internals. 61 bool ServiceWorkerCreated(int worker_process_id, 62 int worker_route_id, 63 const ServiceWorkerIdentifier& service_worker_id); 64 void WorkerContextStarted(int worker_process_id, int worker_route_id); 65 void WorkerDestroyed(int worker_process_id, int worker_route_id); 66 67 void set_debug_service_worker_on_start(bool debug_on_start) { 68 debug_service_worker_on_start_ = debug_on_start; 69 } 70 bool debug_service_worker_on_start() const { 71 return debug_service_worker_on_start_; 72 } 73 74 private: 75 friend struct DefaultSingletonTraits<EmbeddedWorkerDevToolsManager>; 76 friend class EmbeddedWorkerDevToolsManagerTest; 77 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerDevToolsManagerTest, BasicTest); 78 FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerDevToolsManagerTest, AttachTest); 79 80 enum WorkerState { 81 WORKER_UNINSPECTED, 82 WORKER_INSPECTED, 83 WORKER_TERMINATED, 84 WORKER_PAUSED_FOR_DEBUG_ON_START, 85 WORKER_PAUSED_FOR_REATTACH, 86 }; 87 88 class WorkerInfo { 89 public: 90 // Creates WorkerInfo for SharedWorker. 91 explicit WorkerInfo(const SharedWorkerInstance& instance); 92 // Creates WorkerInfo for ServiceWorker. 93 explicit WorkerInfo(const ServiceWorkerIdentifier& service_worker_id); 94 ~WorkerInfo(); 95 96 WorkerState state() { return state_; } 97 void set_state(WorkerState new_state) { state_ = new_state; } 98 EmbeddedWorkerDevToolsAgentHost* agent_host() { return agent_host_; } 99 void set_agent_host(EmbeddedWorkerDevToolsAgentHost* agent_host) { 100 agent_host_ = agent_host; 101 } 102 bool Matches(const SharedWorkerInstance& other); 103 bool Matches(const ServiceWorkerIdentifier& other); 104 105 private: 106 scoped_ptr<SharedWorkerInstance> shared_worker_instance_; 107 scoped_ptr<ServiceWorkerIdentifier> service_worker_id_; 108 WorkerState state_; 109 EmbeddedWorkerDevToolsAgentHost* agent_host_; 110 }; 111 112 typedef base::ScopedPtrHashMap<WorkerId, WorkerInfo> WorkerInfoMap; 113 114 EmbeddedWorkerDevToolsManager(); 115 virtual ~EmbeddedWorkerDevToolsManager(); 116 117 void RemoveInspectedWorkerData(EmbeddedWorkerDevToolsAgentHost* agent_host); 118 119 WorkerInfoMap::iterator FindExistingSharedWorkerInfo( 120 const SharedWorkerInstance& instance); 121 WorkerInfoMap::iterator FindExistingServiceWorkerInfo( 122 const ServiceWorkerIdentifier& service_worker_id); 123 124 void MoveToPausedState(const WorkerId& id, const WorkerInfoMap::iterator& it); 125 126 // Resets to its initial state as if newly created. 127 void ResetForTesting(); 128 129 WorkerInfoMap workers_; 130 131 bool debug_service_worker_on_start_; 132 133 DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerDevToolsManager); 134 }; 135 136 } // namespace content 137 138 #endif // CONTENT_BROWSER_DEVTOOLS_EMBEDDED_WORKER_DEVTOOLS_MANAGER_H_ 139