| Index: content/browser/service_worker/service_worker_version.cc
|
| diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
|
| index 2635365b2c8421f4c3eef89a9941d8c0fbb062a5..113318bcc76f07d5f14402e646f9babe5efba0d8 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -159,13 +159,6 @@ void RunErrorMessageCallback(
|
| callback.Run(status);
|
| }
|
|
|
| -void RunErrorServicePortConnectCallback(
|
| - const ServiceWorkerVersion::ServicePortConnectCallback& callback,
|
| - ServiceWorkerStatusCode status) {
|
| - callback.Run(status, false /* accept_connection */, base::string16(),
|
| - base::string16());
|
| -}
|
| -
|
| void KillEmbeddedWorkerProcess(int process_id, ResultCode code) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| RenderProcessHost* render_process_host =
|
| @@ -549,6 +542,28 @@ void ServiceWorkerVersion::DeferScheduledUpdate() {
|
| update_timer_.Reset();
|
| }
|
|
|
| +int ServiceWorkerVersion::StartRequest(const StatusCallback& error_callback) {
|
| + OnBeginEvent();
|
| + DCHECK_EQ(RUNNING, running_status())
|
| + << "Can only start a request with a running worker.";
|
| + return AddRequest(error_callback, &custom_requests_, REQUEST_CUSTOM);
|
| +}
|
| +
|
| +bool ServiceWorkerVersion::FinishRequest(int request_id) {
|
| + PendingRequest<StatusCallback>* request = custom_requests_.Lookup(request_id);
|
| + if (!request)
|
| + return false;
|
| + RemoveCallbackAndStopIfRedundant(&custom_requests_, request_id);
|
| + return true;
|
| +}
|
| +
|
| +void ServiceWorkerVersion::RunAfterStartWorker(
|
| + const StatusCallback& error_callback,
|
| + const base::Closure& task) {
|
| + StartWorker(base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(),
|
| + error_callback, task));
|
| +}
|
| +
|
| void ServiceWorkerVersion::DispatchMessageEvent(
|
| const base::string16& message,
|
| const std::vector<TransferredMessagePort>& sent_message_ports,
|
| @@ -786,47 +801,6 @@ void ServiceWorkerVersion::DispatchGeofencingEvent(
|
| }
|
| }
|
|
|
| -void ServiceWorkerVersion::DispatchServicePortConnectEvent(
|
| - const ServicePortConnectCallback& callback,
|
| - const GURL& target_url,
|
| - const GURL& origin,
|
| - int port_id) {
|
| - OnBeginEvent();
|
| - DCHECK_EQ(ACTIVATED, status()) << status();
|
| -
|
| - if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kEnableExperimentalWebPlatformFeatures)) {
|
| - callback.Run(SERVICE_WORKER_ERROR_ABORT, false, base::string16(),
|
| - base::string16());
|
| - return;
|
| - }
|
| -
|
| - if (running_status() != RUNNING) {
|
| - // Schedule calling this method after starting the worker.
|
| - StartWorker(
|
| - base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(),
|
| - base::Bind(&RunErrorServicePortConnectCallback, callback),
|
| - base::Bind(&self::DispatchServicePortConnectEvent,
|
| - weak_factory_.GetWeakPtr(), callback, target_url,
|
| - origin, port_id)));
|
| - return;
|
| - }
|
| -
|
| - int request_id = AddRequest(callback, &service_port_connect_requests_,
|
| - REQUEST_SERVICE_PORT_CONNECT);
|
| - if (!service_port_dispatcher_) {
|
| - embedded_worker_->GetServiceRegistry()->ConnectToRemoteService(
|
| - mojo::GetProxy(&service_port_dispatcher_));
|
| - service_port_dispatcher_.set_connection_error_handler(base::Bind(
|
| - &ServiceWorkerVersion::OnServicePortDispatcherConnectionError,
|
| - weak_factory_.GetWeakPtr()));
|
| - }
|
| - service_port_dispatcher_->Connect(
|
| - mojo::String::From(target_url), mojo::String::From(origin), port_id,
|
| - base::Bind(&ServiceWorkerVersion::OnServicePortConnectEventFinished,
|
| - weak_factory_.GetWeakPtr(), request_id));
|
| -}
|
| -
|
| void ServiceWorkerVersion::DispatchCrossOriginMessageEvent(
|
| const NavigatorConnectClient& client,
|
| const base::string16& message,
|
| @@ -1001,6 +975,24 @@ template <typename CallbackType>
|
| ServiceWorkerVersion::PendingRequest<CallbackType>::~PendingRequest() {
|
| }
|
|
|
| +ServiceWorkerVersion::BaseMojoService::BaseMojoService(
|
| + ServiceWorkerVersion* worker,
|
| + const char* service_name)
|
| + : worker_(worker), service_name_(service_name) {}
|
| +
|
| +ServiceWorkerVersion::BaseMojoService::~BaseMojoService() {
|
| + IDMap<PendingRequest<StatusCallback>, IDMapOwnPointer>::iterator iter(
|
| + &worker_->custom_requests_);
|
| + while (!iter.IsAtEnd()) {
|
| + PendingRequest<StatusCallback>* request = iter.GetCurrentValue();
|
| + if (request->mojo_service == service_name_) {
|
| + request->callback.Run(SERVICE_WORKER_ERROR_FAILED);
|
| + worker_->custom_requests_.Remove(iter.GetCurrentKey());
|
| + }
|
| + iter.Advance();
|
| + }
|
| +}
|
| +
|
| void ServiceWorkerVersion::OnThreadStarted() {
|
| if (running_status() == STOPPING)
|
| return;
|
| @@ -1376,28 +1368,6 @@ void ServiceWorkerVersion::OnGeofencingEventFinished(int request_id) {
|
| RemoveCallbackAndStopIfRedundant(&geofencing_requests_, request_id);
|
| }
|
|
|
| -void ServiceWorkerVersion::OnServicePortConnectEventFinished(
|
| - int request_id,
|
| - ServicePortConnectResult result,
|
| - const mojo::String& name,
|
| - const mojo::String& data) {
|
| - TRACE_EVENT1("ServiceWorker",
|
| - "ServiceWorkerVersion::OnServicePortConnectEventFinished",
|
| - "Request id", request_id);
|
| - PendingRequest<ServicePortConnectCallback>* request =
|
| - service_port_connect_requests_.Lookup(request_id);
|
| - if (!request) {
|
| - NOTREACHED() << "Got unexpected message: " << request_id;
|
| - return;
|
| - }
|
| -
|
| - scoped_refptr<ServiceWorkerVersion> protect(this);
|
| - request->callback.Run(SERVICE_WORKER_OK,
|
| - result == SERVICE_PORT_CONNECT_RESULT_ACCEPT,
|
| - name.To<base::string16>(), data.To<base::string16>());
|
| - RemoveCallbackAndStopIfRedundant(&service_port_connect_requests_, request_id);
|
| -}
|
| -
|
| void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) {
|
| // Just abort if we are shutting down.
|
| if (!context_)
|
| @@ -1519,7 +1489,7 @@ void ServiceWorkerVersion::OnPostMessageToClient(
|
| // possibly due to timing issue or bad message.
|
| return;
|
| }
|
| - provider_host->PostMessage(this, message, sent_message_ports);
|
| + provider_host->PostMessageToClient(this, message, sent_message_ports);
|
| }
|
|
|
| void ServiceWorkerVersion::OnFocusClient(int request_id,
|
| @@ -1992,8 +1962,7 @@ bool ServiceWorkerVersion::HasInflightRequests() const {
|
| return !activate_requests_.IsEmpty() || !install_requests_.IsEmpty() ||
|
| !fetch_requests_.IsEmpty() || !sync_requests_.IsEmpty() ||
|
| !notification_click_requests_.IsEmpty() || !push_requests_.IsEmpty() ||
|
| - !geofencing_requests_.IsEmpty() ||
|
| - !service_port_connect_requests_.IsEmpty() ||
|
| + !geofencing_requests_.IsEmpty() || !custom_requests_.IsEmpty() ||
|
| !streaming_url_request_jobs_.empty();
|
| }
|
|
|
| @@ -2096,11 +2065,9 @@ bool ServiceWorkerVersion::MaybeTimeOutRequest(const RequestInfo& info) {
|
| case REQUEST_GEOFENCING:
|
| return RunIDMapCallback(&geofencing_requests_, info.id,
|
| SERVICE_WORKER_ERROR_TIMEOUT);
|
| - case REQUEST_SERVICE_PORT_CONNECT:
|
| - return RunIDMapCallback(&service_port_connect_requests_, info.id,
|
| - SERVICE_WORKER_ERROR_TIMEOUT,
|
| - false /* accept_connection */, base::string16(),
|
| - base::string16());
|
| + case REQUEST_CUSTOM:
|
| + return RunIDMapCallback(&custom_requests_, info.id,
|
| + SERVICE_WORKER_ERROR_TIMEOUT);
|
| case NUM_REQUEST_TYPES:
|
| break;
|
| }
|
| @@ -2122,7 +2089,10 @@ bool ServiceWorkerVersion::ShouldStopIfRequestTimesOut(
|
| case REQUEST_NOTIFICATION_CLICK:
|
| case REQUEST_PUSH:
|
| case REQUEST_GEOFENCING:
|
| - case REQUEST_SERVICE_PORT_CONNECT:
|
| + return true;
|
| + case REQUEST_CUSTOM:
|
| + // TODO(mek): Custom requests need some way to specify their timeout
|
| + // behavior.
|
| return true;
|
| case NUM_REQUEST_TYPES:
|
| NOTREACHED() << "Got unexpected request type: " << info.type;
|
| @@ -2243,11 +2213,11 @@ void ServiceWorkerVersion::OnStoppedInternal(
|
| RunIDMapCallbacks(¬ification_click_requests_, SERVICE_WORKER_ERROR_FAILED);
|
| RunIDMapCallbacks(&push_requests_, SERVICE_WORKER_ERROR_FAILED);
|
| RunIDMapCallbacks(&geofencing_requests_, SERVICE_WORKER_ERROR_FAILED);
|
| + RunIDMapCallbacks(&custom_requests_, SERVICE_WORKER_ERROR_FAILED);
|
|
|
| // Close all mojo services. This will also fire and clear all callbacks
|
| // for messages that are still outstanding for those services.
|
| - OnServicePortDispatcherConnectionError();
|
| -
|
| + mojo_services_.clear();
|
| OnBackgroundSyncDispatcherConnectionError();
|
|
|
| // TODO(falken): Call SWURLRequestJob::ClearStream here?
|
| @@ -2259,18 +2229,17 @@ void ServiceWorkerVersion::OnStoppedInternal(
|
| StartWorkerInternal();
|
| }
|
|
|
| -void ServiceWorkerVersion::OnServicePortDispatcherConnectionError() {
|
| - RunIDMapCallbacks(&service_port_connect_requests_,
|
| - SERVICE_WORKER_ERROR_FAILED, false, base::string16(),
|
| - base::string16());
|
| - service_port_dispatcher_.reset();
|
| -}
|
| -
|
| void ServiceWorkerVersion::OnBackgroundSyncDispatcherConnectionError() {
|
| RunIDMapCallbacks(&sync_requests_, SERVICE_WORKER_ERROR_FAILED);
|
| background_sync_dispatcher_.reset();
|
| }
|
|
|
| +void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) {
|
| + // Simply deleting the service will cause error callbacks to be called from
|
| + // the destructor of the MojoService instance.
|
| + mojo_services_.erase(service_name);
|
| +}
|
| +
|
| void ServiceWorkerVersion::OnBeginEvent() {
|
| if (should_exclude_from_uma_ || running_status() != RUNNING ||
|
| idle_time_.is_null()) {
|
|
|