[WTF] Add makeUnique<T>, which ensures T is fast-allocated, makeUnique / makeUniqueWi...
[WebKit-https.git] / Source / WebCore / page / PageGroup.cpp
index 782da0f..128c18f 100644 (file)
 #include "config.h"
 #include "PageGroup.h"
 
-#include "Chrome.h"
-#include "ChromeClient.h"
+#include "DOMWrapperWorld.h"
 #include "Document.h"
-#include "DocumentStyleSheetCollection.h"
 #include "Frame.h"
-#include "GroupSettings.h"
 #include "Page.h"
 #include "PageCache.h"
-#include "SecurityOrigin.h"
-#include "Settings.h"
 #include "StorageNamespace.h"
+#include <JavaScriptCore/HeapInlines.h>
+#include <JavaScriptCore/StructureInlines.h>
+#include <wtf/StdLibExtras.h>
 
 #if ENABLE(VIDEO_TRACK)
-#if PLATFORM(MAC) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
-#include "CaptionUserPreferencesMac.h"
+#if PLATFORM(MAC) || HAVE(MEDIA_ACCESSIBILITY_FRAMEWORK)
+#include "CaptionUserPreferencesMediaAF.h"
 #else
 #include "CaptionUserPreferences.h"
 #endif
 #endif
 
