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