Commit 2a75a96b authored by beidson@apple.com's avatar beidson@apple.com

<rdar://problem/10120155> and https://bugs.webkit.org/show_bug.cgi?id=82664 ...

<rdar://problem/10120155> and https://bugs.webkit.org/show_bug.cgi?id=82664  Need DOMWindow mechanism to supplement UserScripts for page cache notifications

Source/WebCore:

This patch creates a new object type "DOMWindowExtension" which extends DOMWindowProperty.
A DOMWindowExtension is tied to a particular DOMWindow and represents extensibility in that
DOMWindow within a particular DOMWrapperWorld.

It is a token object meant designed to notify clients of the various events in the lifetime
of a DOMWindow property such as creation, disconnecting for the page cache, reconnecting
when restoring from the page cache, and DOMWindow destruction.

Reviewed by Sam Weinig.

New WebKit API test DOMWindowExtensionBasic added.

Add hooks for 4 new client calls regarding DOMWindowExtensions and global object lifetime:
* loader/FrameLoaderClient.h:
(WebCore::FrameLoaderClient::dispatchCanCreateGlobalObject):
(WebCore::FrameLoaderClient::dispatchWillDisconnectDOMWindowExtensionFromGlobalObject):
(WebCore::FrameLoaderClient::dispatchDidReconnectDOMWindowExtensionToGlobalObject):
(WebCore::FrameLoaderClient::dispatchWillDestroyGlobalObjectForDOMWindowExtension):

At the same time "DidClearWindowObject" is called, also notify clients that the global object is available:
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::receivedFirstData):
(WebCore::FrameLoader::dispatchGlobalObjectAvailableInAllWorlds):
* loader/FrameLoader.h:

 DOMWindowProperties might want to unregister themselves during these notifications, so copy
 the set to a Vector. While this technique is arguably fragile, its certainly less fragile than
 mutating a set while iterating it:
* page/DOMWindow.cpp:
(WebCore::DOMWindow::willDetachPage):
(WebCore::DOMWindow::disconnectDOMWindowProperties):
(WebCore::DOMWindow::reconnectDOMWindowProperties):

 Implement the DOMWindowExtension object. It acts like a DOMWindowProperty with the added capability
 of remembering what Frame it used to be connected to so it can *always* notify clients on willDetachPage:
* page/DOMWindowExtension.cpp: Added.
(WebCore::DOMWindowExtension::DOMWindowExtension):
(WebCore::DOMWindowExtension::~DOMWindowExtension):
(WebCore::DOMWindowExtension::disconnectFrame):
(WebCore::DOMWindowExtension::reconnectFrame):
(WebCore::DOMWindowExtension::willDetachPage):
* page/DOMWindowExtension.h: Added.
(WebCore::DOMWindowExtension::create):
(WebCore::DOMWindowExtension::world):

 Project files:
* CMakeLists.txt:
* GNUmakefile.list.am:
* Target.pri:
* WebCore.exp.in:
* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:

Source/WebKit2:

Reviewed by Sam Weinig.

- Adds a new API object WKBundleDOMWindowExtension
- Exposes callbacks about the lifetime of DOMWindowExtensions through BundlePageLoaderClient

Add new API casts:
* Shared/API/c/WKBase.h:
* Shared/APIClientTraits.cpp:
* Shared/APIObject.h:
* WebProcess/InjectedBundle/API/c/WKBundleAPICast.h:

Add API for the new DOMWindowExtension object:
* WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.cpp: Added.
(WKBundleDOMWindowExtensionGetTypeID):
(WKBundleDOMWindowExtensionCreate):
(WKBundleDOMWindowExtensionGetFrame):
(WKBundleDOMWindowExtensionGetScriptWorld):
* WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.h: Added.

Add implementation for that API which wraps the WebCore::DOMWindowExtension:
* WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.cpp: Added.
(WebKit::allExtensions):
(WebKit::InjectedBundleDOMWindowExtension::create):
(WebKit::InjectedBundleDOMWindowExtension::get):
(WebKit::InjectedBundleDOMWindowExtension::InjectedBundleDOMWindowExtension):
(WebKit::InjectedBundleDOMWindowExtension::~InjectedBundleDOMWindowExtension):
(WebKit::InjectedBundleDOMWindowExtension::frame):
(WebKit::InjectedBundleDOMWindowExtension::world):
* WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.h: Added.
(InjectedBundleDOMWindowExtension):
(WebKit::InjectedBundleDOMWindowExtension::type):

Add new BundlePageLoaderClient methods:
* WebProcess/InjectedBundle/API/c/WKBundlePage.h:
* WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.cpp:
(WebKit::InjectedBundlePageLoaderClient::didCreateGlobalObjectForFrame):
(WebKit::InjectedBundlePageLoaderClient::willDisconnectDOMWindowExtensionFromGlobalObject):
(WebKit::InjectedBundlePageLoaderClient::didReconnectDOMWindowExtensionToGlobalObject):
(WebKit::InjectedBundlePageLoaderClient::willDestroyGlobalObjectForDOMWindowExtension):
* WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.h:
(InjectedBundlePageLoaderClient):

