Title: [244043] trunk/Source/WebCore
Revision
244043
Author
[email protected]
Date
2019-04-08 13:51:20 -0700 (Mon, 08 Apr 2019)

Log 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:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (244042 => 244043)


--- trunk/Source/WebCore/ChangeLog	2019-04-08 20:50:08 UTC (rev 244042)
+++ trunk/Source/WebCore/ChangeLog	2019-04-08 20:51:20 UTC (rev 244043)
@@ -1,3 +1,27 @@
+2019-04-08  Youenn Fablet  <[email protected]>
+
+        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:
+
 2019-04-08  Antti Koivisto  <[email protected]>
 
         Update touch-action region on property changes

Modified: trunk/Source/WebCore/bindings/js/JSNavigatorCustom.cpp (244042 => 244043)


--- trunk/Source/WebCore/bindings/js/JSNavigatorCustom.cpp	2019-04-08 20:50:08 UTC (rev 244042)
+++ trunk/Source/WebCore/bindings/js/JSNavigatorCustom.cpp	2019-04-08 20:51:20 UTC (rev 244043)
@@ -31,7 +31,7 @@
 void JSNavigator::visitAdditionalChildren(JSC::SlotVisitor& visitor)
 {
 #if ENABLE(SERVICE_WORKER)
-    visitor.addOpaqueRoot(&wrapped().serviceWorker());
+    visitor.addOpaqueRoot(wrapped().serviceWorkerIfExists());
 #else
     UNUSED_PARAM(visitor);
 #endif

Modified: trunk/Source/WebCore/bindings/js/JSWorkerNavigatorCustom.cpp (244042 => 244043)


--- trunk/Source/WebCore/bindings/js/JSWorkerNavigatorCustom.cpp	2019-04-08 20:50:08 UTC (rev 244042)
+++ trunk/Source/WebCore/bindings/js/JSWorkerNavigatorCustom.cpp	2019-04-08 20:51:20 UTC (rev 244043)
@@ -31,7 +31,7 @@
 void JSWorkerNavigator::visitAdditionalChildren(JSC::SlotVisitor& visitor)
 {
 #if ENABLE(SERVICE_WORKER)
-    visitor.addOpaqueRoot(&wrapped().serviceWorker());
+    visitor.addOpaqueRoot(wrapped().serviceWorkerIfExists());
 #else
     UNUSED_PARAM(visitor);
 #endif

Modified: trunk/Source/WebCore/page/NavigatorBase.cpp (244042 => 244043)


--- trunk/Source/WebCore/page/NavigatorBase.cpp	2019-04-08 20:50:08 UTC (rev 244042)
+++ trunk/Source/WebCore/page/NavigatorBase.cpp	2019-04-08 20:51:20 UTC (rev 244043)
@@ -28,6 +28,7 @@
 #include "NavigatorBase.h"
 
 #include "Document.h"
+#include "RuntimeEnabledFeatures.h"
 #include "ServiceWorkerContainer.h"
 #include <mutex>
 #include <wtf/Language.h>
@@ -77,13 +78,8 @@
 namespace WebCore {
 
 NavigatorBase::NavigatorBase(ScriptExecutionContext* context)
-#if ENABLE(SERVICE_WORKER)
-    : m_serviceWorkerContainer(makeUniqueRef<ServiceWorkerContainer>(context, *this))
-#endif
+    : ContextDestructionObserver(context)
 {
-#if !ENABLE(SERVICE_WORKER)
-    UNUSED_PARAM(context);
-#endif
 }
 
 NavigatorBase::~NavigatorBase() = default;
@@ -151,9 +147,17 @@
 }
 
 #if ENABLE(SERVICE_WORKER)
+ServiceWorkerContainer* NavigatorBase::serviceWorkerIfExists()
+{
+    return m_serviceWorkerContainer.get();
+}
+
 ServiceWorkerContainer& NavigatorBase::serviceWorker()
 {
-    return m_serviceWorkerContainer;
+    ASSERT(RuntimeEnabledFeatures::sharedFeatures().serviceWorkerEnabled());
+    if (!m_serviceWorkerContainer)
+        m_serviceWorkerContainer = std::make_unique<ServiceWorkerContainer>(scriptExecutionContext(), *this);
+    return *m_serviceWorkerContainer;
 }
 
 ExceptionOr<ServiceWorkerContainer&> NavigatorBase::serviceWorker(ScriptExecutionContext& context)
@@ -160,7 +164,7 @@
 {
     if (is<Document>(context) && downcast<Document>(context).isSandboxed(SandboxOrigin))
         return Exception { SecurityError, "Service Worker is disabled because the context is sandboxed and lacks the 'allow-same-origin' flag" };
-    return m_serviceWorkerContainer.get();
+    return serviceWorker();
 }
 #endif
 

Modified: trunk/Source/WebCore/page/NavigatorBase.h (244042 => 244043)


--- trunk/Source/WebCore/page/NavigatorBase.h	2019-04-08 20:50:08 UTC (rev 244042)
+++ trunk/Source/WebCore/page/NavigatorBase.h	2019-04-08 20:51:20 UTC (rev 244043)
@@ -25,6 +25,7 @@
 
 #pragma once
 
+#include "ContextDestructionObserver.h"
 #include "ExceptionOr.h"
 #include <wtf/Forward.h>
 #include <wtf/RefCounted.h>
@@ -36,7 +37,7 @@
 class ScriptExecutionContext;
 class ServiceWorkerContainer;
 
-class NavigatorBase : public RefCounted<NavigatorBase> {
+class NavigatorBase : public RefCounted<NavigatorBase>, public ContextDestructionObserver {
 public:
     virtual ~NavigatorBase();
 
@@ -61,11 +62,12 @@
 
 #if ENABLE(SERVICE_WORKER)
 public:
+    ServiceWorkerContainer* serviceWorkerIfExists();
     ServiceWorkerContainer& serviceWorker();
     ExceptionOr<ServiceWorkerContainer&> serviceWorker(ScriptExecutionContext&);
 
 private:
-    UniqueRef<ServiceWorkerContainer> m_serviceWorkerContainer;
+    std::unique_ptr<ServiceWorkerContainer> m_serviceWorkerContainer;
 #endif
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to