Changeset 207218 in webkit


Ignore:
Timestamp:
Oct 12, 2016 9:36:11 AM (7 years ago)
Author:
pvollan@apple.com
Message:

[Win] Parallel DRTs are sharing preferences and cache.
https://bugs.webkit.org/show_bug.cgi?id=163013

Reviewed by Brent Fulgham.

Source/WebKit/win:

Make it possible for a WebKit client to use separate preferences and cache.

  • Interfaces/IWebPreferencesPrivate.idl:
  • WebApplicationCache.cpp:

(applicationCachePath):

  • WebCache.cpp:

(WebCache::cacheFolder):
(WebCache::setCacheFolder):

  • WebDatabaseManager.cpp:

(databasesDirectory):

  • WebPreferences.cpp:

(WebPreferences::applicationId):
(WebPreferences::valueForKey):
(WebPreferences::setValueForKey):
(WebPreferences::save):
(WebPreferences::QueryInterface):
(WebPreferences::modernMediaControlsEnabled):
(WebPreferences::setApplicationId):

  • WebPreferences.h:
  • WebView.cpp:

(WebView::setCacheModel):

Tools:

Use separate cache and preferences for each DRT instance.

  • DumpRenderTree/win/DumpRenderTree.cpp:

(applicationId):
(setApplicationId):
(setCacheFolder):
(setDefaultsToConsistentValuesForTesting):

  • Scripts/webkitpy/port/win.py:

