Changeset 83499 in webkit


Ignore:
Timestamp:
Apr 11, 2011 2:26:28 PM (13 years ago)
Author:
andersca@apple.com
Message:

2011-04-11 Anders Carlsson <andersca@apple.com>

Reviewed by Sam Weinig.

First step towards simplifying WebPageProxy/WebProcessProxy/WebContext ownership
https://bugs.webkit.org/show_bug.cgi?id=58266

With this patch, the WKView holds a strong reference to a WebPageProxy. The
WebPageProxy in turn holds a strong reference to its WebProcessProxy. Finally,
The WebProcessProxy holds a strong reference to its WebContext.

The WebContext holds a strong reference to the running WebProcessProxy which results
in a reference cycle that's broken when the web process exits.

The reason for is to avoid crashes where WebPageProxy::process() returns null if the web process
has crashed but has not yet been relaunched.

  • UIProcess/WebContext.cpp: (WebKit::WebContext::disconnectProcess): Add comment.

(WebKit::WebContext::createWebPage):
Return a PassRefPtr.

(WebKit::WebContext::relaunchProcessIfNecessary):
Change this to return a WebPageProxy.

  • UIProcess/WebPageProxy.cpp: (WebKit::WebPageProxy::create): This now takes a PassRefPtr<WebProcessProxy>.

(WebKit::WebPageProxy::WebPageProxy):
Ditto.

(WebKit::WebPageProxy::~WebPageProxy):
Call close() if necessary.

(WebKit::WebPageProxy::reattachToWebProcess):
Replace the current process with the new process.

  • UIProcess/WebProcessProxy.cpp: (WebKit::WebProcessProxy::create): Take a PassRefPtr<WebContext>.


(WebKit::WebProcessProxy::WebProcessProxy):
Ditto.

(WebKit::WebProcessProxy::webPage):
Remove .get() now that the page map uses weak references.

(WebKit::WebProcessProxy::createWebPage):
This now returns the created web page proxy.

