diff options
author | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-03 07:07:34 +0000 |
---|---|---|
committer | jorlow@chromium.org <jorlow@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-10-03 07:07:34 +0000 |
commit | b7c7bcf5e27134ea2077a3045772da1ae150fefa (patch) | |
tree | 14f2754390032972dd9d34eae249ac7701f5875c /webkit | |
parent | 75c91e64b82abaa843d9327f7b57cc9a0abe1696 (diff) | |
download | chromium_src-b7c7bcf5e27134ea2077a3045772da1ae150fefa.zip chromium_src-b7c7bcf5e27134ea2077a3045772da1ae150fefa.tar.gz chromium_src-b7c7bcf5e27134ea2077a3045772da1ae150fefa.tar.bz2 |
Another stab at the Chromium side of storage events. Re-submission of http://src.chromium.org/viewvc/chrome?view=rev&revision=27756 with slight changes in dom_storage_dispatch
er_host.cc
TBR=darin
TEST=Manually inspected that storage events fired. Will turn on more layout tests in a
subsequent patch.
BUG=19972
Original review URL: http://codereview.chromium.org/223013
Review URL: http://codereview.chromium.org/258010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27943 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/api/public/WebKitClient.h | 5 | ||||
-rw-r--r-- | webkit/api/public/WebStorageEventDispatcher.h | 54 | ||||
-rw-r--r-- | webkit/api/src/StorageEventDispatcherChromium.cpp | 3 | ||||
-rw-r--r-- | webkit/api/src/StorageEventDispatcherImpl.cpp | 82 | ||||
-rw-r--r-- | webkit/api/src/StorageEventDispatcherImpl.h | 60 | ||||
-rw-r--r-- | webkit/api/src/WebStorageEventDispatcherImpl.cpp | 64 | ||||
-rw-r--r-- | webkit/api/src/WebStorageEventDispatcherImpl.h | 59 | ||||
-rw-r--r-- | webkit/glue/webkitclient_impl.cc | 6 | ||||
-rw-r--r-- | webkit/glue/webkitclient_impl.h | 3 | ||||
-rw-r--r-- | webkit/glue/webview_impl.cc | 10 | ||||
-rw-r--r-- | webkit/webkit.gyp | 5 |
11 files changed, 346 insertions, 5 deletions
diff --git a/webkit/api/public/WebKitClient.h b/webkit/api/public/WebKitClient.h index 0e380048..6f2b3dd 100644 --- a/webkit/api/public/WebKitClient.h +++ b/webkit/api/public/WebKitClient.h @@ -89,6 +89,11 @@ namespace WebKit { // Return a new SessionStorage namespace. virtual WebStorageNamespace* createSessionStorageNamespace() = 0; + // Called when storage events fire. + virtual void dispatchStorageEvent(const WebString& key, const WebString& oldValue, + const WebString& newValue, const WebString& origin, + bool isLocalStorage) = 0; + // File ---------------------------------------------------------------- diff --git a/webkit/api/public/WebStorageEventDispatcher.h b/webkit/api/public/WebStorageEventDispatcher.h new file mode 100644 index 0000000..88d0ea9 --- /dev/null +++ b/webkit/api/public/WebStorageEventDispatcher.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2009 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 WebStorageEventDispatcher_h +#define WebStorageEventDispatcher_h + +#include "WebString.h" + +namespace WebKit { + + // This is used to dispatch storage events to all pages. + // FIXME: Make this (or something) work for SessionStorage! + class WebStorageEventDispatcher { + public: + static WebStorageEventDispatcher* create(); + + virtual ~WebStorageEventDispatcher() { } + + // Dispatch the actual event. Doesn't yet work for SessionStorage. + virtual void dispatchStorageEvent(const WebString& key, const WebString& oldValue, + const WebString& newValue, const WebString& origin, + bool isLocalStorage) = 0; + }; + +} // namespace WebKit + +#endif // WebStorageEventDispatcher_h diff --git a/webkit/api/src/StorageEventDispatcherChromium.cpp b/webkit/api/src/StorageEventDispatcherChromium.cpp index 8f0c61c..9c283cd 100644 --- a/webkit/api/src/StorageEventDispatcherChromium.cpp +++ b/webkit/api/src/StorageEventDispatcherChromium.cpp @@ -46,7 +46,8 @@ void StorageEventDispatcher::dispatch(const String& key, const String& oldValue, const String& newValue, StorageType storageType, SecurityOrigin* origin, Frame* sourceFrame) { - // FIXME: Implement. + ASSERT(!sourceFrame); // Sad, but true. + WebKit::webKitClient()->dispatchStorageEvent(key, oldValue, newValue, origin->toString(), storageType == LocalStorage); } } // namespace WebCore diff --git a/webkit/api/src/StorageEventDispatcherImpl.cpp b/webkit/api/src/StorageEventDispatcherImpl.cpp new file mode 100644 index 0000000..6916e0b --- /dev/null +++ b/webkit/api/src/StorageEventDispatcherImpl.cpp @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2009 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "StorageEventDispatcherImpl.h" + +#if ENABLE(DOM_STORAGE) + +#include "DOMWindow.h" +#include "EventNames.h" +#include "Frame.h" +#include "Page.h" +#include "PageGroup.h" +#include "SecurityOrigin.h" +#include "StorageEvent.h" + +namespace WebCore { + +StorageEventDispatcherImpl::StorageEventDispatcherImpl(const String& groupName) + : m_pageGroup(PageGroup::pageGroup(groupName)) +{ + ASSERT(m_pageGroup); +} + +void StorageEventDispatcherImpl::dispatchStorageEvent(const String& key, const String& oldValue, + const String& newValue, StorageType storageType, + SecurityOrigin* securityOrigin) +{ + // FIXME: Implement + if (storageType == SessionStorage) + return; + + // We need to copy all relevant frames from every page to a vector since sending the event to one frame might mutate the frame tree + // of any given page in the group or mutate the page group itself. + Vector<RefPtr<Frame> > frames; + + const HashSet<Page*>& pages = m_pageGroup->pages(); + HashSet<Page*>::const_iterator end = pages.end(); + for (HashSet<Page*>::const_iterator it = pages.begin(); it != end; ++it) { + for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext()) { + if (frame->document()->securityOrigin()->equal(securityOrigin)) + frames.append(frame); + } + } + + // FIXME: Figure out how to pass in the document URI. + for (unsigned i = 0; i < frames.size(); ++i) { + frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key,oldValue, newValue, + String(), 0, frames[i]->domWindow()->localStorage())); + } +} + +} // namespace WebCore + +#endif // ENABLE(DOM_STORAGE) diff --git a/webkit/api/src/StorageEventDispatcherImpl.h b/webkit/api/src/StorageEventDispatcherImpl.h new file mode 100644 index 0000000..e0f57e2 --- /dev/null +++ b/webkit/api/src/StorageEventDispatcherImpl.h @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2009 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 StorageEventDispatcherImpl_h +#define StorageEventDispatcherImpl_h + +#if ENABLE(DOM_STORAGE) + +#include "PlatformString.h" +#include "StorageArea.h" + +namespace WebCore { + + class PageGroup; + class SecurityOrigin; + + class StorageEventDispatcherImpl { + public: + StorageEventDispatcherImpl(const String& groupName); + + void dispatchStorageEvent(const String& key, const String& oldValue, + const String& newValue, StorageType, + SecurityOrigin*); + + private: + PageGroup* m_pageGroup; + }; + +} // namespace WebCore + +#endif // ENABLE(DOM_STORAGE) + +#endif // StorageEventDispatcherImpl_h diff --git a/webkit/api/src/WebStorageEventDispatcherImpl.cpp b/webkit/api/src/WebStorageEventDispatcherImpl.cpp new file mode 100644 index 0000000..a6da503 --- /dev/null +++ b/webkit/api/src/WebStorageEventDispatcherImpl.cpp @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2009 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 "WebStorageEventDispatcherImpl.h" + +#if ENABLE(DOM_STORAGE) + +#include "SecurityOrigin.h" + +extern const char* pageGroupName; + +namespace WebKit { + +WebStorageEventDispatcher* WebStorageEventDispatcher::create() +{ + return new WebStorageEventDispatcherImpl(); +} + +WebStorageEventDispatcherImpl::WebStorageEventDispatcherImpl() + : m_eventDispatcher(new WebCore::StorageEventDispatcherImpl(pageGroupName)) +{ + ASSERT(m_eventDispatcher); +} + +void WebStorageEventDispatcherImpl::dispatchStorageEvent(const WebString& key, const WebString& oldValue, + const WebString& newValue, const WebString& origin, + bool isLocalStorage) +{ + WebCore::StorageType storageType = isLocalStorage ? WebCore::LocalStorage : WebCore::SessionStorage; + RefPtr<WebCore::SecurityOrigin> securityOrigin = WebCore::SecurityOrigin::createFromString(origin); + m_eventDispatcher->dispatchStorageEvent(key, oldValue, newValue, storageType, securityOrigin.get()); +} + +} // namespace WebKit + +#endif // ENABLE(DOM_STORAGE) diff --git a/webkit/api/src/WebStorageEventDispatcherImpl.h b/webkit/api/src/WebStorageEventDispatcherImpl.h new file mode 100644 index 0000000..464c4f3 --- /dev/null +++ b/webkit/api/src/WebStorageEventDispatcherImpl.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2009 Google 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: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * 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. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT + * OWNER 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 WebStorageEventDispatcherImpl_h +#define WebStorageEventDispatcherImpl_h + +#if ENABLE(DOM_STORAGE) + +#include "StorageEventDispatcherImpl.h" +#include <wtf/OwnPtr.h> + +#include "WebStorageEventDispatcher.h" + +namespace WebKit { + + class WebStorageEventDispatcherImpl : public WebStorageEventDispatcher { + public: + WebStorageEventDispatcherImpl(); + + virtual void dispatchStorageEvent(const WebString& key, const WebString& oldValue, + const WebString& newValue, const WebString& origin, + bool isLocalStorage); + + private: + OwnPtr<WebCore::StorageEventDispatcherImpl> m_eventDispatcher; + }; + +} // namespace WebKit + +#endif // ENABLE(DOM_STORAGE) + +#endif // WebStorageEventDispatcherImpl_h diff --git a/webkit/glue/webkitclient_impl.cc b/webkit/glue/webkitclient_impl.cc index ed7efa1..1639683 100644 --- a/webkit/glue/webkitclient_impl.cc +++ b/webkit/glue/webkitclient_impl.cc @@ -284,6 +284,12 @@ void WebKitClientImpl::callOnMainThread(void (*func)()) { main_loop_->PostTask(FROM_HERE, NewRunnableFunction(func)); } +void WebKitClientImpl::dispatchStorageEvent(const WebString& key, + const WebString& oldValue, const WebString& newValue, + const WebString& origin, bool isLocalStorage) { + NOTREACHED(); +} + base::PlatformFile WebKitClientImpl::databaseOpenFile( const WebKit::WebString& file_name, int desired_flags, base::PlatformFile* dir_handle) { diff --git a/webkit/glue/webkitclient_impl.h b/webkit/glue/webkitclient_impl.h index d10f8d4..45352c6 100644 --- a/webkit/glue/webkitclient_impl.h +++ b/webkit/glue/webkitclient_impl.h @@ -39,6 +39,9 @@ class WebKitClientImpl : public WebKit::WebKitClient { virtual void stopSharedTimer(); virtual void callOnMainThread(void (*func)()); virtual void suddenTerminationChanged(bool enabled) { } + virtual void dispatchStorageEvent(const WebKit::WebString& key, + const WebKit::WebString& oldValue, const WebKit::WebString& newValue, + const WebKit::WebString& origin, bool isLocalStorage); virtual base::PlatformFile databaseOpenFile( const WebKit::WebString& file_name, int desired_flags, diff --git a/webkit/glue/webview_impl.cc b/webkit/glue/webview_impl.cc index 8774069..945bfbc 100644 --- a/webkit/glue/webview_impl.cc +++ b/webkit/glue/webview_impl.cc @@ -132,7 +132,9 @@ static const double kMaxTextSizeMultiplier = 3.0; // for some programs that use HTML views to display things that don't seem like // web pages to the user (so shouldn't have visited link coloring). We only use // one page group. -static const char* kPageGroupName = "default"; +// FIXME: This needs to go into the WebKit API implementation and be hidden +// from the API's users. +const char* pageGroupName = "default"; // Ensure that the WebKit::WebDragOperation enum values stay in sync with // the original WebCore::DragOperation constants. @@ -362,13 +364,13 @@ void WebViewImpl::initializeMainFrame(WebFrameClient* frame_client) { // static void WebView::UpdateVisitedLinkState(uint64 link_hash) { WebCore::Page::visitedStateChanged( - WebCore::PageGroup::pageGroup(kPageGroupName), link_hash); + WebCore::PageGroup::pageGroup(pageGroupName), link_hash); } // static void WebView::ResetVisitedLinkState() { WebCore::Page::allVisitedStateChanged( - WebCore::PageGroup::pageGroup(kPageGroupName)); + WebCore::PageGroup::pageGroup(pageGroupName)); } WebViewImpl::WebViewImpl(WebViewDelegate* delegate) @@ -414,7 +416,7 @@ WebViewImpl::WebViewImpl(WebViewDelegate* delegate) NULL)); page_->backForwardList()->setClient(&back_forward_list_client_impl_); - page_->setGroupName(kPageGroupName); + page_->setGroupName(pageGroupName); } WebViewImpl::~WebViewImpl() { diff --git a/webkit/webkit.gyp b/webkit/webkit.gyp index 5a84cc8..fda736f 100644 --- a/webkit/webkit.gyp +++ b/webkit/webkit.gyp @@ -107,6 +107,7 @@ 'api/public/WebSettings.h', 'api/public/WebSize.h', 'api/public/WebStorageArea.h', + 'api/public/WebStorageEventDispatcher.h', 'api/public/WebStorageNamespace.h', 'api/public/WebString.h', 'api/public/WebTextAffinity.h', @@ -151,6 +152,8 @@ 'api/src/StorageAreaProxy.cpp', 'api/src/StorageAreaProxy.h', 'api/src/StorageEventDispatcherChromium.cpp', + 'api/src/StorageEventDispatcherImpl.cpp', + 'api/src/StorageEventDispatcherImpl.h', 'api/src/StorageNamespaceProxy.cpp', 'api/src/StorageNamespaceProxy.h', 'api/src/TemporaryGlue.h', @@ -188,6 +191,8 @@ 'api/src/WebSettingsImpl.h', 'api/src/WebStorageAreaImpl.cpp', 'api/src/WebStorageAreaImpl.h', + 'api/src/WebStorageEventDispatcherImpl.cpp', + 'api/src/WebStorageEventDispatcherImpl.h', 'api/src/WebStorageNamespaceImpl.cpp', 'api/src/WebStorageNamespaceImpl.h', 'api/src/WebString.cpp', |