| 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_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 #include "content/common/service_worker/service_worker_utils.h" | 40 #include "content/common/service_worker/service_worker_utils.h" |
| 41 #include "content/public/browser/browser_thread.h" | 41 #include "content/public/browser/browser_thread.h" |
| 42 #include "content/public/browser/content_browser_client.h" | 42 #include "content/public/browser/content_browser_client.h" |
| 43 #include "content/public/browser/render_process_host.h" | 43 #include "content/public/browser/render_process_host.h" |
| 44 #include "content/public/common/content_client.h" | 44 #include "content/public/common/content_client.h" |
| 45 #include "content/public/common/content_switches.h" | 45 #include "content/public/common/content_switches.h" |
| 46 #include "content/public/common/result_codes.h" | 46 #include "content/public/common/result_codes.h" |
| 47 #include "mojo/common/common_type_converters.h" | 47 #include "mojo/common/common_type_converters.h" |
| 48 #include "net/http/http_response_headers.h" | 48 #include "net/http/http_response_headers.h" |
| 49 #include "net/http/http_response_info.h" | 49 #include "net/http/http_response_info.h" |
| 50 #include "third_party/WebKit/public/platform/modules/serviceworker/service_worke
r.mojom.h" |
| 51 #include "mojo/public/cpp/bindings/strong_binding.h" |
| 52 #include "content/browser/renderer_host/render_process_host_impl.h" |
| 53 #include "services/shell/public/cpp/interface_provider.h" |
| 54 #include "services/shell/public/cpp/interface_registry.h" |
| 55 #include "base/bind_helpers.h" |
| 56 #include "content/common/service_worker/embedded_worker_setup.mojom.h" |
| 57 #include "content/browser/appcache/appcache_response.h" |
| 58 #include "content/browser/service_worker/service_worker_storage.h" |
| 59 #include "content/browser/service_worker/service_worker_disk_cache.h" |
| 60 #include "mojo/public/cpp/system/watcher.h" |
| 61 |
| 62 #include "net/base/io_buffer.h" |
| 50 | 63 |
| 51 namespace content { | 64 namespace content { |
| 52 | 65 |
| 53 using StatusCallback = ServiceWorkerVersion::StatusCallback; | 66 using StatusCallback = ServiceWorkerVersion::StatusCallback; |
| 54 | 67 |
| 55 namespace { | 68 namespace { |
| 56 | 69 |
| 57 // Time to wait until stopping an idle worker. | 70 // Time to wait until stopping an idle worker. |
| 58 const int kIdleWorkerTimeoutSeconds = 30; | 71 const int kIdleWorkerTimeoutSeconds = 30; |
| 59 | 72 |
| (...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 return; | 610 return; |
| 598 } | 611 } |
| 599 StartWorker(purpose, | 612 StartWorker(purpose, |
| 600 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 613 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 601 error_callback, task)); | 614 error_callback, task)); |
| 602 } | 615 } |
| 603 | 616 |
| 604 void ServiceWorkerVersion::DispatchEvent(const std::vector<int>& request_ids, | 617 void ServiceWorkerVersion::DispatchEvent(const std::vector<int>& request_ids, |
| 605 const IPC::Message& message) { | 618 const IPC::Message& message) { |
| 606 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status()); | 619 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status()); |
| 620 if (IsIsolatedWorker()) { |
| 621 LOG(FATAL) << "ServiceWorkerVersion::DispatchEvent is not supported in " |
| 622 "IsolatedWorker"; |
| 623 } |
| 607 | 624 |
| 608 const ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); | 625 const ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); |
| 609 | 626 |
| 610 for (int request_id : request_ids) { | 627 for (int request_id : request_ids) { |
| 611 PendingRequest* request = pending_requests_.Lookup(request_id); | 628 PendingRequest* request = pending_requests_.Lookup(request_id); |
| 612 DCHECK(request) << "Invalid request id"; | 629 DCHECK(request) << "Invalid request id"; |
| 613 DCHECK(!request->is_dispatched) | 630 DCHECK(!request->is_dispatched) |
| 614 << "Request already dispatched an IPC event"; | 631 << "Request already dispatched an IPC event"; |
| 615 if (status != SERVICE_WORKER_OK) { | 632 if (status != SERVICE_WORKER_OK) { |
| 616 RunSoon(base::Bind(request->error_callback, status)); | 633 RunSoon(base::Bind(request->error_callback, status)); |
| (...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1381 | 1398 |
| 1382 // Keep the live registration while starting the worker. | 1399 // Keep the live registration while starting the worker. |
| 1383 start_callbacks_.push_back( | 1400 start_callbacks_.push_back( |
| 1384 base::Bind(&RunStartWorkerCallback, callback, protect)); | 1401 base::Bind(&RunStartWorkerCallback, callback, protect)); |
| 1385 | 1402 |
| 1386 if (running_status() == EmbeddedWorkerStatus::STOPPED) | 1403 if (running_status() == EmbeddedWorkerStatus::STOPPED) |
| 1387 StartWorkerInternal(); | 1404 StartWorkerInternal(); |
| 1388 DCHECK(timeout_timer_.IsRunning()); | 1405 DCHECK(timeout_timer_.IsRunning()); |
| 1389 } | 1406 } |
| 1390 | 1407 |
| 1408 namespace { |
| 1409 |
| 1410 void OnIsolatedWorkerDispatcher( |
| 1411 int isolated_worker_id, |
| 1412 const GURL scope, |
| 1413 const GURL script_url, |
| 1414 shell::mojom::InterfaceProviderRequest remote_interfaces, |
| 1415 shell::mojom::InterfaceProviderPtrInfo exposed_interfaces, |
| 1416 mojom::WorkerScriptListPtr script_list, |
| 1417 mojo::InterfacePtr<mojom::IsolatedWorkerDispatcher>* dispatcher) { |
| 1418 TRACE_EVENT0("ServiceWorker", "OnIsolatedWorkerDispatcher"); |
| 1419 |
| 1420 (*dispatcher) |
| 1421 ->StartServiceWorker(isolated_worker_id, scope.spec(), script_url.spec(), |
| 1422 std::move(remote_interfaces), |
| 1423 mojo::MakeProxy(std::move(exposed_interfaces)), |
| 1424 std::move(script_list)); |
| 1425 } |
| 1426 |
| 1427 void OnFindAvailableProcess( |
| 1428 int isolated_worker_id, |
| 1429 const GURL scope, |
| 1430 const GURL script_url, |
| 1431 shell::mojom::InterfaceProviderRequest remote_interfaces, |
| 1432 shell::mojom::InterfaceProviderPtrInfo exposed_interfaces, |
| 1433 mojom::WorkerScriptListPtr script_list, |
| 1434 base::Closure failure_callback, |
| 1435 int process_id) { |
| 1436 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1437 LOG(ERROR) << "OnFindAvailableProcess " << process_id; |
| 1438 RenderProcessHost* rph = RenderProcessHost::FromID(process_id); |
| 1439 // |rph| may be NULL in unit tests. |
| 1440 // rph = nullptr; |
| 1441 if (!rph) { |
| 1442 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, failure_callback); |
| 1443 return; |
| 1444 } |
| 1445 (reinterpret_cast<RenderProcessHostImpl*>(rph)) |
| 1446 ->GetIsolatedWorkerDispatcher(base::Bind( |
| 1447 &OnIsolatedWorkerDispatcher, isolated_worker_id, scope, script_url, |
| 1448 base::Passed(&remote_interfaces), base::Passed(&exposed_interfaces), |
| 1449 base::Passed(std::move(script_list)))); |
| 1450 } |
| 1451 |
| 1452 } // namespace |
| 1453 |
| 1454 class IsolatedWorkerInstance { |
| 1455 public: |
| 1456 IsolatedWorkerInstance( |
| 1457 base::WeakPtr<ServiceWorkerContextCore> context, |
| 1458 base::WeakPtr<ServiceWorkerVersion> version, |
| 1459 const std::vector<ServiceWorkerDatabase::ResourceRecord>& resources, |
| 1460 base::Closure failure_callback) |
| 1461 : context_(context), version_(version), weak_factory_(this) { |
| 1462 mojom::WorkerScriptListPtr script_list = mojom::WorkerScriptList::New(); |
| 1463 |
| 1464 for (const auto& record : resources) { |
| 1465 if (version_->script_url() == record.url) |
| 1466 PushScriptPump(record.resource_id, record.url, &script_list->scripts); |
| 1467 } |
| 1468 for (const auto& record : resources) { |
| 1469 if (version_->script_url() != record.url) |
| 1470 PushScriptPump(record.resource_id, record.url, &script_list->scripts); |
| 1471 } |
| 1472 |
| 1473 isolated_worker_interface_registry_.reset(new shell::InterfaceRegistry()); |
| 1474 isolated_worker_remote_interfaces_.reset(new shell::InterfaceProvider); |
| 1475 isolated_worker_interface_registry_->AddInterface( |
| 1476 base::Bind(&IsolatedWorkerInstance::CreateHostService, |
| 1477 weak_factory_.GetWeakPtr())); |
| 1478 |
| 1479 // dmy code |
| 1480 shell::mojom::InterfaceProviderPtr exposed_interfaces; |
| 1481 isolated_worker_interface_registry_->Bind(GetProxy(&exposed_interfaces)); |
| 1482 shell::mojom::InterfaceProviderPtr remote_interfaces; |
| 1483 shell::mojom::InterfaceProviderRequest request = |
| 1484 GetProxy(&remote_interfaces); |
| 1485 isolated_worker_remote_interfaces_->Bind(std::move(remote_interfaces)); |
| 1486 |
| 1487 context->process_manager()->FindAvailableProcessAndCallbackOnUI( |
| 1488 version_->scope(), |
| 1489 base::Bind(&OnFindAvailableProcess, version_->version_id(), |
| 1490 version_->scope(), version_->script_url(), |
| 1491 base::Passed(&request), |
| 1492 base::Passed(exposed_interfaces.PassInterface()), |
| 1493 base::Passed(std::move(script_list)), failure_callback)); |
| 1494 } |
| 1495 ~IsolatedWorkerInstance() {} |
| 1496 |
| 1497 private: |
| 1498 class WriterIOBuffer final : public net::IOBufferWithSize { |
| 1499 public: |
| 1500 WriterIOBuffer(void* data, size_t size) |
| 1501 : net::IOBufferWithSize(static_cast<char*>(data), size) {} |
| 1502 |
| 1503 private: |
| 1504 ~WriterIOBuffer() override { data_ = nullptr; } |
| 1505 DISALLOW_COPY_AND_ASSIGN(WriterIOBuffer); |
| 1506 }; |
| 1507 class ScriptPump { |
| 1508 public: |
| 1509 ScriptPump(base::WeakPtr<IsolatedWorkerInstance> instance, |
| 1510 std::unique_ptr<ServiceWorkerResponseReader> reader, |
| 1511 const GURL& url, |
| 1512 mojo::ScopedDataPipeProducerHandle stream, |
| 1513 mojo::ScopedDataPipeProducerHandle metadata_stream) |
| 1514 : instance_(instance), |
| 1515 reader_(std::move(reader)), |
| 1516 url_(url), |
| 1517 stream_(std::move(stream)), |
| 1518 metadata_sender_(new MetadataSender(std::move(metadata_stream))), |
| 1519 weak_factory_(this) {} |
| 1520 void StartRead() { |
| 1521 http_info_io_buffer_ = new HttpResponseInfoIOBuffer; |
| 1522 reader_->ReadInfo(http_info_io_buffer_.get(), |
| 1523 base::Bind(&ScriptPump::OnReadInfoComplete, |
| 1524 weak_factory_.GetWeakPtr())); |
| 1525 } |
| 1526 ~ScriptPump() {} |
| 1527 |
| 1528 private: |
| 1529 class MetadataSender { |
| 1530 public: |
| 1531 MetadataSender(mojo::ScopedDataPipeProducerHandle metadata_stream) |
| 1532 : metadata_stream_(std::move(metadata_stream)), weak_factory_(this) {} |
| 1533 ~MetadataSender() {} |
| 1534 void StartSend(scoped_refptr<net::IOBufferWithSize> buf, |
| 1535 base::Closure callback) { |
| 1536 TRACE_EVENT0("ServiceWorker", "MetadataSender::StartSend"); |
| 1537 buffer_ = buf; |
| 1538 callback_ = callback; |
| 1539 remaining_ = buf->size(); |
| 1540 SendNext(); |
| 1541 } |
| 1542 void OnWritable(MojoResult unused) { SendNext(); } |
| 1543 void SendNext() { |
| 1544 TRACE_EVENT0("ServiceWorker", "MetadataSender::SendNext"); |
| 1545 uint32_t num_bytes = remaining_; |
| 1546 MojoResult mojo_result = |
| 1547 mojo::WriteDataRaw(metadata_stream_.get(), |
| 1548 buffer_->data() + (buffer_->size() - remaining_), |
| 1549 &num_bytes, // In/out. |
| 1550 MOJO_WRITE_DATA_FLAG_NONE); |
| 1551 if (mojo_result == MOJO_RESULT_SHOULD_WAIT) { |
| 1552 handle_watcher_.Start(metadata_stream_.get(), |
| 1553 MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1554 base::Bind(&MetadataSender::OnWritable, |
| 1555 weak_factory_.GetWeakPtr())); |
| 1556 return; |
| 1557 } |
| 1558 remaining_ -= num_bytes; |
| 1559 if (remaining_ == 0) { |
| 1560 callback_.Run(); |
| 1561 return; |
| 1562 } |
| 1563 SendNext(); |
| 1564 } |
| 1565 |
| 1566 private: |
| 1567 mojo::ScopedDataPipeProducerHandle metadata_stream_; |
| 1568 base::Closure callback_; |
| 1569 scoped_refptr<net::IOBufferWithSize> buffer_; |
| 1570 uint32_t remaining_; |
| 1571 mojo::Watcher handle_watcher_; |
| 1572 base::WeakPtrFactory<MetadataSender> weak_factory_; |
| 1573 }; |
| 1574 |
| 1575 void OnReadInfoComplete(int result) { |
| 1576 TRACE_EVENT0("ServiceWorker", "ScriptPump::OnReadInfoComplete"); |
| 1577 // TODO: send metadata |
| 1578 if (!http_info_io_buffer_->http_info->metadata) { |
| 1579 metadata_sender_ = nullptr; |
| 1580 } else { |
| 1581 metadata_sender_->StartSend(http_info_io_buffer_->http_info->metadata, |
| 1582 base::Bind(&ScriptPump::OnMetadataSent, |
| 1583 weak_factory_.GetWeakPtr())); |
| 1584 } |
| 1585 ReadNext(); |
| 1586 } |
| 1587 void OnMetadataSent() { |
| 1588 TRACE_EVENT0("ServiceWorker", "MetadataSender::OnMetadataSent"); |
| 1589 metadata_sender_ = nullptr; |
| 1590 if (sent_all_data_) { |
| 1591 instance_->PumpFinished(this); |
| 1592 return; |
| 1593 } |
| 1594 } |
| 1595 void OnWritable(MojoResult unused) { ReadNext(); } |
| 1596 void ReadNext() { |
| 1597 TRACE_EVENT0("ServiceWorker", "ScriptPump::ReadNext"); |
| 1598 LOG(ERROR) << "ScriptPump::ReadNext"; |
| 1599 void* buf = nullptr; |
| 1600 uint32_t available = 0; |
| 1601 MojoResult mojo_result = mojo::BeginWriteDataRaw( |
| 1602 stream_.get(), &buf, &available, MOJO_WRITE_DATA_FLAG_NONE); |
| 1603 // TODO: We need error handling code. |
| 1604 if (mojo_result == MOJO_RESULT_SHOULD_WAIT) { |
| 1605 handle_watcher_.Start( |
| 1606 stream_.get(), MOJO_HANDLE_SIGNAL_WRITABLE, |
| 1607 base::Bind(&ScriptPump::OnWritable, weak_factory_.GetWeakPtr())); |
| 1608 return; |
| 1609 } |
| 1610 buffer_ = new WriterIOBuffer(buf, available); |
| 1611 |
| 1612 reader_->ReadData( |
| 1613 buffer_.get(), available, |
| 1614 base::Bind(&ScriptPump::OnReadComplete, weak_factory_.GetWeakPtr())); |
| 1615 } |
| 1616 void OnReadComplete(int result) { |
| 1617 TRACE_EVENT0("ServiceWorker", "ScriptPump::OnReadComplete"); |
| 1618 LOG(ERROR) << "ScriptPump::OnReadComplete"; |
| 1619 if (result < 0) { |
| 1620 LOG(ERROR) << " read error !!!!"; |
| 1621 return; |
| 1622 } |
| 1623 MojoResult mojo_result = mojo::EndWriteDataRaw(stream_.get(), result); |
| 1624 if (mojo_result != MOJO_RESULT_OK) { |
| 1625 LOG(ERROR) << " EndWriteDataRaw error !!!!"; |
| 1626 return; |
| 1627 } |
| 1628 buffer_ = nullptr; |
| 1629 if (result == 0) { |
| 1630 sent_all_data_ = true; |
| 1631 if (!metadata_sender_) { |
| 1632 instance_->PumpFinished(this); |
| 1633 } |
| 1634 return; |
| 1635 } |
| 1636 ReadNext(); |
| 1637 } |
| 1638 |
| 1639 base::WeakPtr<IsolatedWorkerInstance> instance_; |
| 1640 std::unique_ptr<ServiceWorkerResponseReader> reader_; |
| 1641 const GURL url_; |
| 1642 scoped_refptr<HttpResponseInfoIOBuffer> http_info_io_buffer_; |
| 1643 mojo::ScopedDataPipeProducerHandle stream_; |
| 1644 std::unique_ptr<MetadataSender> metadata_sender_; |
| 1645 scoped_refptr<net::IOBufferWithSize> buffer_; |
| 1646 mojo::Watcher handle_watcher_; |
| 1647 bool sent_all_data_ = false; |
| 1648 base::WeakPtrFactory<ScriptPump> weak_factory_; |
| 1649 }; |
| 1650 class IsolatedWorkerHostServiceImpl |
| 1651 : public blink::mojom::IsolatedWorkerHostService { |
| 1652 public: |
| 1653 explicit IsolatedWorkerHostServiceImpl( |
| 1654 mojo::InterfaceRequest<blink::mojom::IsolatedWorkerHostService> request, |
| 1655 base::WeakPtr<ServiceWorkerVersion> version) |
| 1656 : binding_(this, std::move(request)), version_(version) { |
| 1657 LOG(ERROR) << "IsolatedWorkerHostServiceImpl" << this; |
| 1658 } |
| 1659 ~IsolatedWorkerHostServiceImpl() override { |
| 1660 LOG(ERROR) << "IsolatedWorkerHostServiceImpl" << this; |
| 1661 } |
| 1662 |
| 1663 void OnThreadStarted( |
| 1664 int64_t version_id, |
| 1665 blink::mojom::IsolatedWorkerClientPtr client) override { |
| 1666 TRACE_EVENT0("ServiceWorker", |
| 1667 "IsolatedWorkerHostServiceImpl::WorkerStarted"); |
| 1668 LOG(ERROR) |
| 1669 << "IsolatedWorkerHostServiceImpl::WorkerStarted <><><><><><>< " |
| 1670 << version_id; |
| 1671 version_->OnIsolatedWorkerThreadStarted(std::move(client)); |
| 1672 } |
| 1673 void OnScriptEvaluated() override { |
| 1674 TRACE_EVENT0("ServiceWorker", |
| 1675 "IsolatedWorkerHostServiceImpl::OnScriptEvaluated"); |
| 1676 LOG(ERROR) |
| 1677 << "IsolatedWorkerHostServiceImpl::OnScriptEvaluated() <><><><><><><"; |
| 1678 version_->OnIsolatedWorkerScriptEvaluated(); |
| 1679 } |
| 1680 void OnWorkerStarted() override { |
| 1681 TRACE_EVENT0("ServiceWorker", |
| 1682 "IsolatedWorkerHostServiceImpl::OnWorkerStarted"); |
| 1683 LOG(ERROR) |
| 1684 << "IsolatedWorkerHostServiceImpl::OnWorkerStarted() <><><><><><><"; |
| 1685 version_->OnIsolatedWorkerStarted(); |
| 1686 } |
| 1687 |
| 1688 private: |
| 1689 mojo::StrongBinding<blink::mojom::IsolatedWorkerHostService> binding_; |
| 1690 base::WeakPtr<ServiceWorkerVersion> version_; |
| 1691 }; |
| 1692 void PumpFinished(ScriptPump* pump) { |
| 1693 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerInstance::PumpFinished"); |
| 1694 LOG(ERROR) << "IsolatedWorkerInstance::PumpFinished"; |
| 1695 pump_map_.erase(pump); |
| 1696 } |
| 1697 void PushScriptPump(int64_t resource_id, |
| 1698 const GURL& url, |
| 1699 std::vector<mojom::WorkerScriptPtr>* scripts) { |
| 1700 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerInstance::PushScriptPump"); |
| 1701 MojoCreateDataPipeOptions options; |
| 1702 options.struct_size = sizeof(MojoCreateDataPipeOptions); |
| 1703 options.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; |
| 1704 options.element_num_bytes = 1; |
| 1705 options.capacity_num_bytes = 1024 * 1024; |
| 1706 mojo::DataPipe data_pipe(options); |
| 1707 CHECK(data_pipe.producer_handle.is_valid()); |
| 1708 |
| 1709 MojoCreateDataPipeOptions options_for_metadata; |
| 1710 options_for_metadata.struct_size = sizeof(MojoCreateDataPipeOptions); |
| 1711 options_for_metadata.flags = MOJO_CREATE_DATA_PIPE_OPTIONS_FLAG_NONE; |
| 1712 options_for_metadata.element_num_bytes = 1; |
| 1713 options_for_metadata.capacity_num_bytes = 1024 * 1024; |
| 1714 mojo::DataPipe data_pipe_for_metadata(options_for_metadata); |
| 1715 CHECK(data_pipe_for_metadata.producer_handle.is_valid()); |
| 1716 |
| 1717 std::unique_ptr<ScriptPump> pump( |
| 1718 new ScriptPump(weak_factory_.GetWeakPtr(), |
| 1719 context_->storage()->CreateResponseReader(resource_id), |
| 1720 url, std::move(data_pipe.producer_handle), |
| 1721 std::move(data_pipe_for_metadata.producer_handle))); |
| 1722 pump->StartRead(); |
| 1723 ScriptPump* ptr = pump.get(); |
| 1724 pump_map_[ptr] = std::move(pump); |
| 1725 |
| 1726 mojom::WorkerScriptPtr script = mojom::WorkerScript::New(); |
| 1727 script->url = url.spec(); |
| 1728 script->data_pipe = std::move(data_pipe.consumer_handle); |
| 1729 script->meta_data_pipe = std::move(data_pipe_for_metadata.consumer_handle); |
| 1730 |
| 1731 scripts->push_back(std::move(script)); |
| 1732 } |
| 1733 |
| 1734 void CreateHostService( |
| 1735 mojo::InterfaceRequest<blink::mojom::IsolatedWorkerHostService> request) { |
| 1736 TRACE_EVENT0("ServiceWorker", "IsolatedWorkerInstance::CreateHostService"); |
| 1737 new IsolatedWorkerHostServiceImpl(std::move(request), version_); |
| 1738 } |
| 1739 |
| 1740 base::WeakPtr<ServiceWorkerContextCore> context_; |
| 1741 base::WeakPtr<ServiceWorkerVersion> version_; |
| 1742 base::hash_map<ScriptPump*, std::unique_ptr<ScriptPump>> pump_map_; |
| 1743 // Isolated Worker test |
| 1744 std::unique_ptr<shell::InterfaceRegistry> isolated_worker_interface_registry_; |
| 1745 std::unique_ptr<shell::InterfaceProvider> isolated_worker_remote_interfaces_; |
| 1746 base::WeakPtrFactory<IsolatedWorkerInstance> weak_factory_; |
| 1747 DISALLOW_COPY_AND_ASSIGN(IsolatedWorkerInstance); |
| 1748 }; |
| 1749 |
| 1391 void ServiceWorkerVersion::StartWorkerInternal() { | 1750 void ServiceWorkerVersion::StartWorkerInternal() { |
| 1392 DCHECK_EQ(EmbeddedWorkerStatus::STOPPED, running_status()); | 1751 DCHECK_EQ(EmbeddedWorkerStatus::STOPPED, running_status()); |
| 1393 | 1752 |
| 1394 DCHECK(!metrics_); | 1753 DCHECK(!metrics_); |
| 1395 DCHECK(start_worker_first_purpose_); | 1754 DCHECK(start_worker_first_purpose_); |
| 1396 metrics_.reset(new Metrics(this, start_worker_first_purpose_.value())); | 1755 metrics_.reset(new Metrics(this, start_worker_first_purpose_.value())); |
| 1397 | 1756 |
| 1398 // We don't clear |start_worker_first_purpose_| here but clear in | 1757 // We don't clear |start_worker_first_purpose_| here but clear in |
| 1399 // FinishStartWorker. This is because StartWorkerInternal may be called | 1758 // FinishStartWorker. This is because StartWorkerInternal may be called |
| 1400 // again from OnStoppedInternal if StopWorker is called before OnStarted. | 1759 // again from OnStoppedInternal if StopWorker is called before OnStarted. |
| 1401 | 1760 |
| 1402 StartTimeoutTimer(); | 1761 StartTimeoutTimer(); |
| 1403 | 1762 |
| 1404 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( | 1763 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( |
| 1405 new EmbeddedWorkerMsg_StartWorker_Params()); | 1764 new EmbeddedWorkerMsg_StartWorker_Params()); |
| 1406 params->service_worker_version_id = version_id_; | 1765 params->service_worker_version_id = version_id_; |
| 1407 params->scope = scope_; | 1766 params->scope = scope_; |
| 1408 params->script_url = script_url_; | 1767 params->script_url = script_url_; |
| 1409 params->is_installed = IsInstalled(status_); | 1768 params->is_installed = IsInstalled(status_); |
| 1410 params->pause_after_download = pause_after_download_; | 1769 params->pause_after_download = pause_after_download_; |
| 1411 | 1770 |
| 1771 if (status_ == ServiceWorkerVersion::ACTIVATED) { |
| 1772 TRACE_EVENT_ASYNC_BEGIN1("ServiceWorker", "IsolatedWorkerInstance::Start", |
| 1773 this, "Script", script_url().spec()); |
| 1774 |
| 1775 std::vector<ServiceWorkerDatabase::ResourceRecord> resources; |
| 1776 script_cache_map_.GetResources(&resources); |
| 1777 DCHECK(!resources.empty()); |
| 1778 isolated_worker_.reset(new IsolatedWorkerInstance( |
| 1779 context_, weak_factory_.GetWeakPtr(), resources, |
| 1780 base::Bind(&ServiceWorkerVersion::OnIsolatedWorkerStartFailed, |
| 1781 weak_factory_.GetWeakPtr()))); |
| 1782 return; |
| 1783 } |
| 1784 |
| 1412 embedded_worker_->Start( | 1785 embedded_worker_->Start( |
| 1413 std::move(params), | 1786 std::move(params), |
| 1414 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, | 1787 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, |
| 1415 weak_factory_.GetWeakPtr())); | 1788 weak_factory_.GetWeakPtr())); |
| 1416 } | 1789 } |
| 1417 | 1790 |
| 1791 bool ServiceWorkerVersion::IsIsolatedWorker() const { |
| 1792 return !!isolated_worker_client_.get(); |
| 1793 } |
| 1794 |
| 1795 void ServiceWorkerVersion::OnIsolatedWorkerStartFailed() { |
| 1796 TRACE_EVENT_ASYNC_END1("ServiceWorker", "IsolatedWorkerInstance::Start", this, |
| 1797 "success", false); |
| 1798 LOG(ERROR) << " OnIsolatedWorkerStartFailed"; |
| 1799 isolated_worker_.reset(); |
| 1800 |
| 1801 std::unique_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( |
| 1802 new EmbeddedWorkerMsg_StartWorker_Params()); |
| 1803 params->service_worker_version_id = version_id_; |
| 1804 params->scope = scope_; |
| 1805 params->script_url = script_url_; |
| 1806 params->is_installed = IsInstalled(status_); |
| 1807 params->pause_after_download = pause_after_download_; |
| 1808 embedded_worker_->Start( |
| 1809 std::move(params), |
| 1810 base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, |
| 1811 weak_factory_.GetWeakPtr())); |
| 1812 } |
| 1813 |
| 1814 void ServiceWorkerVersion::OnIsolatedWorkerThreadStarted( |
| 1815 mojo::InterfacePtr<blink::mojom::IsolatedWorkerClient> client) { |
| 1816 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "IsolatedWorkerInstance::Start", |
| 1817 this, "OnIsolatedWorkerThreadStarted"); |
| 1818 LOG(ERROR) << " OnIsolatedWorkerThreadStarted"; |
| 1819 isolated_worker_client_ = std::move(client); |
| 1820 } |
| 1821 void ServiceWorkerVersion::OnIsolatedWorkerScriptEvaluated() { |
| 1822 TRACE_EVENT_ASYNC_STEP_PAST0("ServiceWorker", "IsolatedWorkerInstance::Start", |
| 1823 this, "OnIsolatedWorkerScriptEvaluated"); |
| 1824 LOG(ERROR) << " OnIsolatedWorkerScriptEvaluated"; |
| 1825 } |
| 1826 void ServiceWorkerVersion::OnIsolatedWorkerStarted() { |
| 1827 TRACE_EVENT_ASYNC_END1("ServiceWorker", "IsolatedWorkerInstance::Start", this, |
| 1828 "success", true); |
| 1829 LOG(ERROR) << " OnIsolatedWorkerStarted"; |
| 1830 OnStarted(); |
| 1831 } |
| 1832 |
| 1833 EmbeddedWorkerStatus ServiceWorkerVersion::running_status() const { |
| 1834 if (IsIsolatedWorker() && isolated_worker_client_) |
| 1835 return EmbeddedWorkerStatus::RUNNING; |
| 1836 return embedded_worker_->status(); |
| 1837 } |
| 1838 |
| 1418 void ServiceWorkerVersion::StartTimeoutTimer() { | 1839 void ServiceWorkerVersion::StartTimeoutTimer() { |
| 1419 DCHECK(!timeout_timer_.IsRunning()); | 1840 DCHECK(!timeout_timer_.IsRunning()); |
| 1420 | 1841 |
| 1421 if (embedded_worker_->devtools_attached()) { | 1842 if (embedded_worker_->devtools_attached()) { |
| 1422 // Don't record the startup time metric once DevTools is attached. | 1843 // Don't record the startup time metric once DevTools is attached. |
| 1423 ClearTick(&start_time_); | 1844 ClearTick(&start_time_); |
| 1424 skip_recording_startup_time_ = true; | 1845 skip_recording_startup_time_ = true; |
| 1425 } else { | 1846 } else { |
| 1426 RestartTick(&start_time_); | 1847 RestartTick(&start_time_); |
| 1427 skip_recording_startup_time_ = false; | 1848 skip_recording_startup_time_ = false; |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1581 return !pending_requests_.IsEmpty() || !streaming_url_request_jobs_.empty() || | 2002 return !pending_requests_.IsEmpty() || !streaming_url_request_jobs_.empty() || |
| 1582 !start_callbacks_.empty(); | 2003 !start_callbacks_.empty(); |
| 1583 } | 2004 } |
| 1584 | 2005 |
| 1585 void ServiceWorkerVersion::RecordStartWorkerResult( | 2006 void ServiceWorkerVersion::RecordStartWorkerResult( |
| 1586 ServiceWorkerMetrics::EventType purpose, | 2007 ServiceWorkerMetrics::EventType purpose, |
| 1587 Status prestart_status, | 2008 Status prestart_status, |
| 1588 int trace_id, | 2009 int trace_id, |
| 1589 bool is_browser_startup_complete, | 2010 bool is_browser_startup_complete, |
| 1590 ServiceWorkerStatusCode status) { | 2011 ServiceWorkerStatusCode status) { |
| 2012 // todo |
| 2013 if (IsIsolatedWorker()) |
| 2014 return; |
| 2015 |
| 1591 if (trace_id != kInvalidTraceId) { | 2016 if (trace_id != kInvalidTraceId) { |
| 1592 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::StartWorker", | 2017 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::StartWorker", |
| 1593 trace_id, "Status", | 2018 trace_id, "Status", |
| 1594 ServiceWorkerStatusToString(status)); | 2019 ServiceWorkerStatusToString(status)); |
| 1595 } | 2020 } |
| 1596 base::TimeTicks start_time = start_time_; | 2021 base::TimeTicks start_time = start_time_; |
| 1597 ClearTick(&start_time_); | 2022 ClearTick(&start_time_); |
| 1598 | 2023 |
| 1599 if (context_ && IsInstalled(prestart_status)) | 2024 if (context_ && IsInstalled(prestart_status)) |
| 1600 context_->UpdateVersionFailureCount(version_id_, status); | 2025 context_->UpdateVersionFailureCount(version_id_, status); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1789 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 2214 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 1790 idle_time_); | 2215 idle_time_); |
| 1791 } | 2216 } |
| 1792 | 2217 |
| 1793 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { | 2218 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { |
| 1794 start_worker_first_purpose_ = base::nullopt; | 2219 start_worker_first_purpose_ = base::nullopt; |
| 1795 RunCallbacks(this, &start_callbacks_, status); | 2220 RunCallbacks(this, &start_callbacks_, status); |
| 1796 } | 2221 } |
| 1797 | 2222 |
| 1798 } // namespace content | 2223 } // namespace content |
| OLD | NEW |