Changeset 271153 in webkit


Ignore:
Timestamp:
Jan 5, 2021 10:15:39 AM (3 years ago)
Author:
achristensen@apple.com
Message:

Use WeakHashSet<Page> instead of HashSet<Page*>
https://bugs.webkit.org/show_bug.cgi?id=220102

Reviewed by Darin Adler.

Source/WebCore:

The former is more resistent to using a raw pointer after the object has been freed.

  • inspector/PageDebugger.cpp:

(WebCore::PageDebugger::setJavaScriptPaused):

  • page/CaptionUserPreferences.cpp:

(WebCore::CaptionUserPreferences::currentPage const):
(WebCore::CaptionUserPreferences::userPrefersCaptions const):
(WebCore::CaptionUserPreferences::setUserPrefersCaptions):
(WebCore::CaptionUserPreferences::userPrefersSubtitles const):
(WebCore::CaptionUserPreferences::setUserPrefersSubtitles):
(WebCore::CaptionUserPreferences::userPrefersTextDescriptions const):
(WebCore::CaptionUserPreferences::setUserPrefersTextDescriptions):
(WebCore::CaptionUserPreferences::updateCaptionStyleSheetOverride):

  • page/FrameTree.cpp:

(WebCore::FrameTree::find const):

  • page/PageGroup.cpp:

(WebCore::PageGroup::addPage):
(WebCore::PageGroup::removePage):
(WebCore::PageGroup::captionPreferencesChanged):

  • page/PageGroup.h:

(WebCore::PageGroup::pages const):
(WebCore::PageGroup:: const): Deleted.

  • page/PageGroupLoadDeferrer.cpp:

(WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer):

  • page/UserContentProvider.cpp:

(WebCore::UserContentProvider::~UserContentProvider):
(WebCore::UserContentProvider::addPage):
(WebCore::UserContentProvider::removePage):
(WebCore::UserContentProvider::registerForUserMessageHandlerInvalidation):
(WebCore::UserContentProvider::unregisterForUserMessageHandlerInvalidation):
(WebCore::UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients):
(WebCore::UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages):

  • page/UserContentProvider.h:
  • page/VisitedLinkStore.cpp:

(WebCore::VisitedLinkStore::~VisitedLinkStore):
(WebCore::VisitedLinkStore::addPage):
(WebCore::VisitedLinkStore::removePage):
(WebCore::VisitedLinkStore::invalidateStylesForAllLinks):
(WebCore::VisitedLinkStore::invalidateStylesForLink):

  • page/VisitedLinkStore.h:
  • plugins/PluginInfoProvider.cpp:

(WebCore::PluginInfoProvider::~PluginInfoProvider):
(WebCore::PluginInfoProvider::clearPagesPluginData):
(WebCore::PluginInfoProvider::refresh):
(WebCore::PluginInfoProvider::addPage):
(WebCore::PluginInfoProvider::removePage):

  • plugins/PluginInfoProvider.h:
  • storage/StorageEventDispatcher.cpp:

(WebCore::StorageEventDispatcher::dispatchLocalStorageEvents):
(WebCore::StorageEventDispatcher::dispatchLocalStorageEventsToFrames):

Source/WebKit:

  • WebProcess/InjectedBundle/InjectedBundle.cpp:

(WebKit::InjectedBundle::setAsynchronousSpellCheckingEnabled):
(WebKit::InjectedBundle::setUserStyleSheetLocation):
(WebKit::InjectedBundle::liveDocumentURLs):

  • WebProcess/WebStorage/StorageAreaMap.cpp:

(WebKit::StorageAreaMap::dispatchLocalStorageEvent):

