| 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 62a962d38be234ea3176187fa139e5ec2f605553..c34d15a1ec1847012b17943d55162a3037f1d831 100644
 | 
| --- a/content/browser/devtools/protocol/service_worker_handler.cc
 | 
| +++ b/content/browser/devtools/protocol/service_worker_handler.cc
 | 
| @@ -33,7 +33,10 @@
 | 
|  #include "url/gurl.h"
 | 
|  
 | 
|  namespace content {
 | 
| -namespace protocol {
 | 
| +namespace devtools {
 | 
| +namespace service_worker {
 | 
| +
 | 
| +using Response = DevToolsProtocolClient::Response;
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| @@ -55,15 +58,13 @@
 | 
|      EmbeddedWorkerStatus running_status) {
 | 
|    switch (running_status) {
 | 
|      case EmbeddedWorkerStatus::STOPPED:
 | 
| -      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Stopped;
 | 
| +      return kServiceWorkerVersionRunningStatusStopped;
 | 
|      case EmbeddedWorkerStatus::STARTING:
 | 
| -      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Starting;
 | 
| +      return kServiceWorkerVersionRunningStatusStarting;
 | 
|      case EmbeddedWorkerStatus::RUNNING:
 | 
| -      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Running;
 | 
| +      return kServiceWorkerVersionRunningStatusRunning;
 | 
|      case EmbeddedWorkerStatus::STOPPING:
 | 
| -      return ServiceWorker::ServiceWorkerVersionRunningStatusEnum::Stopping;
 | 
| -    default:
 | 
| -      NOTREACHED();
 | 
| +      return kServiceWorkerVersionRunningStatusStopping;
 | 
|    }
 | 
|    return std::string();
 | 
|  }
 | 
| @@ -72,21 +73,81 @@
 | 
|      content::ServiceWorkerVersion::Status status) {
 | 
|    switch (status) {
 | 
|      case content::ServiceWorkerVersion::NEW:
 | 
| -      return ServiceWorker::ServiceWorkerVersionStatusEnum::New;
 | 
| +      return kServiceWorkerVersionStatusNew;
 | 
|      case content::ServiceWorkerVersion::INSTALLING:
 | 
| -      return ServiceWorker::ServiceWorkerVersionStatusEnum::Installing;
 | 
| +      return kServiceWorkerVersionStatusInstalling;
 | 
|      case content::ServiceWorkerVersion::INSTALLED:
 | 
| -      return ServiceWorker::ServiceWorkerVersionStatusEnum::Installed;
 | 
| +      return kServiceWorkerVersionStatusInstalled;
 | 
|      case content::ServiceWorkerVersion::ACTIVATING:
 | 
| -      return ServiceWorker::ServiceWorkerVersionStatusEnum::Activating;
 | 
| +      return kServiceWorkerVersionStatusActivating;
 | 
|      case content::ServiceWorkerVersion::ACTIVATED:
 | 
| -      return ServiceWorker::ServiceWorkerVersionStatusEnum::Activated;
 | 
| +      return kServiceWorkerVersionStatusActivated;
 | 
|      case content::ServiceWorkerVersion::REDUNDANT:
 | 
| -      return ServiceWorker::ServiceWorkerVersionStatusEnum::Redundant;
 | 
| -    default:
 | 
| -      NOTREACHED();
 | 
| +      return kServiceWorkerVersionStatusRedundant;
 | 
|    }
 | 
|    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,
 | 
| @@ -112,11 +173,11 @@
 | 
|  }
 | 
|  
 | 
|  Response CreateContextErrorResponse() {
 | 
| -  return Response::Error("Could not connect to the context");
 | 
| +  return Response::InternalError("Could not connect to the context");
 | 
|  }
 | 
|  
 | 
|  Response CreateInvalidVersionIdErrorResponse() {
 | 
| -  return Response::InvalidParams("Invalid version ID");
 | 
| +  return Response::InternalError("Invalid version ID");
 | 
|  }
 | 
|  
 | 
|  void DidFindRegistrationForDispatchSyncEventOnIO(
 | 
| @@ -156,11 +217,7 @@
 | 
|  }
 | 
|  
 | 
|  ServiceWorkerHandler::~ServiceWorkerHandler() {
 | 
| -}
 | 
| -
 | 
| -void ServiceWorkerHandler::Wire(UberDispatcher* dispatcher) {
 | 
| -  frontend_.reset(new ServiceWorker::Frontend(dispatcher->channel()));
 | 
| -  ServiceWorker::Dispatcher::wire(dispatcher, this);
 | 
| +  Disable();
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::SetRenderFrameHost(
 | 
| @@ -180,11 +237,19 @@
 | 
|        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 CreateContextErrorResponse();
 | 
| +    return Response::InternalError("Could not connect to the context");
 | 
|    enabled_ = true;
 | 
|  
 | 
|    context_watcher_ = new ServiceWorkerContextWatcher(
 | 
| @@ -344,89 +409,39 @@
 | 
|  
 | 
|  void ServiceWorkerHandler::OnWorkerRegistrationUpdated(
 | 
|      const std::vector<ServiceWorkerRegistrationInfo>& registrations) {
 | 
| -  using Registration = ServiceWorker::ServiceWorkerRegistration;
 | 
| -  std::unique_ptr<protocol::Array<Registration>> result =
 | 
| -      protocol::Array<Registration>::create();
 | 
| +  std::vector<scoped_refptr<ServiceWorkerRegistration>> registration_values;
 | 
|    for (const auto& registration : registrations) {
 | 
| -    result->addItem(Registration::Create()
 | 
| -        .SetRegistrationId(
 | 
| -            base::Int64ToString(registration.registration_id))
 | 
| -        .SetScopeURL(registration.pattern.spec())
 | 
| -        .SetIsDeleted(registration.delete_flag ==
 | 
| -                      ServiceWorkerRegistrationInfo::IS_DELETED)
 | 
| -        .Build());
 | 
| -  }
 | 
| -  frontend_->WorkerRegistrationUpdated(std::move(result));
 | 
| +    registration_values.push_back(
 | 
| +        CreateRegistrationDictionaryValue(registration));
 | 
| +  }
 | 
| +  client_->WorkerRegistrationUpdated(
 | 
| +      WorkerRegistrationUpdatedParams::Create()->set_registrations(
 | 
| +          registration_values));
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::OnWorkerVersionUpdated(
 | 
|      const std::vector<ServiceWorkerVersionInfo>& versions) {
 | 
| -  using Version = ServiceWorker::ServiceWorkerVersion;
 | 
| -  std::unique_ptr<protocol::Array<Version>> result =
 | 
| -      protocol::Array<Version>::create();
 | 
| +  std::vector<scoped_refptr<ServiceWorkerVersion>> version_values;
 | 
|    for (const auto& version : versions) {
 | 
| -    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));
 | 
| -  }
 | 
| -  frontend_->WorkerVersionUpdated(std::move(result));
 | 
| +    version_values.push_back(CreateVersionDictionaryValue(version));
 | 
| +  }
 | 
| +  client_->WorkerVersionUpdated(
 | 
| +      WorkerVersionUpdatedParams::Create()->set_versions(version_values));
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::OnErrorReported(
 | 
|      int64_t registration_id,
 | 
|      int64_t version_id,
 | 
|      const ServiceWorkerContextObserver::ErrorInfo& info) {
 | 
| -  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());
 | 
| +  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)));
 | 
|  }
 | 
|  
 | 
|  void ServiceWorkerHandler::ClearForceUpdate() {
 | 
| @@ -434,5 +449,6 @@
 | 
|      context_->SetForceUpdateOnPageLoad(false);
 | 
|  }
 | 
|  
 | 
| -}  // namespace protocol
 | 
| +}  // namespace service_worker
 | 
| +}  // namespace devtools
 | 
|  }  // namespace content
 | 
| 
 |