Location:
trunk/Source/WebKit2
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r83498 r83499  
     12011-04-11  Anders Carlsson  <andersca@apple.com>
     2
     3        Reviewed by Sam Weinig.
     4
     5        First step towards simplifying WebPageProxy/WebProcessProxy/WebContext ownership
     6        https://bugs.webkit.org/show_bug.cgi?id=58266
     7
     8        With this patch, the WKView holds a strong reference to a WebPageProxy. The
     9        WebPageProxy in turn holds a strong reference to its WebProcessProxy. Finally,
     10        The WebProcessProxy holds a strong reference to its WebContext.
     11
     12        The WebContext holds a strong reference to the running WebProcessProxy which results
     13        in a reference cycle that's broken when the web process exits.
     14
     15        The reason for is to avoid crashes where WebPageProxy::process() returns null if the web process
     16        has crashed but has not yet been relaunched.
     17
     18        * UIProcess/WebContext.cpp:
     19        (WebKit::WebContext::disconnectProcess):
     20        Add comment.
     21
     22        (WebKit::WebContext::createWebPage):
     23        Return a PassRefPtr.
     24
     25        (WebKit::WebContext::relaunchProcessIfNecessary):
     26        Change this to return a WebPageProxy.
     27
     28        * UIProcess/WebPageProxy.cpp:
     29        (WebKit::WebPageProxy::create):
     30        This now takes a PassRefPtr<WebProcessProxy>.
     31
     32        (WebKit::WebPageProxy::WebPageProxy):
     33        Ditto.
     34
     35        (WebKit::WebPageProxy::~WebPageProxy):
     36        Call close() if necessary.
     37
     38        (WebKit::WebPageProxy::reattachToWebProcess):
     39        Replace the current process with the new process.
     40
     41        * UIProcess/WebProcessProxy.cpp:
     42        (WebKit::WebProcessProxy::create):
     43        Take a PassRefPtr<WebContext>.
     44       
     45        (WebKit::WebProcessProxy::WebProcessProxy):
     46        Ditto.
     47
     48        (WebKit::WebProcessProxy::webPage):
     49        Remove .get() now that the page map uses weak references.
     50
     51        (WebKit::WebProcessProxy::createWebPage):
     52        This now returns the created web page proxy.
     53
    1542011-04-11  Adam Roben  <aroben@apple.com>
    255
  • trunk/Source/WebKit2/UIProcess/WebContext.cpp

    r82906 r83499  
    336336#endif
    337337
     338    // This can cause the web context to be destroyed.
    338339    m_process = 0;
    339340}
    340341
    341 WebPageProxy* WebContext::createWebPage(PageClient* pageClient, WebPageGroup* pageGroup)
     342PassRefPtr<WebPageProxy> WebContext::createWebPage(PageClient* pageClient, WebPageGroup* pageGroup)
    342343{
    343344    ensureWebProcess();
     
    349350}
    350351
    351 void WebContext::relaunchProcessIfNecessary()
     352WebProcessProxy* WebContext::relaunchProcessIfNecessary()
    352353{
    353354    ensureWebProcess();
     355
     356    ASSERT(m_process);
     357    return m_process.get();
    354358}
    355359
  • trunk/Source/WebKit2/UIProcess/WebContext.h

    r82906 r83499  
    8585    void disconnectProcess(WebProcessProxy*);
    8686
    87     WebPageProxy* createWebPage(PageClient*, WebPageGroup*);
    88 
    89     void relaunchProcessIfNecessary();
     87    PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebPageGroup*);
     88
     89    WebProcessProxy* relaunchProcessIfNecessary();
    9090
    9191    const String& injectedBundlePath() const { return m_injectedBundlePath; }
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r83496 r83499  
    101101#endif
    102102
    103 PassRefPtr<WebPageProxy> WebPageProxy::create(PageClient* pageClient, WebContext* context, WebPageGroup* pageGroup, uint64_t pageID)
    104 {
    105     return adoptRef(new WebPageProxy(pageClient, context, pageGroup, pageID));
    106 }
    107 
    108 WebPageProxy::WebPageProxy(PageClient* pageClient, WebContext* context, WebPageGroup* pageGroup, uint64_t pageID)
     103PassRefPtr<WebPageProxy> WebPageProxy::create(PageClient* pageClient, PassRefPtr<WebProcessProxy> process, WebContext* context, WebPageGroup* pageGroup, uint64_t pageID)
     104{
     105    return adoptRef(new WebPageProxy(pageClient, process, context, pageGroup, pageID));
     106}
     107
     108WebPageProxy::WebPageProxy(PageClient* pageClient, PassRefPtr<WebProcessProxy> process, WebContext* context, WebPageGroup* pageGroup, uint64_t pageID)
    109109    : m_pageClient(pageClient)
     110    , m_process(process)
    110111    , m_context(context)
    111112    , m_pageGroup(pageGroup)
     
    163164WebPageProxy::~WebPageProxy()
    164165{
     166    if (!m_isClosed)
     167        close();
     168
    165169    WebContext::statistics().wkPageCount--;
    166170
     
    240244void WebPageProxy::reattachToWebProcess()
    241245{
     246    ASSERT(!isValid());
     247
    242248    m_isValid = true;
    243249
    244     context()->relaunchProcessIfNecessary();
     250    m_process = context()->relaunchProcessIfNecessary();
    245251    process()->addExistingWebPage(this, m_pageID);
    246252
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r83496 r83499  
    159159    static const Type APIType = TypePage;
    160160
    161     static PassRefPtr<WebPageProxy> create(PageClient*, WebContext*, WebPageGroup*, uint64_t pageID);
     161    static PassRefPtr<WebPageProxy> create(PageClient*, PassRefPtr<WebProcessProxy>, WebContext*, WebPageGroup*, uint64_t pageID);
    162162    virtual ~WebPageProxy();
    163163
     
    496496 
    497497private:
    498     WebPageProxy(PageClient*, WebContext*, WebPageGroup*, uint64_t pageID);
     498    WebPageProxy(PageClient*, PassRefPtr<WebProcessProxy>, WebContext*, WebPageGroup*, uint64_t pageID);
    499499
    500500    virtual Type type() const { return APIType; }
     
    713713
    714714    OwnPtr<DrawingAreaProxy> m_drawingArea;
     715    RefPtr<WebProcessProxy> m_process;
    715716    RefPtr<WebContext> m_context;
    716717    RefPtr<WebPageGroup> m_pageGroup;
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp

    r83486 r83499  
    6060}
    6161
    62 PassRefPtr<WebProcessProxy> WebProcessProxy::create(WebContext* context)
     62PassRefPtr<WebProcessProxy> WebProcessProxy::create(PassRefPtr<WebContext> context)
    6363{
    6464    return adoptRef(new WebProcessProxy(context));
    6565}
    6666
    67 WebProcessProxy::WebProcessProxy(WebContext* context)
     67WebProcessProxy::WebProcessProxy(PassRefPtr<WebContext> context)
    6868    : m_responsivenessTimer(this)
    6969    , m_context(context)
     
    164164WebPageProxy* WebProcessProxy::webPage(uint64_t pageID) const
    165165{
    166     return m_pageMap.get(pageID).get();
    167 }
    168 
    169 WebPageProxy* WebProcessProxy::createWebPage(PageClient* pageClient, WebContext* context, WebPageGroup* pageGroup)
     166    return m_pageMap.get(pageID);
     167}
     168
     169PassRefPtr<WebPageProxy> WebProcessProxy::createWebPage(PageClient* pageClient, WebContext* context, WebPageGroup* pageGroup)
    170170{
    171171    ASSERT(context->process() == this);
    172172
    173173    unsigned pageID = generatePageID();
    174     RefPtr<WebPageProxy> webPage = WebPageProxy::create(pageClient, context, pageGroup, pageID);
    175     m_pageMap.set(pageID, webPage);
    176     return webPage.get();
     174    RefPtr<WebPageProxy> webPage = WebPageProxy::create(pageClient, this, context, pageGroup, pageID);
     175    m_pageMap.set(pageID, webPage.get());
     176    return webPage.release();
    177177}
    178178
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.h

    r83498 r83499  
    5757    typedef HashMap<uint64_t, RefPtr<WebBackForwardListItem> > WebBackForwardListItemMap;
    5858
    59     static PassRefPtr<WebProcessProxy> create(WebContext*);
     59    static PassRefPtr<WebProcessProxy> create(PassRefPtr<WebContext>);
    6060    ~WebProcessProxy();
    6161
     
    7272    }
    7373
    74     WebContext* context() const { return m_context; }
     74    WebContext* context() const { return m_context.get(); }
    7575
    7676    PlatformProcessIdentifier processIdentifier() const { return m_processLauncher->processIdentifier(); }
    7777
    7878    WebPageProxy* webPage(uint64_t pageID) const;
    79     WebPageProxy* createWebPage(PageClient*, WebContext*, WebPageGroup*);
     79    PassRefPtr<WebPageProxy> createWebPage(PageClient*, WebContext*, WebPageGroup*);
    8080    void addExistingWebPage(WebPageProxy*, uint64_t pageID);
    8181    void removeWebPage(uint64_t pageID);
     
    103103
    104104private:
    105     explicit WebProcessProxy(WebContext*);
     105    explicit WebProcessProxy(PassRefPtr<WebContext>);
    106106
    107107    // Initializes the process or thread launcher which will begin launching the process.
     
    156156    RefPtr<ThreadLauncher> m_threadLauncher;
    157157
    158     WebContext* m_context;
     158    RefPtr<WebContext> m_context;
    159159
    160     HashMap<uint64_t, RefPtr<WebPageProxy> > m_pageMap;
     160    HashMap<uint64_t, WebPageProxy*> m_pageMap;
    161161    WebFrameProxyMap m_frameMap;
    162162    WebBackForwardListItemMap m_backForwardListItemMap;
Note: See TracChangeset for help on using the changeset viewer.