Implement the 4 new callbacks from WebCore which notify the BundlePageLoaderClient:
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchGlobalObjectAvailable):
(WebKit::WebFrameLoaderClient::dispatchWillDisconnectDOMWindowExtensionFromGlobalObject):
(WebKit::WebFrameLoaderClient::dispatchDidReconnectDOMWindowExtensionToGlobalObject):
(WebKit::WebFrameLoaderClient::dispatchWillDestroyGlobalObjectForDOMWindowExtension):
* WebProcess/WebCoreSupport/WebFrameLoaderClient.h:

Project Files:
* CMakeLists.txt:
* GNUmakefile.am:
* Target.pri:
* WebKit2.xcodeproj/project.pbxproj:
* win/WebKit2.vcproj:

Tools:

Reviewed by Sam Weinig.

Add a new bundle test that stresses the basics of the WKBundleDOMWindowExtension API.

It makes sure new extensions can be added at the right times, and that all of the expected
callbacks are made.

* TestWebKitAPI/Tests/WebKit2/DOMWindowExtensionBasic.cpp: Added.
(TestWebKitAPI::didReceiveMessageFromInjectedBundle): Record all messages sent from the bundle.
(TestWebKitAPI::TEST): Run a page through some basic exercises, then compared messages sent from the
   bundle to a set of known expected messages.

Listen to all the new client callbacks, create some extensions, and monitor their lifetimes:
* TestWebKitAPI/Tests/WebKit2/DOMWindowExtensionBasic_Bundle.cpp: Added.
(TestWebKitAPI::DOMWindowExtensionBasic::DOMWindowExtensionBasic):
(TestWebKitAPI::DOMWindowExtensionBasic::frameLoadFinished):
(TestWebKitAPI::DOMWindowExtensionBasic::sendExtensionStateMessage):
(TestWebKitAPI::DOMWindowExtensionBasic::initialize):
(TestWebKitAPI::DOMWindowExtensionBasic::didCreatePage):
(TestWebKitAPI::DOMWindowExtensionBasic::updateExtensionStateRecord):
(TestWebKitAPI::DOMWindowExtensionBasic::sendBundleMessage):
(TestWebKitAPI::DOMWindowExtensionBasic::didCreateGlobalObjectForFrame):
(TestWebKitAPI::DOMWindowExtensionBasic::willDisconnectDOMWindowExtensionFromGlobalObject):
(TestWebKitAPI::DOMWindowExtensionBasic::didReconnectDOMWindowExtensionToGlobalObject):
(TestWebKitAPI::DOMWindowExtensionBasic::willDestroyGlobalObjectForDOMWindowExtension):
(TestWebKitAPI::didFinishLoadForFrameCallback):
(TestWebKitAPI::didCreateGlobalObjectForFrameCallback):
(TestWebKitAPI::willDisconnectDOMWindowExtensionFromGlobalObjectCallback):
(TestWebKitAPI::didReconnectDOMWindowExtensionToGlobalObjectCallback):
(TestWebKitAPI::willDestroyGlobalObjectForDOMWindowExtensionCallback):

