| Index: content/browser/devtools/protocol/service_worker_handler.cc
 | 
| diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
 | 
| index c34d15a1ec1847012b17943d55162a3037f1d831..62a962d38be234ea3176187fa139e5ec2f605553 100644
 | 
| --- a/content/browser/devtools/protocol/service_worker_handler.cc
 | 
| +++ b/content/browser/devtools/protocol/service_worker_handler.cc
 | 
| @@ -33,10 +33,7 @@
 | 
|  #include "url/gurl.h"
 | 
|  
 | 
|  namespace content {
 | 
| -namespace devtools {
 | 
| -namespace service_worker {
 | 
| -
 | 
| -using Response = DevToolsProtocolClient::Response;
 | 
| +namespace protocol {
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| @@ -58,13 +55,15 @@ const std::string GetVersionRunningStatusString(
 | 
|      EmbeddedWorkerStatus running_status) {
 | 
|    switch (running_status) {
 | 
|      case EmbeddedWorkerStatus::STOPPED:
 | 
| -      return kServiceWorkerVersionRunningStatusStopped;
 | 
| +      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Stopped;
 | 
|      case EmbeddedWorkerStatus::STARTING:
 | 
| -      return kServiceWorkerVersionRunningStatusStarting;
 | 
| +      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Starting;
 | 
|      case EmbeddedWorkerStatus::RUNNING:
 | 
| -      return kServiceWorkerVersionRunningStatusRunning;
 | 
| +      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Running;
 | 
|      case EmbeddedWorkerStatus::STOPPING:
 | 
| -      return kServiceWorkerVersionRunningStatusStopping;
 | 
| +      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Stopping;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
|    }
 | 
|    return std::string();
 | 
|  }
 | 
| @@ -73,83 +72,23 @@ const std::string GetVersionStatusString(
 | 
|      content::ServiceWorkerVersion::Status status) {
 | 
|    switch (status) {
 | 
|      case content::ServiceWorkerVersion::NEW:
 | 
| -      return kServiceWorkerVersionStatusNew;
 | 
| +      return ServiceWorker::ServiceWorkerVersionStatusEnum::New;
 | 
|      case content::ServiceWorkerVersion::INSTALLING:
 | 
| -      return kServiceWorkerVersionStatusInstalling;
 | 
| +      return ServiceWorker::ServiceWorkerVersionStatusEnum::Installing;
 | 
|      case content::ServiceWorkerVersion::INSTALLED:
 | 
| -      return kServiceWorkerVersionStatusInstalled;
 | 
| +      return ServiceWorker::ServiceWorkerVersionStatusEnum::Installed;
 | 
|      case content::ServiceWorkerVersion::ACTIVATING:
 | 
| -      return kServiceWorkerVersionStatusActivating;
 | 
| +      return ServiceWorker::ServiceWorkerVersionStatusEnum::Activating;
 | 
|      case content::ServiceWorkerVersion::ACTIVATED:
 | 
| -      return kServiceWorkerVersionStatusActivated;
 | 
| +      return ServiceWorker::ServiceWorkerVersionStatusEnum::Activated;
 | 
|      case content::ServiceWorkerVersion::REDUNDANT:
 | 
| -      return kServiceWorkerVersionStatusRedundant;
 | 
| +      return ServiceWorker::ServiceWorkerVersionStatusEnum::Redundant;
 | 
| +    default:
 | 
| +      NOTREACHED();
 | 
|    }
 | 
|    return std::string();
 | 
|  }
 | 
|  
 | 
| -scoped_refptr<ServiceWorkerVersion> CreateVersionDictionaryValue(
 | 
| -    const ServiceWorkerVersionInfo& version_info) {
 | 
| -  std::vector<std::string> clients;
 | 
| -  for (const auto& client : version_info.clients) {
 | 
| -    if (client.second.type == SERVICE_WORKER_PROVIDER_FOR_WINDOW) {
 | 
| -      RenderFrameHostImpl* render_frame_host = RenderFrameHostImpl::FromID(
 | 
| -          client.second.process_id, client.second.route_id);
 | 
| -      WebContents* web_contents =
 | 
| -          WebContents::FromRenderFrameHost(render_frame_host);
 | 
| -      // There is a possibility that the frame is already deleted because of the
 | 
| -      // thread hopping.
 | 
| -      if (!web_contents)
 | 
| -        continue;
 | 
| -      scoped_refptr<DevToolsAgentHost> agent_host(
 | 
| -          DevToolsAgentHost::GetOrCreateFor(web_contents));
 | 
| -      if (agent_host)
 | 
| -        clients.push_back(agent_host->GetId());
 | 
| -    } else if (client.second.type ==
 | 
| -               SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER) {
 | 
| -      scoped_refptr<DevToolsAgentHost> agent_host(
 | 
| -          DevToolsAgentHost::GetForWorker(client.second.process_id,
 | 
| -                                          client.second.route_id));
 | 
| -      if (agent_host)
 | 
| -        clients.push_back(agent_host->GetId());
 | 
| -    }
 | 
| -  }
 | 
| -  scoped_refptr<ServiceWorkerVersion> version(
 | 
| -      ServiceWorkerVersion::Create()
 | 
| -          ->set_version_id(base::Int64ToString(version_info.version_id))
 | 
| -          ->set_registration_id(
 | 
| -                base::Int64ToString(version_info.registration_id))
 | 
| -          ->set_script_url(version_info.script_url.spec())
 | 
| -          ->set_running_status(
 | 
| -                GetVersionRunningStatusString(version_info.running_status))
 | 
| -          ->set_status(GetVersionStatusString(version_info.status))
 | 
| -          ->set_script_last_modified(
 | 
| -                version_info.script_last_modified.ToDoubleT())
 | 
| -          ->set_script_response_time(
 | 
| -                version_info.script_response_time.ToDoubleT())
 | 
| -          ->set_controlled_clients(clients));
 | 
| -  scoped_refptr<DevToolsAgentHostImpl> host(
 | 
| -      ServiceWorkerDevToolsManager::GetInstance()
 | 
| -          ->GetDevToolsAgentHostForWorker(
 | 
| -              version_info.process_id,
 | 
| -              version_info.devtools_agent_route_id));
 | 
| -  if (host)
 | 
| -    version->set_target_id(host->GetId());
 | 
| -  return version;
 | 
| -}
 | 
| -
 | 
| -scoped_refptr<ServiceWorkerRegistration> CreateRegistrationDictionaryValue(
 | 
| -    const ServiceWorkerRegistrationInfo& registration_info) {
 | 
| -  scoped_refptr<ServiceWorkerRegistration> registration(
 | 
| -      ServiceWorkerRegistration::Create()
 | 
| -          ->set_registration_id(
 | 
| -              base::Int64ToString(registration_info.registration_id))
 | 
| -          ->set_scope_url(registration_info.pattern.spec())
 | 
| -          ->set_is_deleted(registration_info.delete_flag ==
 | 
| -                           ServiceWorkerRegistrationInfo::IS_DELETED));
 | 
| -  return registration;
 | 
| -}
 | 
| -
 | 
|  void StopServiceWorkerOnIO(scoped_refptr<ServiceWorkerContextWrapper> context,
 | 
|                             int64_t version_id) {
 | 
|    if (content::ServiceWorkerVersion* version =
 | 
| @@ -173,11 +112,11 @@ void GetDevToolsRouteInfoOnIO(
 | 
|  }
 | 
|  
 | 
|  Response CreateContextErrorResponse() {
 | 
| -  return Response::InternalError("Could not connect to the context");
 | 
| +  return Response::Error("Could not connect to the context");
 | 
|  }
 | 
|  
 | 
|  Response CreateInvalidVersionIdErrorResponse() {
 | 
| -  return Response::InternalError("Invalid version ID");
 | 
| +  return Response::InvalidParams("Invalid version ID");
 | 
|  }
 | 
|  
 | 
|  void DidFindRegistrationForDispatchSyncEventOnIO(
 | 
| @@ -217,7 +156,11 @@ ServiceWorkerHandler::ServiceWorkerHandler()
 | 
|  }
 | 
|  
 | 
|  ServiceWorkerHandler::~ServiceWorkerHandler() {
 | 
| -  Disable();
 | 
| +}
 | 
| +
 | 
| +void ServiceWorkerHandler::Wire(UberDispatcher* dispatcher) {
 | 
| +  frontend_.reset(new ServiceWorker::Frontend(dispatcher->channel()));
 | 
| +  ServiceWorker::Dispatcher::wire(dispatcher, this);
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::SetRenderFrameHost(
 | 
| @@ -237,19 +180,11 @@ void ServiceWorkerHandler::SetRenderFrameHost(
 | 
|        partition->GetServiceWorkerContext());
 | 
|  }
 | 
|  
 | 
| -void ServiceWorkerHandler::SetClient(std::unique_ptr<Client> client) {
 | 
| -  client_.swap(client);
 | 
| -}
 | 
| -
 | 
| -void ServiceWorkerHandler::Detached() {
 | 
| -  Disable();
 | 
| -}
 | 
| -
 | 
|  Response ServiceWorkerHandler::Enable() {
 | 
|    if (enabled_)
 | 
|      return Response::OK();
 | 
|    if (!context_)
 | 
| -    return Response::InternalError("Could not connect to the context");
 | 
| +    return CreateContextErrorResponse();
 | 
|    enabled_ = true;
 | 
|  
 | 
|    context_watcher_ = new ServiceWorkerContextWatcher(
 | 
| @@ -409,39 +344,89 @@ void ServiceWorkerHandler::OpenNewDevToolsWindow(int process_id,
 | 
|  
 | 
|  void ServiceWorkerHandler::OnWorkerRegistrationUpdated(
 | 
|      const std::vector<ServiceWorkerRegistrationInfo>& registrations) {
 | 
| -  std::vector<scoped_refptr<ServiceWorkerRegistration>> registration_values;
 | 
| +  using Registration = ServiceWorker::ServiceWorkerRegistration;
 | 
| +  std::unique_ptr<protocol::Array<Registration>> result =
 | 
| +      protocol::Array<Registration>::create();
 | 
|    for (const auto& registration : registrations) {
 | 
| -    registration_values.push_back(
 | 
| -        CreateRegistrationDictionaryValue(registration));
 | 
| +    result->addItem(Registration::Create()
 | 
| +        .SetRegistrationId(
 | 
| +            base::Int64ToString(registration.registration_id))
 | 
| +        .SetScopeURL(registration.pattern.spec())
 | 
| +        .SetIsDeleted(registration.delete_flag ==
 | 
| +                      ServiceWorkerRegistrationInfo::IS_DELETED)
 | 
| +        .Build());
 | 
|    }
 | 
| -  client_->WorkerRegistrationUpdated(
 | 
| -      WorkerRegistrationUpdatedParams::Create()->set_registrations(
 | 
| -          registration_values));
 | 
| +  frontend_->WorkerRegistrationUpdated(std::move(result));
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::OnWorkerVersionUpdated(
 | 
|      const std::vector<ServiceWorkerVersionInfo>& versions) {
 | 
| -  std::vector<scoped_refptr<ServiceWorkerVersion>> version_values;
 | 
| +  using Version = ServiceWorker::ServiceWorkerVersion;
 | 
| +  std::unique_ptr<protocol::Array<Version>> result =
 | 
| +      protocol::Array<Version>::create();
 | 
|    for (const auto& version : versions) {
 | 
| -    version_values.push_back(CreateVersionDictionaryValue(version));
 | 
| +    std::unique_ptr<protocol::Array<std::string>> clients =
 | 
| +        protocol::Array<std::string>::create();
 | 
| +    for (const auto& client : version.clients) {
 | 
| +      if (client.second.type == SERVICE_WORKER_PROVIDER_FOR_WINDOW) {
 | 
| +        RenderFrameHostImpl* render_frame_host = RenderFrameHostImpl::FromID(
 | 
| +            client.second.process_id, client.second.route_id);
 | 
| +        WebContents* web_contents =
 | 
| +            WebContents::FromRenderFrameHost(render_frame_host);
 | 
| +        // There is a possibility that the frame is already deleted
 | 
| +        // because of the thread hopping.
 | 
| +        if (!web_contents)
 | 
| +          continue;
 | 
| +        clients->addItem(
 | 
| +            DevToolsAgentHost::GetOrCreateFor(web_contents)->GetId());
 | 
| +      } else if (client.second.type ==
 | 
| +                 SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER) {
 | 
| +        scoped_refptr<DevToolsAgentHost> agent_host(
 | 
| +            DevToolsAgentHost::GetForWorker(client.second.process_id,
 | 
| +                                            client.second.route_id));
 | 
| +        if (agent_host)
 | 
| +          clients->addItem(agent_host->GetId());
 | 
| +      }
 | 
| +    }
 | 
| +    std::unique_ptr<Version> version_value = Version::Create()
 | 
| +        .SetVersionId(base::Int64ToString(version.version_id))
 | 
| +        .SetRegistrationId(
 | 
| +            base::Int64ToString(version.registration_id))
 | 
| +        .SetScriptURL(version.script_url.spec())
 | 
| +        .SetRunningStatus(
 | 
| +            GetVersionRunningStatusString(version.running_status))
 | 
| +        .SetStatus(GetVersionStatusString(version.status))
 | 
| +        .SetScriptLastModified(
 | 
| +            version.script_last_modified.ToDoubleT())
 | 
| +        .SetScriptResponseTime(
 | 
| +            version.script_response_time.ToDoubleT())
 | 
| +        .SetControlledClients(std::move(clients))
 | 
| +        .Build();
 | 
| +    scoped_refptr<DevToolsAgentHostImpl> host(
 | 
| +        ServiceWorkerDevToolsManager::GetInstance()
 | 
| +            ->GetDevToolsAgentHostForWorker(
 | 
| +                version.process_id,
 | 
| +                version.devtools_agent_route_id));
 | 
| +    if (host)
 | 
| +      version_value->SetTargetId(host->GetId());
 | 
| +    result->addItem(std::move(version_value));
 | 
|    }
 | 
| -  client_->WorkerVersionUpdated(
 | 
| -      WorkerVersionUpdatedParams::Create()->set_versions(version_values));
 | 
| +  frontend_->WorkerVersionUpdated(std::move(result));
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::OnErrorReported(
 | 
|      int64_t registration_id,
 | 
|      int64_t version_id,
 | 
|      const ServiceWorkerContextObserver::ErrorInfo& info) {
 | 
| -  client_->WorkerErrorReported(
 | 
| -      WorkerErrorReportedParams::Create()->set_error_message(
 | 
| -          ServiceWorkerErrorMessage::Create()
 | 
| -              ->set_error_message(base::UTF16ToUTF8(info.error_message))
 | 
| -              ->set_registration_id(base::Int64ToString(registration_id))
 | 
| -              ->set_version_id(base::Int64ToString(version_id))
 | 
| -              ->set_source_url(info.source_url.spec())
 | 
| -              ->set_line_number(info.line_number)
 | 
| -              ->set_column_number(info.column_number)));
 | 
| +  frontend_->WorkerErrorReported(
 | 
| +      ServiceWorker::ServiceWorkerErrorMessage::Create()
 | 
| +          .SetErrorMessage(base::UTF16ToUTF8(info.error_message))
 | 
| +          .SetRegistrationId(base::Int64ToString(registration_id))
 | 
| +          .SetVersionId(base::Int64ToString(version_id))
 | 
| +          .SetSourceURL(info.source_url.spec())
 | 
| +          .SetLineNumber(info.line_number)
 | 
| +          .SetColumnNumber(info.column_number)
 | 
| +          .Build());
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::ClearForceUpdate() {
 | 
| @@ -449,6 +434,5 @@ void ServiceWorkerHandler::ClearForceUpdate() {
 | 
|      context_->SetForceUpdateOnPageLoad(false);
 | 
|  }
 | 
|  
 | 
| -}  // namespace service_worker
 | 
| -}  // namespace devtools
 | 
| +}  // namespace protocol
 | 
|  }  // namespace content
 | 
| 
 |