(WinPort.setup_test_run):

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/win/ChangeLog

    r207151 r207218  
     12016-10-12  Per Arne Vollan  <pvollan@apple.com>
     2
     3        [Win] Parallel DRTs are sharing preferences and cache.
     4        https://bugs.webkit.org/show_bug.cgi?id=163013
     5
     6        Reviewed by Brent Fulgham.
     7
     8        Make it possible for a WebKit client to use separate preferences and cache.
     9
     10        * Interfaces/IWebPreferencesPrivate.idl:
     11        * WebApplicationCache.cpp:
     12        (applicationCachePath):
     13        * WebCache.cpp:
     14        (WebCache::cacheFolder):
     15        (WebCache::setCacheFolder):
     16        * WebDatabaseManager.cpp:
     17        (databasesDirectory):
     18        * WebPreferences.cpp:
     19        (WebPreferences::applicationId):
     20        (WebPreferences::valueForKey):
     21        (WebPreferences::setValueForKey):
     22        (WebPreferences::save):
     23        (WebPreferences::QueryInterface):
     24        (WebPreferences::modernMediaControlsEnabled):
     25        (WebPreferences::setApplicationId):
     26        * WebPreferences.h:
     27        * WebView.cpp:
     28        (WebView::setCacheModel):
     29
    1302016-10-11  Alex Christensen  <achristensen@webkit.org>
    231
  • trunk/Source/WebKit/win/Interfaces/IWebPreferencesPrivate.idl

    r207144 r207218  
    188188}
    189189
     190[uuid(F9582D72-6348-45B1-AB09-39E33459B5B9)]
     191interface IWebPreferencesPrivate4 : IWebPreferencesPrivate3
     192{
     193    HRESULT setApplicationId([in] BSTR applicationId);
     194}
  • trunk/Source/WebKit/win/WebApplicationCache.cpp

    r207144 r207218  
    2929#include "CFDictionaryPropertyBag.h"
    3030#include "MarshallingHelpers.h"
     31#include "WebPreferences.h"
    3132#include "WebSecurityOrigin.h"
    3233#include <wtf/RetainPtr.h>
     
    6970
    7071#if USE(CF)
    71     auto cacheDirectoryPreference = adoptCF(CFPreferencesCopyAppValue(WebKitLocalCacheDefaultsKey, kCFPreferencesCurrentApplication));
     72    auto cacheDirectoryPreference = adoptCF(CFPreferencesCopyAppValue(WebKitLocalCacheDefaultsKey, WebPreferences::applicationId()));
    7273    if (cacheDirectoryPreference && CFStringGetTypeID() == CFGetTypeID(cacheDirectoryPreference.get()))
    7374        path = static_cast<CFStringRef>(cacheDirectoryPreference.get());
  • trunk/Source/WebKit/win/WebCache.cpp

    r207144 r207218  
    3636#if USE(CURL)
    3737#include <WebCore/CurlCacheManager.h>
    38 #endif
     38#elif USE(CFNETWORK)
     39#include <CFNetwork/CFURLCachePriv.h>
     40#include <WebKitSystemInterface/WebKitSystemInterface.h>
     41#endif
     42
     43using namespace WebCore;
    3944
    4045// WebCache ---------------------------------------------------------------------------
     
    244249    *location = WebCore::BString(cacheFolder).release();
    245250    return S_OK;
    246 #else
    247     return E_NOTIMPL;
     251#elif USE(CFNETWORK)
     252    RetainPtr<CFStringRef> cfurlCacheDirectory = adoptCF(wkCopyFoundationCacheDirectory(0));
     253    *location = BString(cfurlCacheDirectory.get()).release();
     254    return S_OK;
    248255#endif
    249256}
     
    255262    WebCore::CurlCacheManager::getInstance().setCacheDirectory(cacheFolder);
    256263    return S_OK;
    257 #else
    258     return E_NOTIMPL;
    259 #endif
    260 }
     264#elif USE(CFNETWORK)
     265    RetainPtr<CFURLCacheRef> cache = adoptCF(CFURLCacheCopySharedURLCache());
     266    CFIndex memoryCapacity = CFURLCacheMemoryCapacity(cache.get());
     267    CFIndex diskCapacity = CFURLCacheDiskCapacity(cache.get());
     268    RetainPtr<CFURLCacheRef> newCache = adoptCF(CFURLCacheCreate(kCFAllocatorDefault, memoryCapacity, diskCapacity, String(location).createCFString().get()));
     269    CFURLCacheSetSharedURLCache(newCache.get());
     270    return S_OK;
     271#endif
     272}
  • trunk/Source/WebKit/win/WebDatabaseManager.cpp

    r207144 r207218  
    3434#include "MarshallingHelpers.h"
    3535#include "WebNotificationCenter.h"
     36#include "WebPreferences.h"
    3637#include "WebSecurityOrigin.h"
    3738
     
    421422{
    422423#if USE(CF)
    423     RetainPtr<CFPropertyListRef> directoryPref = adoptCF(CFPreferencesCopyAppValue(WebDatabaseDirectoryDefaultsKey, kCFPreferencesCurrentApplication));
     424    RetainPtr<CFPropertyListRef> directoryPref = adoptCF(CFPreferencesCopyAppValue(WebDatabaseDirectoryDefaultsKey, WebPreferences::applicationId()));
    424425    if (directoryPref && (CFStringGetTypeID() == CFGetTypeID(directoryPref.get())))
    425426        return static_cast<CFStringRef>(directoryPref.get());
  • trunk/Source/WebKit/win/WebPreferences.cpp

    r207144 r207218  
    102102static CFDictionaryRef defaultSettings;
    103103
     104RetainPtr<CFStringRef> WebPreferences::m_applicationId = kCFPreferencesCurrentApplication;
     105
    104106static HashMap<WTF::String, COMPtr<WebPreferences>>& webPreferencesInstances()
    105107{
     
    182184    if (webPreference && webPreference->m_refCount == 1)
    183185        webPreferencesInstances().remove(identifierString);
     186}
     187
     188CFStringRef WebPreferences::applicationId()
     189{
     190    return m_applicationId.get();
    184191}
    185192
     
    307314        return value;
    308315
    309     value = adoptCF(CFPreferencesCopyAppValue(key, kCFPreferencesCurrentApplication));
     316    value = adoptCF(CFPreferencesCopyAppValue(key, applicationId()));
    310317    if (value)
    311318        return value;
     
    318325    CFDictionarySetValue(m_privatePrefs.get(), key, value);
    319326    if (m_autoSaves) {
    320         CFPreferencesSetAppValue(key, value, kCFPreferencesCurrentApplication);
     327        CFPreferencesSetAppValue(key, value, applicationId());
    321328        save();
    322329    }
     
    449456void WebPreferences::save()
    450457{
    451     CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
     458    CFPreferencesAppSynchronize(applicationId());
    452459}
    453460
     
    541548    else if (IsEqualGUID(riid, IID_IWebPreferencesPrivate3))
    542549        *ppvObject = static_cast<IWebPreferencesPrivate3*>(this);
     550    else if (IsEqualGUID(riid, IID_IWebPreferencesPrivate4))
     551        *ppvObject = static_cast<IWebPreferencesPrivate4*>(this);
    543552    else if (IsEqualGUID(riid, CLSID_WebPreferences))
    544553        *ppvObject = this;
     
    19942003    return S_OK;
    19952004}
     2005
     2006HRESULT WebPreferences::setApplicationId(BSTR applicationId)
     2007{
     2008    m_applicationId = String(applicationId).createCFString();
     2009    return S_OK;
     2010}
  • trunk/Source/WebKit/win/WebPreferences.h

    r207144 r207218  
    2424 */
    2525
    26 #ifndef WebPreferences_H
    27 #define WebPreferences_H
     26#pragma once
    2827
    2928#include "WebKit.h"
     
    3231#include <wtf/RetainPtr.h>
    3332
    34 class WebPreferences : public IWebPreferences, public IWebPreferencesPrivate3 {
     33class WebPreferences : public IWebPreferences, public IWebPreferencesPrivate4 {
    3534public:
    3635    static WebPreferences* createInstance();
     
    245244    virtual HRESULT STDMETHODCALLTYPE setModernMediaControlsEnabled(BOOL);
    246245
     246    // IWebPreferencesPrivate4
     247    virtual HRESULT STDMETHODCALLTYPE setApplicationId(BSTR);
     248
    247249    // WebPreferences
    248250
     
    257259    static void removeReferenceForIdentifier(BSTR identifier);
    258260    static WebPreferences* sharedStandardPreferences();
     261
     262    static CFStringRef applicationId();
    259263
    260264    // From WebHistory.h
     
    264268    HRESULT setHistoryAgeInDaysLimit(int);
    265269
    266      void willAddToWebView();
    267      void didRemoveFromWebView();
     270    void willAddToWebView();
     271    void didRemoveFromWebView();
    268272
    269273    HRESULT postPreferencesChangesNotification();
     
    298302    bool m_automaticallyDetectsCacheModel { true };
    299303    unsigned m_numWebViews { 0 };
     304    static RetainPtr<CFStringRef> m_applicationId;
    300305};
    301 
    302 #endif
  • trunk/Source/WebKit/win/WebView.cpp

    r207151 r207218  
    502502    RetainPtr<CFStringRef> cfurlCacheDirectory = adoptCF(wkCopyFoundationCacheDirectory(0));
    503503    if (!cfurlCacheDirectory) {
    504         RetainPtr<CFPropertyListRef> preference = adoptCF(CFPreferencesCopyAppValue(WebKitLocalCacheDefaultsKey, kCFPreferencesCurrentApplication));
     504        RetainPtr<CFPropertyListRef> preference = adoptCF(CFPreferencesCopyAppValue(WebKitLocalCacheDefaultsKey, WebPreferences::applicationId()));
    505505        if (preference && (CFStringGetTypeID() == CFGetTypeID(preference.get())))
    506506            cfurlCacheDirectory = adoptCF(static_cast<CFStringRef>(preference.leakRef()));
  • trunk/Tools/ChangeLog

    r207184 r207218  
     12016-10-12  Per Arne Vollan  <pvollan@apple.com>
     2
     3        [Win] Parallel DRTs are sharing preferences and cache.
     4        https://bugs.webkit.org/show_bug.cgi?id=163013
     5
     6        Reviewed by Brent Fulgham.
     7
     8        Use separate cache and preferences for each DRT instance.
     9
     10        * DumpRenderTree/win/DumpRenderTree.cpp:
     11        (applicationId):
     12        (setApplicationId):
     13        (setCacheFolder):
     14        (setDefaultsToConsistentValuesForTesting):
     15        * Scripts/webkitpy/port/win.py:
     16        (WinPort.setup_test_run):
     17
    1182016-10-11  Alex Christensen  <achristensen@webkit.org>
    219
  • trunk/Tools/DumpRenderTree/win/DumpRenderTree.cpp

    r207151 r207218  
    5050#include <io.h>
    5151#include <math.h>
     52#include <shlobj.h>
    5253#include <shlwapi.h>
    5354#include <tchar.h>
     
    860861}
    861862
     863static String applicationId()
     864{
     865    DWORD processId = ::GetCurrentProcessId();
     866    return String::format("com.apple.DumpRenderTree.%d", processId);
     867}
     868
     869static void setApplicationId()
     870{
     871    COMPtr<IWebPreferences> preferences;
     872    if (SUCCEEDED(WebKitCreateInstance(CLSID_WebPreferences, 0, IID_IWebPreferences, (void**)&preferences))) {
     873        COMPtr<IWebPreferencesPrivate4> prefsPrivate4(Query, preferences);
     874        ASSERT(prefsPrivate4);
     875        _bstr_t fileName = applicationId().charactersWithNullTermination().data();
     876        prefsPrivate4->setApplicationId(fileName);
     877    }
     878}
     879
     880static void setCacheFolder()
     881{
     882    String libraryPath = libraryPathForDumpRenderTree();
     883
     884    COMPtr<IWebCache> webCache;
     885    if (SUCCEEDED(WebKitCreateInstance(CLSID_WebCache, 0, IID_IWebCache, (void**)&webCache))) {
     886        _bstr_t cacheFolder = WebCore::pathByAppendingComponent(libraryPath, "LocalCache").utf8().data();
     887        webCache->setCacheFolder(cacheFolder);
     888    }
     889}
     890
    862891// Called once on DumpRenderTree startup.
    863892static void setDefaultsToConsistentValuesForTesting()
    864893{
    865894#if USE(CF)
     895    // Create separate preferences for each DRT instance
     896    setApplicationId();
     897
     898    RetainPtr<CFStringRef> appId = applicationId().createCFString();
     899
    866900    String libraryPath = libraryPathForDumpRenderTree();
    867901
    868902    // Set up these values before creating the WebView so that the various initializations will see these preferred values.
    869     CFPreferencesSetAppValue(WebDatabaseDirectoryDefaultsKey, WebCore::pathByAppendingComponent(libraryPath, "Databases").createCFString().get(), kCFPreferencesCurrentApplication);
    870     CFPreferencesSetAppValue(WebStorageDirectoryDefaultsKey, WebCore::pathByAppendingComponent(libraryPath, "LocalStorage").createCFString().get(), kCFPreferencesCurrentApplication);
    871     CFPreferencesSetAppValue(WebKitLocalCacheDefaultsKey, WebCore::pathByAppendingComponent(libraryPath, "LocalCache").createCFString().get(), kCFPreferencesCurrentApplication);
     903    CFPreferencesSetAppValue(WebDatabaseDirectoryDefaultsKey, WebCore::pathByAppendingComponent(libraryPath, "Databases").createCFString().get(), appId.get());
     904    CFPreferencesSetAppValue(WebStorageDirectoryDefaultsKey, WebCore::pathByAppendingComponent(libraryPath, "LocalStorage").createCFString().get(), appId.get());
     905    CFPreferencesSetAppValue(WebKitLocalCacheDefaultsKey, WebCore::pathByAppendingComponent(libraryPath, "LocalCache").createCFString().get(), appId.get());
     906
     907    // Create separate cache for each DRT instance
     908    setCacheFolder();
    872909#endif
    873910}
  • trunk/Tools/Scripts/webkitpy/port/win.py

    r207144 r207218  
    2929
    3030import atexit
     31import glob
     32import logging
    3133import os
    32 import logging
    3334import re
    3435import sys
     
    347348        os.system("rm -rf /dev/shm/sem.*")
    348349
     350    def delete_preference_files(self):
     351        try:
     352            preferences_files = self._filesystem.join(os.environ['APPDATA'], "Apple Computer/Preferences", "com.apple.DumpRenderTree*")
     353            filelist = glob.glob(preferences_files)
     354            for file in filelist:
     355                self._filesystem.remove(file)
     356        except:
     357            _log.warn("Failed to delete preference files.")
     358
    349359    def setup_test_run(self, device_class=None):
    350360        atexit.register(self.restore_crash_log_saving)
     
    352362        self.prevent_error_dialogs()
    353363        self.delete_sem_locks()
     364        self.delete_preference_files()
    354365        super(WinPort, self).setup_test_run(device_class)
    355366
Note: See TracChangeset for help on using the changeset viewer.