* TestWebKitAPI/Tests/WebKit2/InjectedBundleBasic.cpp:
(TestWebKitAPI::didReceiveMessageFromInjectedBundle): Make this method static, as it always should have been.

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@115083 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent c181c892
......@@ -1033,6 +1033,7 @@ SET(WebCore_SOURCES
page/DOMSelection.cpp
page/DOMTimer.cpp
page/DOMWindow.cpp
page/DOMWindowExtension.cpp
page/DOMWindowProperty.cpp
page/DragController.cpp
page/EventHandler.cpp
......
2012-04-24 Brady Eidson <beidson@apple.com>
<rdar://problem/10120155> and https://bugs.webkit.org/show_bug.cgi?id=82664
Need DOMWindow mechanism to supplement UserScripts for page cache notifications
This patch creates a new object type "DOMWindowExtension" which extends DOMWindowProperty.
A DOMWindowExtension is tied to a particular DOMWindow and represents extensibility in that
DOMWindow within a particular DOMWrapperWorld.
It is a token object meant designed to notify clients of the various events in the lifetime
of a DOMWindow property such as creation, disconnecting for the page cache, reconnecting
when restoring from the page cache, and DOMWindow destruction.
Reviewed by Sam Weinig.
New WebKit API test DOMWindowExtensionBasic added.
Add hooks for 4 new client calls regarding DOMWindowExtensions and global object lifetime:
* loader/FrameLoaderClient.h:
(WebCore::FrameLoaderClient::dispatchCanCreateGlobalObject):
(WebCore::FrameLoaderClient::dispatchWillDisconnectDOMWindowExtensionFromGlobalObject):
(WebCore::FrameLoaderClient::dispatchDidReconnectDOMWindowExtensionToGlobalObject):
(WebCore::FrameLoaderClient::dispatchWillDestroyGlobalObjectForDOMWindowExtension):
At the same time "DidClearWindowObject" is called, also notify clients that the global object is available:
* loader/FrameLoader.cpp:
(WebCore::FrameLoader::receivedFirstData):
(WebCore::FrameLoader::dispatchGlobalObjectAvailableInAllWorlds):
* loader/FrameLoader.h:
DOMWindowProperties might want to unregister themselves during these notifications, so copy
the set to a Vector. While this technique is arguably fragile, its certainly less fragile than
mutating a set while iterating it:
* page/DOMWindow.cpp:
(WebCore::DOMWindow::willDetachPage):
(WebCore::DOMWindow::disconnectDOMWindowProperties):
(WebCore::DOMWindow::reconnectDOMWindowProperties):
Implement the DOMWindowExtension object. It acts like a DOMWindowProperty with the added capability
of remembering what Frame it used to be connected to so it can *always* notify clients on willDetachPage:
* page/DOMWindowExtension.cpp: Added.
(WebCore::DOMWindowExtension::DOMWindowExtension):
(WebCore::DOMWindowExtension::~DOMWindowExtension):
(WebCore::DOMWindowExtension::disconnectFrame):
(WebCore::DOMWindowExtension::reconnectFrame):
(WebCore::DOMWindowExtension::willDetachPage):
* page/DOMWindowExtension.h: Added.
(WebCore::DOMWindowExtension::create):
(WebCore::DOMWindowExtension::world):
Project files:
* CMakeLists.txt:
* GNUmakefile.list.am:
* Target.pri:
* WebCore.exp.in:
* WebCore.gypi:
* WebCore.vcproj/WebCore.vcproj:
* WebCore.xcodeproj/project.pbxproj:
2012-04-24 Sami Kyostila <skyostil@chromium.org>
[chromium] Don't keep pointers to released layer tree
......@@ -2924,6 +2924,8 @@ webcore_sources += \
Source/WebCore/page/DOMTimer.h \
Source/WebCore/page/DOMWindow.cpp \
Source/WebCore/page/DOMWindow.h \
Source/WebCore/page/DOMWindowExtension.cpp \
Source/WebCore/page/DOMWindowExtension.h \
Source/WebCore/page/DOMWindowProperty.cpp \
Source/WebCore/page/DOMWindowProperty.h \
Source/WebCore/page/DragActions.h \
......
......@@ -1009,6 +1009,7 @@ SOURCES += \
page/DOMSelection.cpp \
page/DOMTimer.cpp \
page/DOMWindow.cpp \
page/DOMWindowExtension.cpp \
page/DOMWindowProperty.cpp \
page/DragController.cpp \
page/EventHandler.cpp \
......@@ -2131,6 +2132,7 @@ HEADERS += \
page/DOMSelection.h \
page/DOMTimer.h \
page/DOMWindow.h \
page/DOMWindowExtension.h \
page/DragController.h \
page/DragState.h \
page/EventHandler.h \
......
......@@ -545,6 +545,7 @@ __ZN7WebCore17RegularExpressionD1Ev
__ZN7WebCore17cacheDOMStructureEPNS_17JSDOMGlobalObjectEPN3JSC9StructureEPKNS2_9ClassInfoE
__ZN7WebCore17openTemporaryFileERKN3WTF6StringERi
__ZN7WebCore17userVisibleStringEP5NSURL
__ZN7WebCore18DOMWindowExtensionC1EPNS_5FrameEPNS_15DOMWrapperWorldE
__ZN7WebCore18HTMLContentElement6createEPNS_8DocumentE
__ZN7WebCore18PlatformPasteboard13bufferForTypeERKN3WTF6StringE
__ZN7WebCore18PlatformPasteboard13stringForTypeERKN3WTF6StringE
......
......@@ -223,6 +223,7 @@
'page/ContextMenuController.h',
'page/Coordinates.h',
'page/DOMWindow.h',
'page/DOMWindowExtension.h',
'page/DragActions.h',
'page/DragClient.h',
'page/DragController.h',
......@@ -2966,6 +2967,8 @@
'page/DOMTimer.cpp',
'page/DOMTimer.h',
'page/DOMWindow.cpp',
'page/DOMWindowExtension.cpp',
'page/DOMWindowExtension.h',
'page/DOMWindowPagePopup.cpp',
'page/DOMWindowPagePopup.h',
'page/DOMWindowProperty.cpp',
......
......@@ -26173,6 +26173,14 @@
RelativePath="..\page\DOMWindow.h"
>
</File>
<File
RelativePath="..\page\DOMWindowExtension.cpp"
>
</File>
<File
RelativePath="..\page\DOMWindowExtension.h"
>
</File>
<File
RelativePath="..\page\DOMWindowProperty.cpp"
>
......@@ -1528,6 +1528,7 @@
51741D110B07259A00ED442C /* HistoryItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 51741D0D0B07259A00ED442C /* HistoryItem.h */; settings = {ATTRIBUTES = (Private, ); }; };
51741D120B07259A00ED442C /* HistoryItem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51741D0E0B07259A00ED442C /* HistoryItem.cpp */; };
5174E20A10A1F44F00F95E6F /* PopStateEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 5174E20810A1F44F00F95E6F /* PopStateEvent.h */; };
517FBA1E151AB17C00B57959 /* DOMWindowExtension.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 517FBA17151AA71B00B57959 /* DOMWindowExtension.cpp */; };
5189F01D10B37BD900F3C739 /* JSPopStateEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5189F01B10B37BD900F3C739 /* JSPopStateEvent.cpp */; };
5189F01E10B37BD900F3C739 /* JSPopStateEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 5189F01C10B37BD900F3C739 /* JSPopStateEvent.h */; };
5189F0DE10B46B0E00F3C739 /* PopStateEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5189F0DD10B46B0E00F3C739 /* PopStateEvent.cpp */; };
......@@ -1566,6 +1567,7 @@
51E3F9C70DA059DC00250911 /* Storage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E3F9C50DA059DC00250911 /* Storage.cpp */; };
51E3F9D60DA05E1D00250911 /* JSStorage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E3F9D40DA05E1D00250911 /* JSStorage.cpp */; };
51EC92650CE90DD400F90308 /* JSCustomSQLStatementErrorCallback.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51EC925D0CE90DD400F90308 /* JSCustomSQLStatementErrorCallback.cpp */; };
51FA2D78152132B300C1BA0B /* DOMWindowExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 517FBA18151AA71B00B57959 /* DOMWindowExtension.h */; settings = {ATTRIBUTES = (Private, ); }; };
51FB5504113E3E9100821176 /* JSCloseEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 51FB5502113E3E9100821176 /* JSCloseEvent.h */; };
51FB5505113E3E9100821176 /* JSCloseEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51FB5503113E3E9100821176 /* JSCloseEvent.cpp */; };
521D46F611AEC98100514613 /* KillRingMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 521D46F511AEC98100514613 /* KillRingMac.mm */; };
......@@ -8522,6 +8524,8 @@
51741D0E0B07259A00ED442C /* HistoryItem.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = HistoryItem.cpp; sourceTree = "<group>"; };
5174E20810A1F44F00F95E6F /* PopStateEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PopStateEvent.h; sourceTree = "<group>"; };
5174E20B10A1F49A00F95E6F /* PopStateEvent.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PopStateEvent.idl; sourceTree = "<group>"; };
517FBA17151AA71B00B57959 /* DOMWindowExtension.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DOMWindowExtension.cpp; sourceTree = "<group>"; };
517FBA18151AA71B00B57959 /* DOMWindowExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMWindowExtension.h; sourceTree = "<group>"; };
5189F01B10B37BD900F3C739 /* JSPopStateEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPopStateEvent.cpp; sourceTree = "<group>"; };
5189F01C10B37BD900F3C739 /* JSPopStateEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPopStateEvent.h; sourceTree = "<group>"; };
5189F0DD10B46B0E00F3C739 /* PopStateEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PopStateEvent.cpp; sourceTree = "<group>"; };
......@@ -15368,6 +15372,8 @@
1403B99609EB13AF00797C7F /* DOMWindow.cpp */,
1403B99509EB13AF00797C7F /* DOMWindow.h */,
1403B90C09EB124500797C7F /* DOMWindow.idl */,
517FBA17151AA71B00B57959 /* DOMWindowExtension.cpp */,
517FBA18151AA71B00B57959 /* DOMWindowExtension.h */,
97D2AD0114B823A60093DF32 /* DOMWindowProperty.cpp */,
97D2AD0214B823A60093DF32 /* DOMWindowProperty.h */,
A718760D0B2A120100A16ECE /* DragActions.h */,
......@@ -24825,6 +24831,7 @@
B658FFA21522EF3A00DD5595 /* JSRadioNodeList.h in Headers */,
B658FFA61522EFAA00DD5595 /* RadioNodeList.h in Headers */,
E100EE761546EAC100BA11D1 /* StyleBuilder.h in Headers */,
51FA2D78152132B300C1BA0B /* DOMWindowExtension.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -27839,6 +27846,7 @@
B658FFA11522EF3A00DD5595 /* JSRadioNodeList.cpp in Sources */,
B658FFA51522EFAA00DD5595 /* RadioNodeList.cpp in Sources */,
E100EE751546EAC100BA11D1 /* StyleBuilder.cpp in Sources */,
517FBA1E151AB17C00B57959 /* DOMWindowExtension.cpp in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -571,6 +571,7 @@ void FrameLoader::receivedFirstData()
dispatchDidCommitLoad();
dispatchDidClearWindowObjectsInAllWorlds();
dispatchGlobalObjectAvailableInAllWorlds();
if (m_documentLoader) {
StringWithDirection ptitle = m_documentLoader->title();
......@@ -3110,6 +3111,14 @@ void FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld* world)
InspectorInstrumentation::didClearWindowObjectInWorld(m_frame, world);
}
void FrameLoader::dispatchGlobalObjectAvailableInAllWorlds()
{
Vector<DOMWrapperWorld*> worlds;
ScriptController::getAllWorlds(worlds);
for (size_t i = 0; i < worlds.size(); ++i)
m_client->dispatchGlobalObjectAvailable(worlds[i]);
}
SandboxFlags FrameLoader::effectiveSandboxFlags() const
{
SandboxFlags flags = m_forcedSandboxFlags;
......
......@@ -365,6 +365,8 @@ private:
bool shouldTreatURLAsSameAsCurrent(const KURL&) const;
void dispatchGlobalObjectAvailableInAllWorlds();
Frame* m_frame;
FrameLoaderClient* m_client;
......
......@@ -63,6 +63,7 @@ namespace WebCore {
class AuthenticationChallenge;
class CachedFrame;
class Color;
class DOMWindowExtension;
class DOMWrapperWorld;
class DocumentLoader;
class Element;
......@@ -331,6 +332,11 @@ namespace WebCore {
#endif
virtual void dispatchWillOpenSocketStream(SocketStreamHandle*) { }
virtual void dispatchGlobalObjectAvailable(DOMWrapperWorld*) { }
virtual void dispatchWillDisconnectDOMWindowExtensionFromGlobalObject(DOMWindowExtension*) { }
virtual void dispatchDidReconnectDOMWindowExtensionToGlobalObject(DOMWindowExtension*) { }
virtual void dispatchWillDestroyGlobalObjectForDOMWindowExtension(DOMWindowExtension*) { }
};
} // namespace WebCore
......
......@@ -45,6 +45,7 @@
#include "DOMTimer.h"
#include "DOMTokenList.h"
#include "DOMURL.h"
#include "DOMWindowExtension.h"
#include "DOMWindowNotifications.h"
#include "Database.h"
#include "DatabaseCallback.h"
......@@ -474,9 +475,10 @@ void DOMWindow::willDetachPage()
{
InspectorInstrumentation::frameWindowDiscarded(m_frame, this);
HashSet<DOMWindowProperty*>::iterator stop = m_properties.end();
for (HashSet<DOMWindowProperty*>::iterator it = m_properties.begin(); it != stop; ++it)
(*it)->willDetachPage();
Vector<DOMWindowProperty*> properties;
copyToVector(m_properties, properties);
for (size_t i = 0; i < properties.size(); ++i)
properties[i]->willDetachPage();
}
void DOMWindow::registerProperty(DOMWindowProperty* property)
......@@ -514,17 +516,19 @@ void DOMWindow::resumeFromPageCache()
void DOMWindow::disconnectDOMWindowProperties()
{
HashSet<DOMWindowProperty*>::iterator stop = m_properties.end();
for (HashSet<DOMWindowProperty*>::iterator it = m_properties.begin(); it != stop; ++it)
(*it)->disconnectFrame();
Vector<DOMWindowProperty*> properties;
copyToVector(m_properties, properties);
for (size_t i = 0; i < properties.size(); ++i)
properties[i]->disconnectFrame();
}
void DOMWindow::reconnectDOMWindowProperties()
{
ASSERT(m_suspendedForPageCache);
HashSet<DOMWindowProperty*>::iterator stop = m_properties.end();
for (HashSet<DOMWindowProperty*>::iterator it = m_properties.begin(); it != stop; ++it)
(*it)->reconnectFrame(m_frame);
Vector<DOMWindowProperty*> properties;
copyToVector(m_properties, properties);
for (size_t i = 0; i < properties.size(); ++i)
properties[i]->reconnectFrame(m_frame);
}
void DOMWindow::clearDOMWindowProperties()
......
/*
* Copyright (C) 2012 Apple Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "DOMWindowExtension.h"
#include "DOMWindow.h"
#include "DOMWrapperWorld.h"
#include "Frame.h"
#include "FrameLoaderClient.h"
namespace WebCore {
DOMWindowExtension::DOMWindowExtension(Frame* frame, DOMWrapperWorld* world)
: DOMWindowProperty(frame)
, m_world(world)
, m_disconnectedDOMWindow(0)
, m_wasDetached(false)
{
ASSERT(this->frame());
ASSERT(m_world);
}
DOMWindowExtension::~DOMWindowExtension()
{
// DOMWindowExtension lifetime isn't tied directly to the DOMWindow itself so it is important that it unregister
// itself from any DOMWindow it is associated with when destroyed.
// This might happen if the DOMWindowExtension is destroyed while its DOMWindow is in a CachedPage.
if (m_disconnectedDOMWindow)
m_disconnectedDOMWindow->unregisterProperty(this);
}
void DOMWindowExtension::disconnectFrame()
{
// Calling out to the client might result in this DOMWindowExtension being destroyed
// while there is still work to do.
RefPtr<DOMWindowExtension> protector = this;
// DOMWindowProperties are disconnected from frames after they are detached.
// DOMWindowExtensions only want to stay prepared for client callbacks if they've never been detached.
if (!m_wasDetached) {
Frame* frame = this->frame();
frame->loader()->client()->dispatchWillDisconnectDOMWindowExtensionFromGlobalObject(this);
m_disconnectedFrame = frame;
m_disconnectedDOMWindow = frame->domWindow();
}
DOMWindowProperty::disconnectFrame();
}
void DOMWindowExtension::reconnectFrame(Frame* frame)
{
// DOMWindowProperties should never reconnect to a frame after they've been detached from the page.
ASSERT(!m_wasDetached);
ASSERT(m_disconnectedFrame == frame);
DOMWindowProperty::reconnectFrame(frame);
m_disconnectedFrame = 0;
m_disconnectedDOMWindow = 0;
this->frame()->loader()->client()->dispatchDidReconnectDOMWindowExtensionToGlobalObject(this);
}
void DOMWindowExtension::willDetachPage()
{
// willDetachPage might be called multiple times but we only want to react once.
if (m_wasDetached)
return;
// Calling out to the client might result in this DOMWindowExtension being destroyed
// while there is still work to do.
RefPtr<DOMWindowExtension> protector = this;
Frame* frame = m_disconnectedFrame.get();
if (!frame)
frame = this->frame();
ASSERT(frame);
// DOMWindowExtension lifetime isn't tied directly to the DOMWindow itself so it is important that it unregister
// itself from any DOMWindow it is associated with when detached.
// This might be the disconnected DOMWindow if the DOMWindow is in a CachedPage that is pruned.
DOMWindow* associatedDOMWindow = m_disconnectedDOMWindow ? m_disconnectedDOMWindow : frame->domWindow();
associatedDOMWindow->unregisterProperty(this);
m_disconnectedDOMWindow = 0;
frame->loader()->client()->dispatchWillDestroyGlobalObjectForDOMWindowExtension(this);
m_disconnectedFrame = 0;
DOMWindowProperty::willDetachPage();
m_wasDetached = true;
}
} // namespace WebCore
/*
* Copyright (C) 2012 Apple Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef DOMWindowExtension_h
#define DOMWindowExtension_h
#include "DOMWindowProperty.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
namespace WebCore {
class DOMWindow;
class DOMWindowExtension;
class DOMWrapperWorld;
class Frame;
class DOMWindowExtension : public RefCounted<DOMWindowExtension>, public DOMWindowProperty {
public:
static PassRefPtr<DOMWindowExtension> create(Frame* frame, DOMWrapperWorld* world)
{
return adoptRef(new DOMWindowExtension(frame, world));
}
~DOMWindowExtension();
virtual void disconnectFrame() OVERRIDE;
virtual void reconnectFrame(Frame*) OVERRIDE;
virtual void willDetachPage() OVERRIDE;
DOMWrapperWorld* world() const { return m_world.get(); }
private:
DOMWindowExtension(Frame*, DOMWrapperWorld*);
RefPtr<DOMWrapperWorld> m_world;
RefPtr<Frame> m_disconnectedFrame;
DOMWindow* m_disconnectedDOMWindow;
bool m_wasDetached;
};
}
#endif // DOMWindowExtension_h
......@@ -338,6 +338,7 @@ SET(WebKit2_SOURCES
WebProcess/InjectedBundle/InjectedBundleBackForwardList.cpp
WebProcess/InjectedBundle/InjectedBundleBackForwardListItem.cpp
WebProcess/InjectedBundle/InjectedBundleClient.cpp
WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.cpp
WebProcess/InjectedBundle/InjectedBundleHitTestResult.cpp
WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp
WebProcess/InjectedBundle/InjectedBundlePageContextMenuClient.cpp
......@@ -353,6 +354,7 @@ SET(WebKit2_SOURCES
WebProcess/InjectedBundle/API/c/WKBundle.cpp
WebProcess/InjectedBundle/API/c/WKBundleBackForwardList.cpp
WebProcess/InjectedBundle/API/c/WKBundleBackForwardListItem.cpp
WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.cpp
WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp
WebProcess/InjectedBundle/API/c/WKBundleHitTestResult.cpp
WebProcess/InjectedBundle/API/c/WKBundleInspector.cpp
......
2012-04-24 Brady Eidson <beidson@apple.com>
<rdar://problem/10120155> and https://bugs.webkit.org/show_bug.cgi?id=82664
Need DOMWindow mechanism to supplement UserScripts for page cache notifications
Reviewed by Sam Weinig.
- Adds a new API object WKBundleDOMWindowExtension
- Exposes callbacks about the lifetime of DOMWindowExtensions through BundlePageLoaderClient
Add new API casts:
* Shared/API/c/WKBase.h:
* Shared/APIClientTraits.cpp:
* Shared/APIObject.h:
* WebProcess/InjectedBundle/API/c/WKBundleAPICast.h:
Add API for the new DOMWindowExtension object:
* WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.cpp: Added.
(WKBundleDOMWindowExtensionGetTypeID):
(WKBundleDOMWindowExtensionCreate):
(WKBundleDOMWindowExtensionGetFrame):
(WKBundleDOMWindowExtensionGetScriptWorld):
* WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.h: Added.
Add implementation for that API which wraps the WebCore::DOMWindowExtension:
* WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.cpp: Added.
(WebKit::allExtensions):
(WebKit::InjectedBundleDOMWindowExtension::create):
(WebKit::InjectedBundleDOMWindowExtension::get):
(WebKit::InjectedBundleDOMWindowExtension::InjectedBundleDOMWindowExtension):
(WebKit::InjectedBundleDOMWindowExtension::~InjectedBundleDOMWindowExtension):
(WebKit::InjectedBundleDOMWindowExtension::frame):
(WebKit::InjectedBundleDOMWindowExtension::world):
* WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.h: Added.
(InjectedBundleDOMWindowExtension):
(WebKit::InjectedBundleDOMWindowExtension::type):
Add new BundlePageLoaderClient methods:
* WebProcess/InjectedBundle/API/c/WKBundlePage.h:
* WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.cpp:
(WebKit::InjectedBundlePageLoaderClient::didCreateGlobalObjectForFrame):
(WebKit::InjectedBundlePageLoaderClient::willDisconnectDOMWindowExtensionFromGlobalObject):
(WebKit::InjectedBundlePageLoaderClient::didReconnectDOMWindowExtensionToGlobalObject):
(WebKit::InjectedBundlePageLoaderClient::willDestroyGlobalObjectForDOMWindowExtension):
* WebProcess/InjectedBundle/InjectedBundlePageLoaderClient.h:
(InjectedBundlePageLoaderClient):
Implement the 4 new callbacks from WebCore which notify the BundlePageLoaderClient:
* WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
(WebKit::WebFrameLoaderClient::dispatchGlobalObjectAvailable):
(WebKit::WebFrameLoaderClient::dispatchWillDisconnectDOMWindowExtensionFromGlobalObject):
(WebKit::WebFrameLoaderClient::dispatchDidReconnectDOMWindowExtensionToGlobalObject):
(WebKit::WebFrameLoaderClient::dispatchWillDestroyGlobalObjectForDOMWindowExtension):
* WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
Project Files:
* CMakeLists.txt:
* GNUmakefile.am:
* Target.pri:
* WebKit2.xcodeproj/project.pbxproj:
* win/WebKit2.vcproj:
2012-04-24 Andras Becsi <andras.becsi@nokia.com>
[Qt][WK2] Implement axis locking on the WebView for pan gestures
......@@ -816,6 +816,8 @@ webkit2_sources += \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleBackForwardListItem.cpp \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleBackForwardListItem.h \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundle.cpp \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.cpp \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.h \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFrame.h \
Source/WebKit2/WebProcess/InjectedBundle/API/c/WKBundleFramePrivate.h \
......@@ -855,6 +857,8 @@ webkit2_sources += \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleBackForwardListItem.h \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleClient.cpp \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleClient.h \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.cpp \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.h \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleHitTestResult.cpp \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleHitTestResult.h \
Source/WebKit2/WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp \
......
......@@ -116,6 +116,7 @@ typedef const struct OpaqueWKBundle* WKBundleRef;
typedef const struct OpaqueWKBundleBackForwardList* WKBundleBackForwardListRef;
typedef const struct OpaqueWKBundleBackForwardListItem* WKBundleBackForwardListItemRef;
typedef const struct OpaqueWKBundleDOMCSSStyleDeclaration* WKBundleCSSStyleDeclarationRef;
typedef const struct OpaqueWKBundleDOMWindowExtension* WKBundleDOMWindowExtensionRef;
typedef const struct OpaqueWKBundleFrame* WKBundleFrameRef;
typedef const struct OpaqueWKBundleHitTestResult* WKBundleHitTestResultRef;
typedef const struct OpaqueWKBundleInspector* WKBundleInspectorRef;
......
......@@ -26,6 +26,7 @@
#include "config.h"
#include "APIClientTraits.h"
#include "WKBundle.h"
#include "WKBundlePage.h"
namespace WebKit {
......
......@@ -106,6 +106,7 @@ public:
TypeBundle,
TypeBundleBackForwardList,
TypeBundleBackForwardListItem,
TypeBundleDOMWindowExtension,
TypeBundleFrame,
TypeBundleHitTestResult,
TypeBundleInspector,
......
......@@ -315,6 +315,7 @@ HEADERS += \
WebProcess/InjectedBundle/DOM/InjectedBundleRangeHandle.h \
WebProcess/InjectedBundle/InjectedBundle.h \
WebProcess/InjectedBundle/InjectedBundleClient.h \
WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.h \
WebProcess/InjectedBundle/InjectedBundleHitTestResult.h \
WebProcess/InjectedBundle/InjectedBundleNavigationAction.h \
WebProcess/InjectedBundle/InjectedBundlePageContextMenuClient.h \
......@@ -658,6 +659,7 @@ SOURCES += \
WebProcess/InjectedBundle/API/c/WKBundle.cpp \
WebProcess/InjectedBundle/API/c/WKBundleBackForwardList.cpp \
WebProcess/InjectedBundle/API/c/WKBundleBackForwardListItem.cpp \
WebProcess/InjectedBundle/API/c/WKBundleDOMWindowExtension.cpp \
WebProcess/InjectedBundle/API/c/WKBundleFrame.cpp \
WebProcess/InjectedBundle/API/c/WKBundleHitTestResult.cpp \
WebProcess/InjectedBundle/API/c/WKBundleInspector.cpp \
......@@ -673,6 +675,7 @@ SOURCES += \
WebProcess/InjectedBundle/InjectedBundleBackForwardList.cpp \
WebProcess/InjectedBundle/InjectedBundleBackForwardListItem.cpp \
WebProcess/InjectedBundle/InjectedBundleClient.cpp \
WebProcess/InjectedBundle/InjectedBundleDOMWindowExtension.cpp \
WebProcess/InjectedBundle/InjectedBundleHitTestResult.cpp \
WebProcess/InjectedBundle/InjectedBundleNavigationAction.cpp \
WebProcess/InjectedBundle/InjectedBundlePageContextMenuClient.cpp \
......
......@@ -434,6 +434,9 @@
51D130551382EAC000351EDD /* SecItemResponseData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51D130511382EAC000351EDD /* SecItemResponseData.cpp */; };
51D130561382EAC000351EDD /* SecItemResponseData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51D130521382EAC000351EDD /* SecItemResponseData.h */; };
51D130581382F10500351EDD /* WebProcessProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51D130571382F10500351EDD /* WebProcessProxyMac.mm */; };
51EFC1CF1524E62500C9A938 /* WKBundleDOMWindowExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 51FA2D541521118600C1BA0B /* WKBundleDOMWindowExtension.h */; settings = {ATTRIBUTES = (Private, ); }; };
51FA2D7415212DF100C1BA0B /* InjectedBundleDOMWindowExtension.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51FA2D5C15211A5000C1BA0B /* InjectedBundleDOMWindowExtension.cpp */; };
51FA2D7715212E2600C1BA0B /* WKBundleDOMWindowExtension.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51FA2D7515212E1E00C1BA0B /* WKBundleDOMWindowExtension.cpp */; };
5272B28A1406985D0096A5D0 /* StatisticsData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5272B2881406985D0096A5D0 /* StatisticsData.cpp */; };
5272B28B1406985D0096A5D0 /* StatisticsData.h in Headers */ = {isa = PBXBuildFile; fileRef = 5272B2891406985D0096A5D0 /* StatisticsData.h */; };
5D51845513BCF9CC00C7FF4A /* APIClientTraits.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5D51845313BCF9CC00C7FF4A /* APIClientTraits.cpp */; };
......@@ -1460,6 +1463,10 @@
51D130511382EAC000351EDD /* SecItemResponseData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SecItemResponseData.cpp; sourceTree = "<group>"; };
51D130521382EAC000351EDD /* SecItemResponseData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecItemResponseData.h; sourceTree = "<group>"; };
51D130571382F10500351EDD /* WebProcessProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebProcessProxyMac.mm; sourceTree = "<group>"; };
51FA2D541521118600C1BA0B /* WKBundleDOMWindowExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKBundleDOMWindowExtension.h; sourceTree = "<group>"; };
51FA2D5A15211A1E00C1BA0B /* InjectedBundleDOMWindowExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InjectedBundleDOMWindowExtension.h; sourceTree = "<group>"; };
51FA2D5C15211A5000C1BA0B /* InjectedBundleDOMWindowExtension.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundleDOMWindowExtension.cpp; sourceTree = "<group>"; };
51FA2D7515212E1E00C1BA0B /* WKBundleDOMWindowExtension.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKBundleDOMWindowExtension.cpp; sourceTree = "<group>"; };
5272B2881406985D0096A5D0 /* StatisticsData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StatisticsData.cpp; sourceTree = "<group>"; };
5272B2891406985D0096A5D0 /* StatisticsData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatisticsData.h; sourceTree = "<group>"; };
5D51845313BCF9CC00C7FF4A /* APIClientTraits.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = APIClientTraits.cpp; sourceTree = "<group>"; };
......@@ -3234,6 +3241,8 @@
935EEB921277615D003322B8 /* InjectedBundleBackForwardListItem.h */,
BCEE7DC4128B645D009827DA /* InjectedBundleClient.cpp */,
BCEE7DC3128B645D009827DA /* InjectedBundleClient.h */,
51FA2D5C15211A5000C1BA0B /* InjectedBundleDOMWindowExtension.cpp */,
51FA2D5A15211A1E00C1BA0B /* InjectedBundleDOMWindowExtension.h */,
BC498617124D10E200D834E1 /* InjectedBundleHitTestResult.cpp */,
BC498616124D10E200D834E1 /* InjectedBundleHitTestResult.h */,
BC8147D412F66D31007B2C32 /* InjectedBundleNavigationAction.cpp */,
......@@ -3287,6 +3296,8 @@
935EEB961277616D003322B8 /* WKBundleBackForwardList.h */,
935EEB971277616D003322B8 /* WKBundleBackForwardListItem.cpp */,
935EEB981277616D003322B8 /* WKBundleBackForwardListItem.h */,
51FA2D7515212E1E00C1BA0B /* WKBundleDOMWindowExtension.cpp */,
51FA2D541521118600C1BA0B /* WKBundleDOMWindowExtension.h */,
BCD25F1611D6BDE100169B0E /* WKBundleFrame.cpp */,
BCD25F1511D6BDE100169B0E /* WKBundleFrame.h */,
BCF049E411FE20F600F86A58 /* WKBundleFramePrivate.h */,
......@@ -4192,6 +4203,7 @@
37948409150C4B9700E52CE9 /* WKRenderLayer.h in Headers */