-#if PLATFORM(CHROMIUM)
-#include "VisitedLinks.h"
-#endif
-
 namespace WebCore {
 
 static unsigned getUniqueIdentifier()
@@ -60,37 +54,22 @@ static unsigned getUniqueIdentifier()
 
 // --------
 
-static bool shouldTrackVisitedLinks = false;
-
 PageGroup::PageGroup(const String& name)
     : m_name(name)
-    , m_visitedLinksPopulated(false)
     , m_identifier(getUniqueIdentifier())
-    , m_groupSettings(GroupSettings::create())
 {
 }
 
-PageGroup::PageGroup(Page* page)
-    : m_visitedLinksPopulated(false)
-    , m_identifier(getUniqueIdentifier())
-    , m_groupSettings(GroupSettings::create())
+PageGroup::PageGroup(Page& page)
+    : m_identifier(getUniqueIdentifier())
 {
-    ASSERT(page);
     addPage(page);
 }
 
-PageGroup::~PageGroup()
-{
-    removeAllUserContent();
-}
-
-PassOwnPtr<PageGroup> PageGroup::create(Page* page)
-{
-    return adoptPtr(new PageGroup(page));
-}
+PageGroup::~PageGroup() = default;
 
 typedef HashMap<String, PageGroup*> PageGroupMap;
-static PageGroupMap* pageGroups = 0;
+static PageGroupMap* pageGroups = nullptr;
 
 PageGroup* PageGroup::pageGroup(const String& groupName)
 {
@@ -99,7 +78,7 @@ PageGroup* PageGroup::pageGroup(const String& groupName)
     if (!pageGroups)
         pageGroups = new PageGroupMap;
 
-    PageGroupMap::AddResult result = pageGroups->add(groupName, 0);
+    PageGroupMap::AddResult result = pageGroups->add(groupName, nullptr);
 
     if (result.isNewEntry) {
         ASSERT(!result.iterator->value);
@@ -110,352 +89,52 @@ PageGroup* PageGroup::pageGroup(const String& groupName)
     return result.iterator->value;
 }
 
-void PageGroup::closeLocalStorage()
-{
-    if (!pageGroups)
-        return;
-
-    PageGroupMap::iterator end = pageGroups->end();
-
-    for (PageGroupMap::iterator it = pageGroups->begin(); it != end; ++it) {
-        if (it->value->hasLocalStorage())
-            it->value->localStorage()->close();
-    }
-}
-
-void PageGroup::clearLocalStorageForAllOrigins()
-{
-    if (!pageGroups)
-        return;
-
-    PageGroupMap::iterator end = pageGroups->end();
-    for (PageGroupMap::iterator it = pageGroups->begin(); it != end; ++it) {
-        if (it->value->hasLocalStorage())
-            it->value->localStorage()->clearAllOriginsForDeletion();
-    }
-}
-
-void PageGroup::clearLocalStorageForOrigin(SecurityOrigin* origin)
-{
-    if (!pageGroups)
-        return;
-
-    PageGroupMap::iterator end = pageGroups->end();
-    for (PageGroupMap::iterator it = pageGroups->begin(); it != end; ++it) {
-        if (it->value->hasLocalStorage())
-            it->value->localStorage()->clearOriginForDeletion(origin);
-    }
-}
-
-void PageGroup::closeIdleLocalStorageDatabases()
-{
-    if (!pageGroups)
-        return;
-
-    PageGroupMap::iterator end = pageGroups->end();
-    for (PageGroupMap::iterator it = pageGroups->begin(); it != end; ++it) {
-        if (it->value->hasLocalStorage())
-            it->value->localStorage()->closeIdleLocalStorageDatabases();
-    }
-}
-
-void PageGroup::syncLocalStorage()
-{
-    if (!pageGroups)
-        return;
-
-    PageGroupMap::iterator end = pageGroups->end();
-    for (PageGroupMap::iterator it = pageGroups->begin(); it != end; ++it) {
-        if (it->value->hasLocalStorage())
-            it->value->localStorage()->sync();
-    }
-}
-
-unsigned PageGroup::numberOfPageGroups()
+void PageGroup::addPage(Page& page)
 {
-    if (!pageGroups)
-        return 0;
-
-    return pageGroups->size();
+    ASSERT(!m_pages.contains(&page));
+    m_pages.add(&page);
+    
+    if (m_isLegacyPrivateBrowsingEnabledForTesting)
+        page.enableLegacyPrivateBrowsing(true);
 }
 
-void PageGroup::addPage(Page* page)
+void PageGroup::removePage(Page& page)
 {
-    ASSERT(page);
-    ASSERT(!m_pages.contains(page));
-    m_pages.add(page);
+    ASSERT(m_pages.contains(&page));
+    m_pages.remove(&page);
 }
 
-void PageGroup::removePage(Page* page)
+#if ENABLE(VIDEO_TRACK)
+void PageGroup::captionPreferencesChanged()
 {
-    ASSERT(page);
-    ASSERT(m_pages.contains(page));
-    m_pages.remove(page);
+    for (auto& page : m_pages)
+        page->captionPreferencesChanged();
+    PageCache::singleton().markPagesForCaptionPreferencesChanged();
 }
 
-bool PageGroup::isLinkVisited(LinkHash visitedLinkHash)
+CaptionUserPreferences& PageGroup::captionPreferences()
 {
-#if PLATFORM(CHROMIUM)
-    // Use Chromium's built-in visited link database.
-    return VisitedLinks::isLinkVisited(visitedLinkHash);
+    if (!m_captionPreferences) {
+#if PLATFORM(MAC) || HAVE(MEDIA_ACCESSIBILITY_FRAMEWORK)
+        m_captionPreferences = makeUnique<CaptionUserPreferencesMediaAF>(*this);
 #else
-    if (!m_visitedLinksPopulated) {
-        m_visitedLinksPopulated = true;
-        ASSERT(!m_pages.isEmpty());
-        (*m_pages.begin())->chrome()->client()->populateVisitedLinks();
-    }
-    return m_visitedLinkHashes.contains(visitedLinkHash);
-#endif
-}
-
-void PageGroup::addVisitedLinkHash(LinkHash hash)
-{
-    if (shouldTrackVisitedLinks)
-        addVisitedLink(hash);
-}
-
-inline void PageGroup::addVisitedLink(LinkHash hash)
-{
-    ASSERT(shouldTrackVisitedLinks);
-#if !PLATFORM(CHROMIUM)
-    if (!m_visitedLinkHashes.add(hash).isNewEntry)
-        return;
+        m_captionPreferences = makeUnique<CaptionUserPreferences>(*this);
 #endif
-    Page::visitedStateChanged(this, hash);
-    pageCache()->markPagesForVistedLinkStyleRecalc();
-}
-
-void PageGroup::addVisitedLink(const KURL& url)
-{
-    if (!shouldTrackVisitedLinks)
-        return;
-    ASSERT(!url.isEmpty());
-    addVisitedLink(visitedLinkHash(url.string()));
-}
-
-void PageGroup::addVisitedLink(const UChar* characters, size_t length)
-{
-    if (!shouldTrackVisitedLinks)
-        return;
-    addVisitedLink(visitedLinkHash(characters, length));
-}
-
-void PageGroup::removeVisitedLinks()
-{
-    m_visitedLinksPopulated = false;
-    if (m_visitedLinkHashes.isEmpty())
-        return;
-    m_visitedLinkHashes.clear();
-    Page::allVisitedStateChanged(this);
-    pageCache()->markPagesForVistedLinkStyleRecalc();
-}
-
-void PageGroup::removeAllVisitedLinks()
-{
-    Page::removeAllVisitedLinks();
-    pageCache()->markPagesForVistedLinkStyleRecalc();
-}
-
-void PageGroup::setShouldTrackVisitedLinks(bool shouldTrack)
-{
-    if (shouldTrackVisitedLinks == shouldTrack)
-        return;
-    shouldTrackVisitedLinks = shouldTrack;
-    if (!shouldTrackVisitedLinks)
-        removeAllVisitedLinks();
-}
-
-StorageNamespace* PageGroup::localStorage()
-{
-    if (!m_localStorage) {
-        // Need a page in this page group to query the settings for the local storage database path.
-        // Having these parameters attached to the page settings is unfortunate since these settings are
-        // not per-page (and, in fact, we simply grab the settings from some page at random), but
-        // at this point we're stuck with it.
-        Page* page = *m_pages.begin();
-        const String& path = page->settings()->localStorageDatabasePath();
-        unsigned quota = m_groupSettings->localStorageQuotaBytes();
-        m_localStorage = StorageNamespace::localStorageNamespace(path, quota);
-    }
-
-    return m_localStorage.get();
-}
-
-void PageGroup::addUserScriptToWorld(DOMWrapperWorld* world, const String& source, const KURL& url,
-                                     const Vector<String>& whitelist, const Vector<String>& blacklist,
-                                     UserScriptInjectionTime injectionTime, UserContentInjectedFrames injectedFrames)
-{
-    ASSERT_ARG(world, world);
-
-    OwnPtr<UserScript> userScript = adoptPtr(new UserScript(source, url, whitelist, blacklist, injectionTime, injectedFrames));
-    if (!m_userScripts)
-        m_userScripts = adoptPtr(new UserScriptMap);
-    OwnPtr<UserScriptVector>& scriptsInWorld = m_userScripts->add(world, nullptr).iterator->value;
-    if (!scriptsInWorld)
-        scriptsInWorld = adoptPtr(new UserScriptVector);
-    scriptsInWorld->append(userScript.release());
-}
-
-void PageGroup::addUserStyleSheetToWorld(DOMWrapperWorld* world, const String& source, const KURL& url,
-                                         const Vector<String>& whitelist, const Vector<String>& blacklist,
-                                         UserContentInjectedFrames injectedFrames,
-                                         UserStyleLevel level,
-                                         UserStyleInjectionTime injectionTime)
-{
-    ASSERT_ARG(world, world);
-
-    OwnPtr<UserStyleSheet> userStyleSheet = adoptPtr(new UserStyleSheet(source, url, whitelist, blacklist, injectedFrames, level));
-    if (!m_userStyleSheets)
-        m_userStyleSheets = adoptPtr(new UserStyleSheetMap);
-    OwnPtr<UserStyleSheetVector>& styleSheetsInWorld = m_userStyleSheets->add(world, nullptr).iterator->value;
-    if (!styleSheetsInWorld)
-        styleSheetsInWorld = adoptPtr(new UserStyleSheetVector);
-    styleSheetsInWorld->append(userStyleSheet.release());
-
-    if (injectionTime == InjectInExistingDocuments)
-        invalidatedInjectedStyleSheetCacheInAllFrames();
-}
-
-void PageGroup::removeUserScriptFromWorld(DOMWrapperWorld* world, const KURL& url)
-{
-    ASSERT_ARG(world, world);
-
-    if (!m_userScripts)
-        return;
-
-    UserScriptMap::iterator it = m_userScripts->find(world);
-    if (it == m_userScripts->end())
-        return;
-    
-    UserScriptVector* scripts = it->value.get();
-    for (int i = scripts->size() - 1; i >= 0; --i) {
-        if (scripts->at(i)->url() == url)
-            scripts->remove(i);
-    }
-    
-    if (scripts->isEmpty())
-        m_userScripts->remove(it);
-}
-
-void PageGroup::removeUserStyleSheetFromWorld(DOMWrapperWorld* world, const KURL& url)
-{
-    ASSERT_ARG(world, world);
-
-    if (!m_userStyleSheets)
-        return;
-
-    UserStyleSheetMap::iterator it = m_userStyleSheets->find(world);
-    bool sheetsChanged = false;
-    if (it == m_userStyleSheets->end())
-        return;
-    
-    UserStyleSheetVector* stylesheets = it->value.get();
-    for (int i = stylesheets->size() - 1; i >= 0; --i) {
-        if (stylesheets->at(i)->url() == url) {
-            stylesheets->remove(i);
-            sheetsChanged = true;
-        }
-    }
-        
-    if (!sheetsChanged)
-        return;
-
-    if (stylesheets->isEmpty())
-        m_userStyleSheets->remove(it);
-
-    invalidatedInjectedStyleSheetCacheInAllFrames();
-}
-
-void PageGroup::removeUserScriptsFromWorld(DOMWrapperWorld* world)
-{
-    ASSERT_ARG(world, world);
-
-    if (!m_userScripts)
-        return;
-
-    UserScriptMap::iterator it = m_userScripts->find(world);
-    if (it == m_userScripts->end())
-        return;
-       
-    m_userScripts->remove(it);
-}
-
-void PageGroup::removeUserStyleSheetsFromWorld(DOMWrapperWorld* world)
-{
-    ASSERT_ARG(world, world);
-
-    if (!m_userStyleSheets)
-        return;
-    
-    UserStyleSheetMap::iterator it = m_userStyleSheets->find(world);
-    if (it == m_userStyleSheets->end())
-        return;
-    
-    m_userStyleSheets->remove(it);
-
-    invalidatedInjectedStyleSheetCacheInAllFrames();
-}
-
-void PageGroup::removeAllUserContent()
-{
-    m_userScripts.clear();
-
-    if (m_userStyleSheets) {
-        m_userStyleSheets.clear();
-        invalidatedInjectedStyleSheetCacheInAllFrames();
     }
-}
 
-void PageGroup::invalidatedInjectedStyleSheetCacheInAllFrames()
-{
-    // Clear our cached sheets and have them just reparse.
-    HashSet<Page*>::const_iterator end = m_pages.end();
-    for (HashSet<Page*>::const_iterator it = m_pages.begin(); it != end; ++it) {
-        for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext())
-            frame->document()->styleSheetCollection()->invalidateInjectedStyleSheetCache();
-    }
+    return *m_captionPreferences.get();
 }
-
-#if ENABLE(VIDEO_TRACK)
-CaptionUserPreferences* PageGroup::captionPreferences()
-{
-    if (!m_captionPreferences)
-#if PLATFORM(MAC) && MAC_OS_X_VERSION_MIN_REQUIRED >= 1090
-        m_captionPreferences = CaptionUserPreferencesMac::create(this);
-#else
-        m_captionPreferences = CaptionUserPreferences::create(this);
 #endif
 
-    return m_captionPreferences.get();
-}
-    
-void PageGroup::registerForCaptionPreferencesChangedCallbacks(CaptionPreferencesChangedListener* listener)
-{
-    captionPreferences()->registerForCaptionPreferencesChangedCallbacks(listener);
-}
-
-void PageGroup::unregisterForCaptionPreferencesChangedCallbacks(CaptionPreferencesChangedListener* listener)
+void PageGroup::enableLegacyPrivateBrowsingForTesting(bool enabled)
 {
-    if (!m_captionPreferences)
+    if (m_isLegacyPrivateBrowsingEnabledForTesting == enabled)
         return;
-    captionPreferences()->unregisterForCaptionPreferencesChangedCallbacks(listener);
-}
-    
-bool PageGroup::userPrefersCaptions()
-{
-    return captionPreferences()->userPrefersCaptions();
-}
-
-bool PageGroup::userHasCaptionPreferences()
-{
-    return captionPreferences()->userPrefersCaptions();
-}
 
-float PageGroup::captionFontSizeScale(bool& important)
-{
-    return captionPreferences()->captionFontSizeScale(important);
+    m_isLegacyPrivateBrowsingEnabledForTesting = enabled;
+    
+    for (auto* page : m_pages)
+        page->enableLegacyPrivateBrowsing(enabled);
 }
 
-#endif
-
 } // namespace WebCore