Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(986)

Unified Diff: loader/appcache2/ApplicationCacheFrontend.cpp

Issue 113554: For local review prior to sending to webkit (Closed) Base URL: http://svn.webkit.org/repository/webkit/trunk/WebCore/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « loader/appcache2/ApplicationCacheFrontend.h ('k') | loader/appcache2/DOMApplicationCache.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: loader/appcache2/ApplicationCacheFrontend.cpp
===================================================================
--- loader/appcache2/ApplicationCacheFrontend.cpp (revision 0)
+++ loader/appcache2/ApplicationCacheFrontend.cpp (revision 0)
@@ -0,0 +1,237 @@
+/*
+ * 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 "ApplicationCacheFrontend.h"
+
+#if ENABLE(APPLICATION_CACHE)
+
+#include "ApplicationCacheBridge.h"
+#include "DOMApplicationCache.h"
+#include "Frame.h"
+#include "ResourceRequest.h"
+#include <wtf/HashMap.h>
+#include <wtf/StdLibExtras.h>
+#include <wtf/Threading.h>
+
+namespace WebCore {
+
+// We keep a collection of all frontend instances for lookup by contextID.
+
+typedef HashMap<int, ApplicationCacheFrontend*> FrontendsMap;
+
+static FrontendsMap& frontends()
+{
+ DEFINE_STATIC_LOCAL(FrontendsMap, staticFrontends, ());
+ return staticFrontends;
+}
+
+
+// static
+void ApplicationCacheFrontend::addToMap(ApplicationCacheFrontend* frontend)
+{
+ frontends().add(frontend->contextID().m_contextID, frontend);
+}
+
+// static
+void ApplicationCacheFrontend::removeFromMap(ApplicationCacheFrontend* frontend)
+{
+ frontends().remove(frontend->contextID().m_contextID);
+}
+
+// static
+ApplicationCacheFrontend* ApplicationCacheFrontend::fromContextID(const GlobalApplicationCacheContextID &contextID)
+{
+ ApplicationCacheFrontend* frontend = frontends().get(contextID.m_contextID);
+ return frontend;
+}
+
+ApplicationCacheFrontend::ApplicationCacheFrontend()
+ : m_contextType(MainFrameContext)
+ , m_DOMApplicationCache(0)
+ , m_canCacheInPageCache(false)
+ , m_isSelectInProgress(false)
+ , m_cacheSequenceNumber(0)
+ , m_hasCachedStatus(false)
+ , m_cachedStatus(APPCACHE_UNCACHED)
+ , m_bridge(ApplicationCacheBridge::instance())
+{
+ ASSERT(m_bridge);
+}
+
+ApplicationCacheFrontend::~ApplicationCacheFrontend()
+{
+ if (isInitialized()) {
+ m_bridge->uninitializeContextAsync(contextID());
+ removeFromMap(this);
+ }
+}
+
+void ApplicationCacheFrontend::initializeForFrame(Frame* frame)
+{
+ ASSERT(frame);
+ ApplicationCacheContextType contextType = MainFrameContext;
+ GlobalApplicationCacheContextID parentContextID = GlobalApplicationCacheContextID::none();
+ if (Frame* parentFrame = frame->parentFrame()) {
+ contextType = SubFrameContext;
+ parentContextID = parentFrame->loader()->appcacheFrontend()->contextID();
+ }
+ initialize(contextType, parentContextID);
+}
+
+void ApplicationCacheFrontend::initialize(ApplicationCacheContextType contextType,
+ const GlobalApplicationCacheContextID& parentContextID)
+{
+ ASSERT(!isInitialized());
+ DEFINE_STATIC_LOCAL(int, nextID, (1));
+ // FIXME: set the processID data member of GlobalApplicationCacheContextID
+ m_contextID = GlobalApplicationCacheContextID(nextID++, 0);
+ m_contextType = contextType;
+ addToMap(this);
+ m_bridge->initializeContextAsync(contextID(), contextType, parentContextID);
+}
+
+int ApplicationCacheFrontend::prepareForSelectCall()
+{
+ m_isSelectInProgress = true;
+ m_hasCachedStatus = false;
+ return ++m_cacheSequenceNumber;
+}
+
+void ApplicationCacheFrontend::selectInitialCache(const KURL& documentURL,
+ ApplicationCacheID cacheDocumentWasLoadedFrom)
+{
+ if (!isInitialized())
+ return;
+ m_canCacheInPageCache = cacheDocumentWasLoadedFrom == NoApplicationCacheID;
+ m_bridge->selectInitialCacheAsync(contextID(),
+ prepareForSelectCall(),
+ documentURL,
+ cacheDocumentWasLoadedFrom);
+}
+
+void ApplicationCacheFrontend::selectCacheWithoutManifest(
+ const KURL& documentURL,
+ ApplicationCacheID cacheDocumentWasLoadedFrom)
+{
+ if (!isInitialized())
+ return;
+ m_canCacheInPageCache = cacheDocumentWasLoadedFrom == NoApplicationCacheID;
+ m_bridge->selectCacheWithoutManifestAsync(contextID(),
+ prepareForSelectCall(),
+ documentURL,
+ cacheDocumentWasLoadedFrom);
+}
+
+bool ApplicationCacheFrontend::selectCacheWithManifest(
+ const KURL& documentURL,
+ ApplicationCacheID cacheDocumentWasLoadedFrom,
+ const KURL& manifestURLofCacheDocumentWasLoadedFrom,
+ const KURL& manifestURL)
+{
+ if (!isInitialized())
+ return true;
+
+ m_canCacheInPageCache = false;
+ m_bridge->selectCacheWithManifestAsync(contextID(),
+ prepareForSelectCall(),
+ documentURL,
+ cacheDocumentWasLoadedFrom,
+ manifestURLofCacheDocumentWasLoadedFrom,
+ manifestURL);
+
+ // Check for a foreign entriy and restart the current navigation if detected,
+ // the foreign entry will not be picked up on reload.
+ if ((cacheDocumentWasLoadedFrom != NoApplicationCacheID)
+ && (manifestURL != manifestURLofCacheDocumentWasLoadedFrom))
+ return false;
+
+ return true;
+}
+
+void ApplicationCacheFrontend::addExtraFieldsToRequest(ResourceRequest& request, bool mainResource)
+{
+ ASSERT(isInitialized());
+ request.setApplicationCacheContextID(contextID());
+}
+
+bool ApplicationCacheFrontend::canCacheCurrentDocumentInPageCache() const
+{
+ return m_canCacheInPageCache;
+}
+
+ApplicationCacheStatus ApplicationCacheFrontend::status() const
+{
+ ASSERT(isInitialized());
+ if (!m_hasCachedStatus) {
+ ASSERT(m_isSelectInProgress);
+ m_cachedStatus = m_bridge->status(contextID());
+ m_hasCachedStatus = true;
+ }
+ return m_cachedStatus;
+}
+
+bool ApplicationCacheFrontend::update()
+{
+ ASSERT(isInitialized());
+ return m_bridge->startUpdate(contextID());
+}
+
+bool ApplicationCacheFrontend::swapCache()
+{
+ ASSERT(isInitialized());
+ return m_bridge->swapCache(contextID());
+}
+
+void ApplicationCacheFrontend::notifySelectComplete(ApplicationCacheStatus status)
+{
+ ASSERT(m_isSelectInProgress);
+ m_isSelectInProgress = false;
+ if (!m_hasCachedStatus) {
+ m_cachedStatus = status;
+ m_hasCachedStatus = true;
+ }
+}
+
+void ApplicationCacheFrontend::notifyStatusChanged(ApplicationCacheStatus status)
+{
+ ASSERT(m_hasCachedStatus);
+ m_cachedStatus = status;
+}
+
+void ApplicationCacheFrontend::notifyEventListener(ApplicationCacheEventType eventType)
+{
+ if (!m_isSelectInProgress && m_DOMApplicationCache)
+ m_DOMApplicationCache->callEventListener(eventType);
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(APPLICATION_CACHE)
Property changes on: loader\appcache2\ApplicationCacheFrontend.cpp
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « loader/appcache2/ApplicationCacheFrontend.h ('k') | loader/appcache2/DOMApplicationCache.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698