Changeset 244043 in webkit


Ignore:
Timestamp:
Apr 8, 2019 1:51:20 PM (5 years ago)
Author:
youenn@apple.com
Message:

Lazily construct Navigator serviceWorker
https://bugs.webkit.org/show_bug.cgi?id=196692

Reviewed by Chris Dumez.

Make NavigatorBase a ContextDestructionObserver.
This allows to get the navigator script execution context.
Use it when creating the navigator ServiceWorkerContainer object.
For GC, introduce serviceWorkerIfAny which returns the container if created.
No JS observable change of behavior.
Covered by existing tests.

  • bindings/js/JSNavigatorCustom.cpp:

(WebCore::JSNavigator::visitAdditionalChildren):

  • bindings/js/JSWorkerNavigatorCustom.cpp:

(WebCore::JSWorkerNavigator::visitAdditionalChildren):

  • page/NavigatorBase.cpp:

(WebCore::NavigatorBase::NavigatorBase):
(WebCore::NavigatorBase::serviceWorkerIfAny):
(WebCore::NavigatorBase::serviceWorker):

  • page/NavigatorBase.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r244037 r244043  
     12019-04-08  Youenn Fablet  <youenn@apple.com>
     2
     3        Lazily construct Navigator serviceWorker
     4        https://bugs.webkit.org/show_bug.cgi?id=196692
     5
     6        Reviewed by Chris Dumez.
     7
     8        Make NavigatorBase a ContextDestructionObserver.
     9        This allows to get the navigator script execution context.
     10        Use it when creating the navigator ServiceWorkerContainer object.
     11        For GC, introduce serviceWorkerIfAny which returns the container if created.
     12        No JS observable change of behavior.
     13        Covered by existing tests.
     14
     15        * bindings/js/JSNavigatorCustom.cpp:
     16        (WebCore::JSNavigator::visitAdditionalChildren):
     17        * bindings/js/JSWorkerNavigatorCustom.cpp:
     18        (WebCore::JSWorkerNavigator::visitAdditionalChildren):
     19        * page/NavigatorBase.cpp:
     20        (WebCore::NavigatorBase::NavigatorBase):
     21        (WebCore::NavigatorBase::serviceWorkerIfAny):
     22        (WebCore::NavigatorBase::serviceWorker):
     23        * page/NavigatorBase.h:
     24
    1252019-04-08  Antti Koivisto  <antti@apple.com>
    226
  • trunk/Source/WebCore/bindings/js/JSNavigatorCustom.cpp

    r235271 r244043  
    3232{
    3333#if ENABLE(SERVICE_WORKER)
    34     visitor.addOpaqueRoot(&wrapped().serviceWorker());
     34    visitor.addOpaqueRoot(wrapped().serviceWorkerIfExists());
    3535#else
    3636    UNUSED_PARAM(visitor);
  • trunk/Source/WebCore/bindings/js/JSWorkerNavigatorCustom.cpp

    r225816 r244043  
    3232{
    3333#if ENABLE(SERVICE_WORKER)
    34     visitor.addOpaqueRoot(&wrapped().serviceWorker());
     34    visitor.addOpaqueRoot(wrapped().serviceWorkerIfExists());
    3535#else
    3636    UNUSED_PARAM(visitor);
  • trunk/Source/WebCore/page/NavigatorBase.cpp

    r239384 r244043  
    2929
    3030#include "Document.h"
     31#include "RuntimeEnabledFeatures.h"
    3132#include "ServiceWorkerContainer.h"
    3233#include <mutex>
     
    7879
    7980NavigatorBase::NavigatorBase(ScriptExecutionContext* context)
    80 #if ENABLE(SERVICE_WORKER)
    81     : m_serviceWorkerContainer(makeUniqueRef<ServiceWorkerContainer>(context, *this))
    82 #endif
     81    : ContextDestructionObserver(context)
    8382{
    84 #if !ENABLE(SERVICE_WORKER)
    85     UNUSED_PARAM(context);
    86 #endif
    8783}
    8884
     
    152148
    153149#if ENABLE(SERVICE_WORKER)
     150ServiceWorkerContainer* NavigatorBase::serviceWorkerIfExists()
     151{
     152    return m_serviceWorkerContainer.get();
     153}
     154
    154155ServiceWorkerContainer& NavigatorBase::serviceWorker()
    155156{
    156     return m_serviceWorkerContainer;
     157    ASSERT(RuntimeEnabledFeatures::sharedFeatures().serviceWorkerEnabled());
     158    if (!m_serviceWorkerContainer)
     159        m_serviceWorkerContainer = std::make_unique<ServiceWorkerContainer>(scriptExecutionContext(), *this);
     160    return *m_serviceWorkerContainer;
    157161}
    158162
     
    161165    if (is<Document>(context) && downcast<Document>(context).isSandboxed(SandboxOrigin))
    162166        return Exception { SecurityError, "Service Worker is disabled because the context is sandboxed and lacks the 'allow-same-origin' flag" };
    163     return m_serviceWorkerContainer.get();
     167    return serviceWorker();
    164168}
    165169#endif
  • trunk/Source/WebCore/page/NavigatorBase.h

    r239384 r244043  
    2626#pragma once
    2727
     28#include "ContextDestructionObserver.h"
    2829#include "ExceptionOr.h"
    2930#include <wtf/Forward.h>
     
    3738class ServiceWorkerContainer;
    3839
    39 class NavigatorBase : public RefCounted<NavigatorBase> {
     40class NavigatorBase : public RefCounted<NavigatorBase>, public ContextDestructionObserver {
    4041public:
    4142    virtual ~NavigatorBase();
     
    6263#if ENABLE(SERVICE_WORKER)
    6364public:
     65    ServiceWorkerContainer* serviceWorkerIfExists();
    6466    ServiceWorkerContainer& serviceWorker();
    6567    ExceptionOr<ServiceWorkerContainer&> serviceWorker(ScriptExecutionContext&);
    6668
    6769private:
    68     UniqueRef<ServiceWorkerContainer> m_serviceWorkerContainer;
     70    std::unique_ptr<ServiceWorkerContainer> m_serviceWorkerContainer;
    6971#endif
    7072};
Note: See TracChangeset for help on using the changeset viewer.