| OLD | NEW | 
|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" | 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h" | 
| 6 | 6 | 
| 7 #include <utility> | 7 #include <utility> | 
| 8 | 8 | 
| 9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" | 
| 10 #include "base/logging.h" | 10 #include "base/logging.h" | 
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 112       resource_context_(resource_context), | 112       resource_context_(resource_context), | 
| 113       channel_ready_(false), | 113       channel_ready_(false), | 
| 114       weak_factory_(this) { | 114       weak_factory_(this) { | 
| 115   AddAssociatedInterface( | 115   AddAssociatedInterface( | 
| 116       mojom::ServiceWorkerDispatcherHost::Name_, | 116       mojom::ServiceWorkerDispatcherHost::Name_, | 
| 117       base::Bind(&ServiceWorkerDispatcherHost::AddMojoBinding, | 117       base::Bind(&ServiceWorkerDispatcherHost::AddMojoBinding, | 
| 118                  base::Unretained(this))); | 118                  base::Unretained(this))); | 
| 119 } | 119 } | 
| 120 | 120 | 
| 121 ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() { | 121 ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() { | 
| 122   if (GetContext()) { | 122   if (GetContext()) | 
| 123     GetContext()->RemoveAllProviderHostsForProcess(render_process_id_); | 123     GetContext()->RemoveDispatcherHost(render_process_id_); | 
| 124     GetContext()->embedded_worker_registry()->RemoveChildProcessSender( |  | 
| 125         render_process_id_); |  | 
| 126   } |  | 
| 127 } | 124 } | 
| 128 | 125 | 
| 129 void ServiceWorkerDispatcherHost::Init( | 126 void ServiceWorkerDispatcherHost::Init( | 
| 130     ServiceWorkerContextWrapper* context_wrapper) { | 127     ServiceWorkerContextWrapper* context_wrapper) { | 
| 131   if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 128   if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { | 
| 132     BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 129     BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, | 
| 133                             base::Bind(&ServiceWorkerDispatcherHost::Init, this, | 130                             base::Bind(&ServiceWorkerDispatcherHost::Init, this, | 
| 134                                        base::RetainedRef(context_wrapper))); | 131                                        base::RetainedRef(context_wrapper))); | 
| 135     return; | 132     return; | 
| 136   } | 133   } | 
| 137 | 134 | 
| 138   context_wrapper_ = context_wrapper; | 135   context_wrapper_ = context_wrapper; | 
| 139   if (!GetContext()) | 136   if (!GetContext()) | 
| 140     return; | 137     return; | 
| 141   GetContext()->embedded_worker_registry()->AddChildProcessSender( | 138   GetContext()->AddDispatcherHost(render_process_id_, this); | 
| 142       render_process_id_, this); |  | 
| 143 } | 139 } | 
| 144 | 140 | 
| 145 void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) { | 141 void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) { | 
| 146   TRACE_EVENT0("ServiceWorker", | 142   TRACE_EVENT0("ServiceWorker", | 
| 147                "ServiceWorkerDispatcherHost::OnFilterAdded"); | 143                "ServiceWorkerDispatcherHost::OnFilterAdded"); | 
| 148   channel_ready_ = true; | 144   channel_ready_ = true; | 
| 149   std::vector<std::unique_ptr<IPC::Message>> messages; | 145   std::vector<std::unique_ptr<IPC::Message>> messages; | 
| 150   messages.swap(pending_messages_); | 146   messages.swap(pending_messages_); | 
| 151   for (auto& message : messages) { | 147   for (auto& message : messages) { | 
| 152     BrowserMessageFilter::Send(message.release()); | 148     BrowserMessageFilter::Send(message.release()); | 
| 153   } | 149   } | 
| 154 } | 150 } | 
| 155 | 151 | 
| 156 void ServiceWorkerDispatcherHost::OnFilterRemoved() { | 152 void ServiceWorkerDispatcherHost::OnFilterRemoved() { | 
| 157   // Don't wait until the destructor to teardown since a new dispatcher host | 153   // Don't wait until the destructor to teardown since a new dispatcher host | 
| 158   // for this process might be created before then. | 154   // for this process might be created before then. | 
| 159   if (GetContext()) { | 155   if (GetContext()) | 
| 160     GetContext()->RemoveAllProviderHostsForProcess(render_process_id_); | 156     GetContext()->RemoveDispatcherHost(render_process_id_); | 
| 161     GetContext()->embedded_worker_registry()->RemoveChildProcessSender( |  | 
| 162         render_process_id_); |  | 
| 163   } |  | 
| 164   context_wrapper_ = nullptr; | 157   context_wrapper_ = nullptr; | 
| 165   channel_ready_ = false; | 158   channel_ready_ = false; | 
| 166 } | 159 } | 
| 167 | 160 | 
| 168 void ServiceWorkerDispatcherHost::OnDestruct() const { | 161 void ServiceWorkerDispatcherHost::OnDestruct() const { | 
| 169   BrowserThread::DeleteOnIOThread::Destruct(this); | 162   BrowserThread::DeleteOnIOThread::Destruct(this); | 
| 170 } | 163 } | 
| 171 | 164 | 
| 172 bool ServiceWorkerDispatcherHost::OnMessageReceived( | 165 bool ServiceWorkerDispatcherHost::OnMessageReceived( | 
| 173     const IPC::Message& message) { | 166     const IPC::Message& message) { | 
| 174   bool handled = true; | 167   bool handled = true; | 
| 175   IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcherHost, message) | 168   IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcherHost, message) | 
| 176     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_RegisterServiceWorker, | 169     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_RegisterServiceWorker, | 
| 177                         OnRegisterServiceWorker) | 170                         OnRegisterServiceWorker) | 
| 178     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UpdateServiceWorker, | 171     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UpdateServiceWorker, | 
| 179                         OnUpdateServiceWorker) | 172                         OnUpdateServiceWorker) | 
| 180     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UnregisterServiceWorker, | 173     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UnregisterServiceWorker, | 
| 181                         OnUnregisterServiceWorker) | 174                         OnUnregisterServiceWorker) | 
| 182     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistration, | 175     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistration, | 
| 183                         OnGetRegistration) | 176                         OnGetRegistration) | 
| 184     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrations, | 177     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrations, | 
| 185                         OnGetRegistrations) | 178                         OnGetRegistrations) | 
| 186     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrationForReady, | 179     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrationForReady, | 
| 187                         OnGetRegistrationForReady) | 180                         OnGetRegistrationForReady) | 
| 188     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ProviderCreated, |  | 
| 189                         OnProviderCreated) |  | 
| 190     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ProviderDestroyed, |  | 
| 191                         OnProviderDestroyed) |  | 
| 192     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetVersionId, |  | 
| 193                         OnSetHostedVersionId) |  | 
| 194     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToWorker, | 181     IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToWorker, | 
| 195                         OnPostMessageToWorker) | 182                         OnPostMessageToWorker) | 
| 196     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerReadyForInspection, | 183     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerReadyForInspection, | 
| 197                         OnWorkerReadyForInspection) | 184                         OnWorkerReadyForInspection) | 
| 198     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoaded, | 185     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoaded, | 
| 199                         OnWorkerScriptLoaded) | 186                         OnWorkerScriptLoaded) | 
| 200     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerThreadStarted, | 187     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerThreadStarted, | 
| 201                         OnWorkerThreadStarted) | 188                         OnWorkerThreadStarted) | 
| 202     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoadFailed, | 189     IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoadFailed, | 
| 203                         OnWorkerScriptLoadFailed) | 190                         OnWorkerScriptLoadFailed) | 
| (...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 997       break; | 984       break; | 
| 998     } | 985     } | 
| 999     case SERVICE_WORKER_PROVIDER_UNKNOWN: | 986     case SERVICE_WORKER_PROVIDER_UNKNOWN: | 
| 1000     default: | 987     default: | 
| 1001       NOTREACHED() << sender_provider_host->provider_type(); | 988       NOTREACHED() << sender_provider_host->provider_type(); | 
| 1002       break; | 989       break; | 
| 1003   } | 990   } | 
| 1004 } | 991 } | 
| 1005 | 992 | 
| 1006 void ServiceWorkerDispatcherHost::OnProviderCreated( | 993 void ServiceWorkerDispatcherHost::OnProviderCreated( | 
| 1007     int provider_id, | 994     ServiceWorkerProviderHostInfo info) { | 
| 1008     int route_id, |  | 
| 1009     ServiceWorkerProviderType provider_type, |  | 
| 1010     bool is_parent_frame_secure) { |  | 
| 1011   // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. | 995   // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. | 
| 1012   tracked_objects::ScopedTracker tracking_profile( | 996   tracked_objects::ScopedTracker tracking_profile( | 
| 1013       FROM_HERE_WITH_EXPLICIT_FUNCTION( | 997       FROM_HERE_WITH_EXPLICIT_FUNCTION( | 
| 1014           "477117 ServiceWorkerDispatcherHost::OnProviderCreated")); | 998           "477117 ServiceWorkerDispatcherHost::OnProviderCreated")); | 
| 1015   TRACE_EVENT0("ServiceWorker", | 999   TRACE_EVENT0("ServiceWorker", | 
| 1016                "ServiceWorkerDispatcherHost::OnProviderCreated"); | 1000                "ServiceWorkerDispatcherHost::OnProviderCreated"); | 
| 1017   if (!GetContext()) | 1001   if (!GetContext()) | 
| 1018     return; | 1002     return; | 
| 1019   if (GetContext()->GetProviderHost(render_process_id_, provider_id)) { | 1003   if (GetContext()->GetProviderHost(render_process_id_, info.provider_id)) { | 
| 1020     bad_message::ReceivedBadMessage(this, | 1004     bad_message::ReceivedBadMessage(this, | 
| 1021                                     bad_message::SWDH_PROVIDER_CREATED_NO_HOST); | 1005                                     bad_message::SWDH_PROVIDER_CREATED_NO_HOST); | 
| 1022     return; | 1006     return; | 
| 1023   } | 1007   } | 
| 1024 | 1008 | 
| 1025   std::unique_ptr<ServiceWorkerProviderHost> provider_host; |  | 
| 1026   if (IsBrowserSideNavigationEnabled() && | 1009   if (IsBrowserSideNavigationEnabled() && | 
| 1027       ServiceWorkerUtils::IsBrowserAssignedProviderId(provider_id)) { | 1010       ServiceWorkerUtils::IsBrowserAssignedProviderId(info.provider_id)) { | 
|  | 1011     std::unique_ptr<ServiceWorkerProviderHost> provider_host; | 
| 1028     // PlzNavigate | 1012     // PlzNavigate | 
| 1029     // Retrieve the provider host previously created for navigation requests. | 1013     // Retrieve the provider host previously created for navigation requests. | 
| 1030     ServiceWorkerNavigationHandleCore* navigation_handle_core = | 1014     ServiceWorkerNavigationHandleCore* navigation_handle_core = | 
| 1031         GetContext()->GetNavigationHandleCore(provider_id); | 1015         GetContext()->GetNavigationHandleCore(info.provider_id); | 
| 1032     if (navigation_handle_core != nullptr) | 1016     if (navigation_handle_core != nullptr) | 
| 1033       provider_host = navigation_handle_core->RetrievePreCreatedHost(); | 1017       provider_host = navigation_handle_core->RetrievePreCreatedHost(); | 
| 1034 | 1018 | 
| 1035     // If no host is found, the navigation has been cancelled in the meantime. | 1019     // If no host is found, the navigation has been cancelled in the meantime. | 
| 1036     // Just return as the navigation will be stopped in the renderer as well. | 1020     // Just return as the navigation will be stopped in the renderer as well. | 
| 1037     if (provider_host == nullptr) | 1021     if (provider_host == nullptr) | 
| 1038       return; | 1022       return; | 
| 1039     DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, provider_type); | 1023     DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, info.type); | 
| 1040     provider_host->CompleteNavigationInitialized(render_process_id_, route_id, | 1024     provider_host->CompleteNavigationInitialized(render_process_id_, | 
| 1041                                                  this); | 1025                                                  info.route_id, this); | 
|  | 1026     GetContext()->AddProviderHost(std::move(provider_host)); | 
| 1042   } else { | 1027   } else { | 
| 1043     if (ServiceWorkerUtils::IsBrowserAssignedProviderId(provider_id)) { | 1028     if (ServiceWorkerUtils::IsBrowserAssignedProviderId(info.provider_id)) { | 
| 1044       bad_message::ReceivedBadMessage( | 1029       bad_message::ReceivedBadMessage( | 
| 1045           this, bad_message::SWDH_PROVIDER_CREATED_NO_HOST); | 1030           this, bad_message::SWDH_PROVIDER_CREATED_NO_HOST); | 
| 1046       return; | 1031       return; | 
| 1047     } | 1032     } | 
| 1048     ServiceWorkerProviderHost::FrameSecurityLevel parent_frame_security_level = | 1033     GetContext()->AddProviderHost(ServiceWorkerProviderHost::Create( | 
| 1049         is_parent_frame_secure | 1034         render_process_id_, std::move(info), GetContext()->AsWeakPtr(), this)); | 
| 1050             ? ServiceWorkerProviderHost::FrameSecurityLevel::SECURE |  | 
| 1051             : ServiceWorkerProviderHost::FrameSecurityLevel::INSECURE; |  | 
| 1052     provider_host = std::unique_ptr<ServiceWorkerProviderHost>( |  | 
| 1053         new ServiceWorkerProviderHost( |  | 
| 1054             render_process_id_, route_id, provider_id, provider_type, |  | 
| 1055             parent_frame_security_level, GetContext()->AsWeakPtr(), this)); |  | 
| 1056   } | 1035   } | 
| 1057   GetContext()->AddProviderHost(std::move(provider_host)); |  | 
| 1058 } | 1036 } | 
| 1059 | 1037 | 
| 1060 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) { | 1038 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) { | 
| 1061   TRACE_EVENT0("ServiceWorker", | 1039   TRACE_EVENT0("ServiceWorker", | 
| 1062                "ServiceWorkerDispatcherHost::OnProviderDestroyed"); | 1040                "ServiceWorkerDispatcherHost::OnProviderDestroyed"); | 
| 1063   if (!GetContext()) | 1041   if (!GetContext()) | 
| 1064     return; | 1042     return; | 
| 1065   if (!GetContext()->GetProviderHost(render_process_id_, provider_id)) { | 1043   if (!GetContext()->GetProviderHost(render_process_id_, provider_id)) { | 
| 1066     // PlzNavigate: in some cancellation of navigation cases, it is possible | 1044     // PlzNavigate: in some cancellation of navigation cases, it is possible | 
| 1067     // for the pre-created hoist to have been destroyed before being claimed by | 1045     // for the pre-created hoist to have been destroyed before being claimed by | 
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1797   if (!handle) { | 1775   if (!handle) { | 
| 1798     bad_message::ReceivedBadMessage(this, | 1776     bad_message::ReceivedBadMessage(this, | 
| 1799                                     bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1777                                     bad_message::SWDH_TERMINATE_BAD_HANDLE); | 
| 1800     return; | 1778     return; | 
| 1801   } | 1779   } | 
| 1802   handle->version()->StopWorker( | 1780   handle->version()->StopWorker( | 
| 1803       base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1781       base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 
| 1804 } | 1782 } | 
| 1805 | 1783 | 
| 1806 }  // namespace content | 1784 }  // namespace content | 
| OLD | NEW | 
|---|