Location:
trunk/Source
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r271148 r271153  
     12021-01-05  Alex Christensen  <achristensen@webkit.org>
     2
     3        Use WeakHashSet<Page> instead of HashSet<Page*>
     4        https://bugs.webkit.org/show_bug.cgi?id=220102
     5
     6        Reviewed by Darin Adler.
     7
     8        The former is more resistent to using a raw pointer after the object has been freed.
     9
     10        * inspector/PageDebugger.cpp:
     11        (WebCore::PageDebugger::setJavaScriptPaused):
     12        * page/CaptionUserPreferences.cpp:
     13        (WebCore::CaptionUserPreferences::currentPage const):
     14        (WebCore::CaptionUserPreferences::userPrefersCaptions const):
     15        (WebCore::CaptionUserPreferences::setUserPrefersCaptions):
     16        (WebCore::CaptionUserPreferences::userPrefersSubtitles const):
     17        (WebCore::CaptionUserPreferences::setUserPrefersSubtitles):
     18        (WebCore::CaptionUserPreferences::userPrefersTextDescriptions const):
     19        (WebCore::CaptionUserPreferences::setUserPrefersTextDescriptions):
     20        (WebCore::CaptionUserPreferences::updateCaptionStyleSheetOverride):
     21        * page/FrameTree.cpp:
     22        (WebCore::FrameTree::find const):
     23        * page/PageGroup.cpp:
     24        (WebCore::PageGroup::addPage):
     25        (WebCore::PageGroup::removePage):
     26        (WebCore::PageGroup::captionPreferencesChanged):
     27        * page/PageGroup.h:
     28        (WebCore::PageGroup::pages const):
     29        (WebCore::PageGroup:: const): Deleted.
     30        * page/PageGroupLoadDeferrer.cpp:
     31        (WebCore::PageGroupLoadDeferrer::PageGroupLoadDeferrer):
     32        * page/UserContentProvider.cpp:
     33        (WebCore::UserContentProvider::~UserContentProvider):
     34        (WebCore::UserContentProvider::addPage):
     35        (WebCore::UserContentProvider::removePage):
     36        (WebCore::UserContentProvider::registerForUserMessageHandlerInvalidation):
     37        (WebCore::UserContentProvider::unregisterForUserMessageHandlerInvalidation):
     38        (WebCore::UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients):
     39        (WebCore::UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages):
     40        * page/UserContentProvider.h:
     41        * page/VisitedLinkStore.cpp:
     42        (WebCore::VisitedLinkStore::~VisitedLinkStore):
     43        (WebCore::VisitedLinkStore::addPage):
     44        (WebCore::VisitedLinkStore::removePage):
     45        (WebCore::VisitedLinkStore::invalidateStylesForAllLinks):
     46        (WebCore::VisitedLinkStore::invalidateStylesForLink):
     47        * page/VisitedLinkStore.h:
     48        * plugins/PluginInfoProvider.cpp:
     49        (WebCore::PluginInfoProvider::~PluginInfoProvider):
     50        (WebCore::PluginInfoProvider::clearPagesPluginData):
     51        (WebCore::PluginInfoProvider::refresh):
     52        (WebCore::PluginInfoProvider::addPage):
     53        (WebCore::PluginInfoProvider::removePage):
     54        * plugins/PluginInfoProvider.h:
     55        * storage/StorageEventDispatcher.cpp:
     56        (WebCore::StorageEventDispatcher::dispatchLocalStorageEvents):
     57        (WebCore::StorageEventDispatcher::dispatchLocalStorageEventsToFrames):
     58
    1592021-01-05  Andres Gonzalez  <andresg_22@apple.com>
    260
  • trunk/Source/WebCore/inspector/PageDebugger.cpp

    r266077 r271153  
    149149{
    150150    for (auto& page : pageGroup.pages()) {
    151         for (Frame* frame = &page->mainFrame(); frame; frame = frame->tree().traverseNext())
     151        for (auto* frame = &page.mainFrame(); frame; frame = frame->tree().traverseNext())
    152152            setJavaScriptPaused(*frame, paused);
    153153
    154         if (auto* frontendClient = page->inspectorController().inspectorFrontendClient()) {
     154        if (auto* frontendClient = page.inspectorController().inspectorFrontendClient()) {
    155155            if (paused)
    156156                frontendClient->pagePaused();
  • trunk/Source/WebCore/page/CaptionUserPreferences.cpp

    r262695 r271153  
    101101Page* CaptionUserPreferences::currentPage() const
    102102{
    103     if (m_pageGroup.pages().isEmpty())
    104         return nullptr;
    105 
    106     return *(m_pageGroup.pages().begin());
     103    for (auto& page : m_pageGroup.pages())
     104        return &page;
     105    return nullptr;
    107106}
    108107
    109108bool CaptionUserPreferences::userPrefersCaptions() const
    110109{
    111     Page* page = currentPage();
     110    auto* page = currentPage();
    112111    if (!page)
    113112        return false;
     
    118117void CaptionUserPreferences::setUserPrefersCaptions(bool preference)
    119118{
    120     Page* page = currentPage();
     119    auto* page = currentPage();
    121120    if (!page)
    122121        return;
     
    128127bool CaptionUserPreferences::userPrefersSubtitles() const
    129128{
    130     Page* page = currentPage();
     129    auto* page = currentPage();
    131130    if (!page)
    132131        return false;
     
    137136void CaptionUserPreferences::setUserPrefersSubtitles(bool preference)
    138137{
    139     Page* page = currentPage();
     138    auto* page = currentPage();
    140139    if (!page)
    141140        return;
     
    147146bool CaptionUserPreferences::userPrefersTextDescriptions() const
    148147{
    149     Page* page = currentPage();
     148    auto* page = currentPage();
    150149    if (!page)
    151150        return false;
     
    156155void CaptionUserPreferences::setUserPrefersTextDescriptions(bool preference)
    157156{
    158     Page* page = currentPage();
     157    auto* page = currentPage();
    159158    if (!page)
    160159        return;
     
    407406    String captionsOverrideStyleSheet = captionsStyleSheetOverride();
    408407    for (auto& page : m_pageGroup.pages())
    409         page->setCaptionUserPreferencesStyleSheet(captionsOverrideStyleSheet);
     408        page.setCaptionUserPreferencesStyleSheet(captionsOverrideStyleSheet);
    410409}
    411410
  • trunk/Source/WebCore/page/FrameTree.cpp

    r269435 r271153  
    270270        return nullptr;
    271271   
    272     for (auto* otherPage : page->group().pages()) {
    273         if (otherPage == page)
     272    for (auto& otherPage : page->group().pages()) {
     273        if (&otherPage == page)
    274274            continue;
    275         for (auto* frame = &otherPage->mainFrame(); frame; frame = frame->tree().traverseNext()) {
     275        for (auto* frame = &otherPage.mainFrame(); frame; frame = frame->tree().traverseNext()) {
    276276            if (frame->tree().uniqueName() == name && isFrameFamiliarWith(activeFrame, *frame))
    277277                return frame;
  • trunk/Source/WebCore/page/PageGroup.cpp

    r262695 r271153  
    9292void PageGroup::addPage(Page& page)
    9393{
    94     ASSERT(!m_pages.contains(&page));
    95     m_pages.add(&page);
     94    ASSERT(!m_pages.contains(page));
     95    m_pages.add(page);
    9696}
    9797
    9898void PageGroup::removePage(Page& page)
    9999{
    100     ASSERT(m_pages.contains(&page));
    101     m_pages.remove(&page);
     100    ASSERT(m_pages.contains(page));
     101    m_pages.remove(page);
    102102}
    103103
     
    106106{
    107107    for (auto& page : m_pages)
    108         page->captionPreferencesChanged();
     108        page.captionPreferencesChanged();
    109109    BackForwardCache::singleton().markPagesForCaptionPreferencesChanged();
    110110}
  • trunk/Source/WebCore/page/PageGroup.h

    r262695 r271153  
    2626#pragma once
    2727
    28 #include <wtf/HashSet.h>
    2928#include <wtf/Noncopyable.h>
     29#include <wtf/WeakHashSet.h>
    3030#include <wtf/text/WTFString.h>
    3131
     
    4646    WEBCORE_EXPORT static PageGroup* pageGroup(const String& groupName);
    4747
    48     const HashSet<Page*>& pages() const { return m_pages; }
     48    const WeakHashSet<Page>& pages() const { return m_pages; }
    4949
    5050    void addPage(Page&);
     
    6161private:
    6262    String m_name;
    63     HashSet<Page*> m_pages;
     63    WeakHashSet<Page> m_pages;
    6464
    6565    unsigned m_identifier;
  • trunk/Source/WebCore/page/PageGroupLoadDeferrer.cpp

    r233611 r271153  
    3434{
    3535    for (auto& otherPage : page.group().pages()) {
    36         if ((deferSelf || otherPage != &page)) {
    37             if (!otherPage->defersLoading()) {
    38                 m_deferredFrames.append(&otherPage->mainFrame());
     36        if ((deferSelf || &otherPage != &page)) {
     37            if (!otherPage.defersLoading()) {
     38                m_deferredFrames.append(&otherPage.mainFrame());
    3939
    4040                // This code is not logically part of load deferring, but we do not want JS code executed beneath modal
    4141                // windows or sheets, which is exactly when PageGroupLoadDeferrer is used.
    42                 for (Frame* frame = &otherPage->mainFrame(); frame; frame = frame->tree().traverseNext())
     42                for (auto* frame = &otherPage.mainFrame(); frame; frame = frame->tree().traverseNext())
    4343                    frame->document()->suspendScheduledTasks(ReasonForSuspension::WillDeferLoading);
    4444            }
  • trunk/Source/WebCore/page/UserContentProvider.cpp

    r262683 r271153  
    4747UserContentProvider::~UserContentProvider()
    4848{
    49     ASSERT(m_pages.isEmpty());
     49    ASSERT(m_pages.computesEmpty());
    5050}
    5151
    5252void UserContentProvider::addPage(Page& page)
    5353{
    54     ASSERT(!m_pages.contains(&page));
     54    ASSERT(!m_pages.contains(page));
    5555
    56     m_pages.add(&page);
     56    m_pages.add(page);
    5757}
    5858
    5959void UserContentProvider::removePage(Page& page)
    6060{
    61     ASSERT(m_pages.contains(&page));
     61    ASSERT(m_pages.contains(page));
    6262
    63     m_pages.remove(&page);
     63    m_pages.remove(page);
    6464}
    6565
    6666void UserContentProvider::registerForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient& invalidationClient)
    6767{
    68     ASSERT(!m_userMessageHandlerInvalidationClients.contains(&invalidationClient));
     68    ASSERT(!m_userMessageHandlerInvalidationClients.contains(invalidationClient));
    6969
    7070    m_userMessageHandlerInvalidationClients.add(&invalidationClient);
     
    7373void UserContentProvider::unregisterForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient& invalidationClient)
    7474{
    75     ASSERT(m_userMessageHandlerInvalidationClients.contains(&invalidationClient));
     75    ASSERT(m_userMessageHandlerInvalidationClients.contains(invalidationClient));
    7676
    77     m_userMessageHandlerInvalidationClients.remove(&invalidationClient);
     77    m_userMessageHandlerInvalidationClients.remove(invalidationClient);
    7878}
    7979
     
    8181{
    8282    for (auto& client : m_userMessageHandlerInvalidationClients)
    83         client->didInvalidate(*this);
     83        client.didInvalidate(*this);
    8484}
    8585
     
    8787{
    8888    for (auto& page : m_pages)
    89         page->invalidateInjectedStyleSheetCacheInAllFrames();
     89        page.invalidateInjectedStyleSheetCacheInAllFrames();
    9090}
    9191
  • trunk/Source/WebCore/page/UserContentProvider.h

    r244794 r271153  
    3131#include <wtf/HashSet.h>
    3232#include <wtf/RefCounted.h>
     33#include <wtf/WeakHashSet.h>
     34#include <wtf/WeakPtr.h>
    3335
    3436#if ENABLE(CONTENT_EXTENSIONS)
     
    5759class UserContentProvider;
    5860
    59 class UserContentProviderInvalidationClient {
     61class UserContentProviderInvalidationClient : public CanMakeWeakPtr<UserContentProviderInvalidationClient> {
    6062public:
    6163    virtual ~UserContentProviderInvalidationClient()
     
    99101
    100102private:
    101     HashSet<Page*> m_pages;
    102     HashSet<UserContentProviderInvalidationClient*> m_userMessageHandlerInvalidationClients;
     103    WeakHashSet<Page> m_pages;
     104    WeakHashSet<UserContentProviderInvalidationClient> m_userMessageHandlerInvalidationClients;
    103105};
    104106
  • trunk/Source/WebCore/page/VisitedLinkStore.cpp

    r222664 r271153  
    3737VisitedLinkStore::~VisitedLinkStore()
    3838{
    39     ASSERT(m_pages.isEmpty());
     39    ASSERT(m_pages.computesEmpty());
    4040}
    4141
    4242void VisitedLinkStore::addPage(Page& page)
    4343{
    44     ASSERT(!m_pages.contains(&page));
     44    ASSERT(!m_pages.contains(page));
    4545
    46     m_pages.add(&page);
     46    m_pages.add(page);
    4747}
    4848
    4949void VisitedLinkStore::removePage(Page& page)
    5050{
    51     ASSERT(m_pages.contains(&page));
     51    ASSERT(m_pages.contains(page));
    5252
    53     m_pages.remove(&page);
     53    m_pages.remove(page);
    5454}
    5555
     
    5757{
    5858    for (auto& page : m_pages)
    59         page->invalidateStylesForAllLinks();
     59        page.invalidateStylesForAllLinks();
    6060}
    6161
     
    6363{
    6464    for (auto& page : m_pages)
    65         page->invalidateStylesForLink(linkHash);
     65        page.invalidateStylesForLink(linkHash);
    6666}
    6767
  • trunk/Source/WebCore/page/VisitedLinkStore.h

    r254739 r271153  
    2727
    2828#include <wtf/Forward.h>
    29 #include <wtf/HashSet.h>
    3029#include <wtf/RefCounted.h>
     30#include <wtf/WeakHashSet.h>
    3131
    3232namespace WebCore {
     
    5151
    5252private:
    53     HashSet<Page*> m_pages;
     53    WeakHashSet<Page> m_pages;
    5454};
    5555
  • trunk/Source/WebCore/plugins/PluginInfoProvider.cpp

    r233563 r271153  
    3636PluginInfoProvider::~PluginInfoProvider()
    3737{
    38     ASSERT(m_pages.isEmpty());
     38    ASSERT(m_pages.computesEmpty());
    3939}
    4040
     
    4242{
    4343    for (auto& page : m_pages)
    44         page->clearPluginData();
     44        page.clearPluginData();
    4545}
    4646
     
    5252
    5353    for (auto& page : m_pages) {
    54         page->clearPluginData();
     54        page.clearPluginData();
    5555
    5656        if (!reloadPages)
    5757            continue;
    5858
    59         for (Frame* frame = &page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
     59        for (auto* frame = &page.mainFrame(); frame; frame = frame->tree().traverseNext()) {
    6060            if (frame->loader().subframeLoader().containsPlugins())
    61                 framesNeedingReload.append(page->mainFrame());
     61                framesNeedingReload.append(page.mainFrame());
    6262        }
    6363    }
     
    6969void PluginInfoProvider::addPage(Page& page)
    7070{
    71     ASSERT(!m_pages.contains(&page));
     71    ASSERT(!m_pages.contains(page));
    7272
    73     m_pages.add(&page);
     73    m_pages.add(page);
    7474}
    7575
    7676void PluginInfoProvider::removePage(Page& page)
    7777{
    78     ASSERT(m_pages.contains(&page));
     78    ASSERT(m_pages.contains(page));
    7979
    80     m_pages.remove(&page);
     80    m_pages.remove(page);
    8181}
    8282
  • trunk/Source/WebCore/plugins/PluginInfoProvider.h

    r239427 r271153  
    2727
    2828#include "PluginData.h"
    29 #include <wtf/HashSet.h>
     29#include <wtf/WeakHashSet.h>
    3030
    3131namespace WebCore {
     
    4747    virtual void refreshPlugins() = 0;
    4848
    49     HashSet<Page*> m_pages;
     49    WeakHashSet<Page> m_pages;
    5050};
    5151
  • trunk/Source/WebCore/storage/StorageEventDispatcher.cpp

    r260709 r271153  
    7070    // Send events to every page.
    7171    for (auto& pageInGroup : page->group().pages()) {
    72         for (Frame* frame = &pageInGroup->mainFrame(); frame; frame = frame->tree().traverseNext()) {
     72        for (auto* frame = &pageInGroup.mainFrame(); frame; frame = frame->tree().traverseNext()) {
    7373            if (!frame->document())
    7474                continue;
     
    9696{
    9797    for (auto& page : pageGroup.pages())
    98         InspectorInstrumentation::didDispatchDOMStorageEvent(*page, key, oldValue, newValue, StorageType::Local, securityOrigin.securityOrigin().ptr());
     98        InspectorInstrumentation::didDispatchDOMStorageEvent(page, key, oldValue, newValue, StorageType::Local, securityOrigin.securityOrigin().ptr());
    9999
    100100    for (auto& frame : frames) {
  • trunk/Source/WebKit/ChangeLog

    r271149 r271153  
     12021-01-05  Alex Christensen  <achristensen@webkit.org>
     2
     3        Use WeakHashSet<Page> instead of HashSet<Page*>
     4        https://bugs.webkit.org/show_bug.cgi?id=220102
     5
     6        Reviewed by Darin Adler.
     7
     8        * WebProcess/InjectedBundle/InjectedBundle.cpp:
     9        (WebKit::InjectedBundle::setAsynchronousSpellCheckingEnabled):
     10        (WebKit::InjectedBundle::setUserStyleSheetLocation):
     11        (WebKit::InjectedBundle::liveDocumentURLs):
     12        * WebProcess/WebStorage/StorageAreaMap.cpp:
     13        (WebKit::StorageAreaMap::dispatchLocalStorageEvent):
     14
    1152021-01-05  Alex Christensen  <achristensen@webkit.org>
    216
  • trunk/Source/WebKit/WebProcess/InjectedBundle/InjectedBundle.cpp

    r269236 r271153  
    171171void InjectedBundle::setAsynchronousSpellCheckingEnabled(WebPageGroupProxy* pageGroup, bool enabled)
    172172{
    173     const HashSet<Page*>& pages = PageGroup::pageGroup(pageGroup->identifier())->pages();
    174     for (HashSet<Page*>::iterator iter = pages.begin(); iter != pages.end(); ++iter)
    175         (*iter)->settings().setAsynchronousSpellCheckingEnabled(enabled);
     173    for (auto& page : PageGroup::pageGroup(pageGroup->identifier())->pages())
     174        page.settings().setAsynchronousSpellCheckingEnabled(enabled);
    176175}
    177176
     
    288287void InjectedBundle::setUserStyleSheetLocation(WebPageGroupProxy* pageGroup, const String& location)
    289288{
    290     const HashSet<Page*>& pages = PageGroup::pageGroup(pageGroup->identifier())->pages();
    291     for (HashSet<Page*>::iterator iter = pages.begin(); iter != pages.end(); ++iter)
    292         (*iter)->settings().setUserStyleSheetLocation(URL(URL(), location));
     289    for (auto& page : PageGroup::pageGroup(pageGroup->identifier())->pages())
     290        page.settings().setUserStyleSheetLocation(URL(URL(), location));
    293291}
    294292
     
    344342
    345343    if (excludeDocumentsInPageGroupPages) {
    346         for (const auto* page : PageGroup::pageGroup(pageGroup->identifier())->pages()) {
    347             for (const auto* frame = &page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
     344        for (auto& page : PageGroup::pageGroup(pageGroup->identifier())->pages()) {
     345            for (auto* frame = &page.mainFrame(); frame; frame = frame->tree().traverseNext()) {
    348346                if (!frame->document())
    349347                    continue;
  • trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp

    r262058 r271153  
    338338    // Namespace IDs for local storage namespaces are equivalent to web page group IDs.
    339339    auto& pageGroup = *WebProcess::singleton().webPageGroup(m_namespace.pageGroupID())->corePageGroup();
    340     for (auto* page : pageGroup.pages())
    341         frames.appendVector(framesForEventDispatching(*page, m_securityOrigin, StorageType::Local, storageAreaImplID));
     340    for (auto& page : pageGroup.pages())
     341        frames.appendVector(framesForEventDispatching(page, m_securityOrigin, StorageType::Local, storageAreaImplID));
    342342
    343343    StorageEventDispatcher::dispatchLocalStorageEventsToFrames(pageGroup, frames, key, oldValue, newValue, urlString, m_securityOrigin->data());
Note: See TracChangeset for help on using the changeset viewer.