Changeset 179705 in webkit


Ignore:
Timestamp:
Feb 5, 2015 1:52:11 PM (9 years ago)
Author:
Brian Burg
Message:

Clean up WebInspectorProxy and use simpler inspector levels design
https://bugs.webkit.org/show_bug.cgi?id=141135

Reviewed by Timothy Hatcher.

Inspector levels used to be managed by keeping a set of WebPageGroup
instances and doing pointer comparisons to check whether the inspected
view is itself a web inspector instance. This is unnecessary, as we
can maintain a mapping from WebPageProxy* to its corresponding level.

When an inspector instance is created, it is inserted into the mapping
along with its level. An inspector's level is 1 unless its inspected page
is in the mapping, then it is one greater that the inspected page's level.

The level is provided by inspectorLevel(), rather than a member variable.
WebInspectorProxy is created in the constructor of WebPageProxy. Thus, there
would be no chance to add the inspector page's level to the mapping before the
next level inspector tries to look it up when initializing its members.

This patch introduces other miscellaneous cleanups, such as naming m_page
to m_inspectedPage, using Ref and using an enum class for the attachment side.

  • UIProcess/API/C/WKInspector.cpp:

(WKInspectorGetPage):

  • UIProcess/API/gtk/WebKitWebViewBase.cpp:

(resizeWebKitWebViewBaseFromAllocation):

  • UIProcess/InspectorServer/efl/WebInspectorServerEfl.cpp:
  • UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:
  • UIProcess/WebInspectorProxy.cpp:

(WebKit::pageLevelMap):
(WebKit::WebInspectorProxy::WebInspectorProxy):
(WebKit::WebInspectorProxy::inspectorLevel):
(WebKit::WebInspectorProxy::inspectorPageGroupIdentifier):
(WebKit::WebInspectorProxy::inspectorPagePreferences):
(WebKit::WebInspectorProxy::invalidate):
(WebKit::WebInspectorProxy::isFront):
(WebKit::WebInspectorProxy::connect):
(WebKit::WebInspectorProxy::show):
(WebKit::WebInspectorProxy::hide):
(WebKit::WebInspectorProxy::close):
(WebKit::WebInspectorProxy::didRelaunchInspectorPageProcess):
(WebKit::WebInspectorProxy::showConsole):
(WebKit::WebInspectorProxy::showResources):
(WebKit::WebInspectorProxy::showMainResourceForFrame):
(WebKit::WebInspectorProxy::attachBottom):
(WebKit::WebInspectorProxy::attachRight):
(WebKit::WebInspectorProxy::attach):
(WebKit::WebInspectorProxy::detach):
(WebKit::WebInspectorProxy::togglePageProfiling):
(WebKit::WebInspectorProxy::isInspectorPage):
(WebKit::decidePolicyForNavigationAction):
(WebKit::WebInspectorProxy::remoteFrontendConnected):
(WebKit::WebInspectorProxy::remoteFrontendDisconnected):
(WebKit::WebInspectorProxy::dispatchMessageFromRemoteFrontend):
(WebKit::WebInspectorProxy::eagerlyCreateInspectorPage):
(WebKit::WebInspectorProxy::createInspectorPage):
(WebKit::WebInspectorProxy::didClose):
(WebKit::WebInspectorPageGroups::singleton): Deleted.
(WebKit::WebInspectorPageGroups::inspectorLevel): Deleted.
(WebKit::WebInspectorPageGroups::isInspectorPageGroup): Deleted.
(WebKit::WebInspectorPageGroups::inspectorPageGroupLevel): Deleted.
(WebKit::WebInspectorPageGroups::inspectorPageGroupForLevel): Deleted.
(WebKit::WebInspectorPageGroups::createInspectorPageGroup): Deleted.
(WebKit::WebInspectorProxy::~WebInspectorProxy): Deleted.
(WebKit::WebInspectorProxy::inspectorPageGroup): Deleted.
(WebKit::WebInspectorProxy::setAttachedWindowHeight): Deleted.
(WebKit::WebInspectorProxy::enableRemoteInspection): Deleted.
(WebKit::WebInspectorProxy::open): Deleted.

  • UIProcess/WebInspectorProxy.h:

(WebKit::WebInspectorProxy::create):
(WebKit::WebInspectorProxy::inspectedPage):
(WebKit::WebInspectorProxy::page): Deleted.

  • UIProcess/efl/WebInspectorProxyEfl.cpp:

(WebKit::WebInspectorProxy::platformCreateInspectorPage):

  • UIProcess/gtk/WebInspectorProxyGtk.cpp:

(WebKit::WebInspectorProxy::platformCreateInspectorPage):
(WebKit::WebInspectorProxy::dockButtonClicked):
(WebKit::WebInspectorProxy::createInspectorWindow):
(WebKit::WebInspectorProxy::platformInspectedWindowHeight):
(WebKit::WebInspectorProxy::platformInspectedWindowWidth):
(WebKit::WebInspectorProxy::platformAttach):
(WebKit::WebInspectorProxy::platformDetach):
(WebKit::WebInspectorProxy::platformSetAttachedWindowHeight):
(WebKit::WebInspectorProxy::platformSetAttachedWindowWidth):

  • UIProcess/mac/WebInspectorProxyMac.mm:

(-[WKWebInspectorProxyObjCAdapter attachRight:]):
(-[WKWebInspectorProxyObjCAdapter attachBottom:]):
(WebKit::WebInspectorProxy::createInspectorWindow):
(WebKit::WebInspectorProxy::platformCreateInspectorPage):
(WebKit::WebInspectorProxy::platformBringToFront):
(WebKit::WebInspectorProxy::windowFrameDidChange):
(WebKit::WebInspectorProxy::inspectedViewFrameDidChange):
(WebKit::WebInspectorProxy::platformInspectedWindowHeight):
(WebKit::WebInspectorProxy::platformInspectedWindowWidth):
(WebKit::WebInspectorProxy::platformAttach):
(WebKit::WebInspectorProxy::platformDetach):
(-[WKWebInspectorProxyObjCAdapter close]): Deleted.

Location:
trunk/Source/WebKit2
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r179704 r179705  
     12015-02-05  Brian J. Burg  <burg@cs.washington.edu>
     2
     3        Clean up WebInspectorProxy and use simpler inspector levels design
     4        https://bugs.webkit.org/show_bug.cgi?id=141135
     5
     6        Reviewed by Timothy Hatcher.
     7
     8        Inspector levels used to be managed by keeping a set of WebPageGroup
     9        instances and doing pointer comparisons to check whether the inspected
     10        view is itself a web inspector instance. This is unnecessary, as we
     11        can maintain a mapping from WebPageProxy* to its corresponding level.
     12
     13        When an inspector instance is created, it is inserted into the mapping
     14        along with its level. An inspector's level is 1 unless its inspected page
     15        is in the mapping, then it is one greater that the inspected page's level.
     16
     17        The level is provided by inspectorLevel(), rather than a member variable.
     18        WebInspectorProxy is created in the constructor of WebPageProxy. Thus, there
     19        would be no chance to add the inspector page's level to the mapping before the
     20        next level inspector tries to look it up when initializing its members.
     21
     22        This patch introduces other miscellaneous cleanups, such as naming m_page
     23        to m_inspectedPage, using Ref and using an enum class for the attachment side.
     24
     25        * UIProcess/API/C/WKInspector.cpp:
     26        (WKInspectorGetPage):
     27        * UIProcess/API/gtk/WebKitWebViewBase.cpp:
     28        (resizeWebKitWebViewBaseFromAllocation):
     29        * UIProcess/InspectorServer/efl/WebInspectorServerEfl.cpp:
     30        * UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp:
     31        * UIProcess/WebInspectorProxy.cpp:
     32        (WebKit::pageLevelMap):
     33        (WebKit::WebInspectorProxy::WebInspectorProxy):
     34        (WebKit::WebInspectorProxy::inspectorLevel):
     35        (WebKit::WebInspectorProxy::inspectorPageGroupIdentifier):
     36        (WebKit::WebInspectorProxy::inspectorPagePreferences):
     37        (WebKit::WebInspectorProxy::invalidate):
     38        (WebKit::WebInspectorProxy::isFront):
     39        (WebKit::WebInspectorProxy::connect):
     40        (WebKit::WebInspectorProxy::show):
     41        (WebKit::WebInspectorProxy::hide):
     42        (WebKit::WebInspectorProxy::close):
     43        (WebKit::WebInspectorProxy::didRelaunchInspectorPageProcess):
     44        (WebKit::WebInspectorProxy::showConsole):
     45        (WebKit::WebInspectorProxy::showResources):
     46        (WebKit::WebInspectorProxy::showMainResourceForFrame):
     47        (WebKit::WebInspectorProxy::attachBottom):
     48        (WebKit::WebInspectorProxy::attachRight):
     49        (WebKit::WebInspectorProxy::attach):
     50        (WebKit::WebInspectorProxy::detach):
     51        (WebKit::WebInspectorProxy::togglePageProfiling):
     52        (WebKit::WebInspectorProxy::isInspectorPage):
     53        (WebKit::decidePolicyForNavigationAction):
     54        (WebKit::WebInspectorProxy::remoteFrontendConnected):
     55        (WebKit::WebInspectorProxy::remoteFrontendDisconnected):
     56        (WebKit::WebInspectorProxy::dispatchMessageFromRemoteFrontend):
     57        (WebKit::WebInspectorProxy::eagerlyCreateInspectorPage):
     58        (WebKit::WebInspectorProxy::createInspectorPage):
     59        (WebKit::WebInspectorProxy::didClose):
     60        (WebKit::WebInspectorPageGroups::singleton): Deleted.
     61        (WebKit::WebInspectorPageGroups::inspectorLevel): Deleted.
     62        (WebKit::WebInspectorPageGroups::isInspectorPageGroup): Deleted.
     63        (WebKit::WebInspectorPageGroups::inspectorPageGroupLevel): Deleted.
     64        (WebKit::WebInspectorPageGroups::inspectorPageGroupForLevel): Deleted.
     65        (WebKit::WebInspectorPageGroups::createInspectorPageGroup): Deleted.
     66        (WebKit::WebInspectorProxy::~WebInspectorProxy): Deleted.
     67        (WebKit::WebInspectorProxy::inspectorPageGroup): Deleted.
     68        (WebKit::WebInspectorProxy::setAttachedWindowHeight): Deleted.
     69        (WebKit::WebInspectorProxy::enableRemoteInspection): Deleted.
     70        (WebKit::WebInspectorProxy::open): Deleted.
     71        * UIProcess/WebInspectorProxy.h:
     72        (WebKit::WebInspectorProxy::create):
     73        (WebKit::WebInspectorProxy::inspectedPage):
     74        (WebKit::WebInspectorProxy::page): Deleted.
     75        * UIProcess/efl/WebInspectorProxyEfl.cpp:
     76        (WebKit::WebInspectorProxy::platformCreateInspectorPage):
     77        * UIProcess/gtk/WebInspectorProxyGtk.cpp:
     78        (WebKit::WebInspectorProxy::platformCreateInspectorPage):
     79        (WebKit::WebInspectorProxy::dockButtonClicked):
     80        (WebKit::WebInspectorProxy::createInspectorWindow):
     81        (WebKit::WebInspectorProxy::platformInspectedWindowHeight):
     82        (WebKit::WebInspectorProxy::platformInspectedWindowWidth):
     83        (WebKit::WebInspectorProxy::platformAttach):
     84        (WebKit::WebInspectorProxy::platformDetach):
     85        (WebKit::WebInspectorProxy::platformSetAttachedWindowHeight):
     86        (WebKit::WebInspectorProxy::platformSetAttachedWindowWidth):
     87        * UIProcess/mac/WebInspectorProxyMac.mm:
     88        (-[WKWebInspectorProxyObjCAdapter attachRight:]):
     89        (-[WKWebInspectorProxyObjCAdapter attachBottom:]):
     90        (WebKit::WebInspectorProxy::createInspectorWindow):
     91        (WebKit::WebInspectorProxy::platformCreateInspectorPage):
     92        (WebKit::WebInspectorProxy::platformBringToFront):
     93        (WebKit::WebInspectorProxy::windowFrameDidChange):
     94        (WebKit::WebInspectorProxy::inspectedViewFrameDidChange):
     95        (WebKit::WebInspectorProxy::platformInspectedWindowHeight):
     96        (WebKit::WebInspectorProxy::platformInspectedWindowWidth):
     97        (WebKit::WebInspectorProxy::platformAttach):
     98        (WebKit::WebInspectorProxy::platformDetach):
     99        (-[WKWebInspectorProxyObjCAdapter close]): Deleted.
     100
    11012015-02-05  Chris Dumez  <cdumez@apple.com>
    2102
  • trunk/Source/WebKit2/UIProcess/API/C/WKInspector.cpp

    r178820 r179705  
    4242WKPageRef WKInspectorGetPage(WKInspectorRef inspectorRef)
    4343{
    44     return toAPI(toImpl(inspectorRef)->page());
     44    return toAPI(toImpl(inspectorRef)->inspectedPage());
    4545}
    4646
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebViewBase.cpp

    r179397 r179705  
    592592        GtkAllocation childAllocation = viewRect;
    593593
    594         if (priv->inspectorAttachmentSide == AttachmentSideBottom) {
     594        if (priv->inspectorAttachmentSide == AttachmentSide::Bottom) {
    595595            int inspectorViewHeight = std::min(static_cast<int>(priv->inspectorViewSize), allocation->height);
    596596            childAllocation.x = 0;
  • trunk/Source/WebKit2/UIProcess/InspectorServer/efl/WebInspectorServerEfl.cpp

    r159674 r179705  
    8585    ClientMap::iterator end = m_clientMap.end();
    8686    for (ClientMap::iterator it = m_clientMap.begin(); it != end; ++it) {
    87         WebPageProxy* webPage = it->value->page();
     87        WebPageProxy* webPage = it->value->inspectedPage();
    8888        if (it != m_clientMap.begin())
    8989            builder.appendLiteral(", ");
  • trunk/Source/WebKit2/UIProcess/InspectorServer/gtk/WebInspectorServerGtk.cpp

    r174104 r179705  
    9595    ClientMap::iterator end = m_clientMap.end();
    9696    for (ClientMap::iterator it = m_clientMap.begin(); it != end; ++it) {
    97         WebPageProxy* webPage = it->value->page();
     97        WebPageProxy* webPage = it->value->inspectedPage();
    9898        if (it != m_clientMap.begin())
    9999            builder.appendLiteral(", ");
  • trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp

    r179573 r179705  
    5959const unsigned WebInspectorProxy::initialWindowHeight = 650;
    6060
    61 class WebInspectorPageGroups {
    62 public:
    63     static WebInspectorPageGroups& singleton()
    64     {
    65         static NeverDestroyed<WebInspectorPageGroups> instance;
    66         return instance;
    67     }
    68 
    69     unsigned inspectorLevel(WebPageGroup& inspectedPageGroup)
    70     {
    71         return isInspectorPageGroup(inspectedPageGroup) ? inspectorPageGroupLevel(inspectedPageGroup) + 1 : 1;
    72     }
    73 
    74     bool isInspectorPageGroup(WebPageGroup& group)
    75     {
    76         return m_pageGroupLevel.contains(&group);
    77     }
    78 
    79     unsigned inspectorPageGroupLevel(WebPageGroup& group)
    80     {
    81         ASSERT(isInspectorPageGroup(group));
    82         return m_pageGroupLevel.get(&group);
    83     }
    84 
    85     WebPageGroup* inspectorPageGroupForLevel(unsigned level)
    86     {
    87         // The level is the key of the HashMap, so it cannot be 0.
    88         ASSERT(level);
    89 
    90         auto iterator = m_pageGroupByLevel.find(level);
    91         if (iterator != m_pageGroupByLevel.end())
    92             return iterator->value.get();
    93 
    94         RefPtr<WebPageGroup> group = createInspectorPageGroup(level);
    95         m_pageGroupByLevel.set(level, group.get());
    96         m_pageGroupLevel.set(group.get(), level);
    97         return group.get();
    98     }
    99 
    100 private:
    101     static PassRefPtr<WebPageGroup> createInspectorPageGroup(unsigned level)
    102     {
    103         RefPtr<WebPageGroup> pageGroup = WebPageGroup::create(String::format("__WebInspectorPageGroupLevel%u__", level), false, false);
    104 
    105 #ifndef NDEBUG
    106         // Allow developers to inspect the Web Inspector in debug builds without changing settings.
    107         pageGroup->preferences().setDeveloperExtrasEnabled(true);
    108         pageGroup->preferences().setLogsPageMessagesToSystemConsoleEnabled(true);
    109 #endif
    110 
    111         pageGroup->preferences().setAllowFileAccessFromFileURLs(true);
    112 
    113         return pageGroup.release();
    114     }
    115 
    116     typedef HashMap<unsigned, RefPtr<WebPageGroup> > PageGroupByLevelMap;
    117     typedef HashMap<WebPageGroup*, unsigned> PageGroupLevelMap;
    118 
    119     PageGroupByLevelMap m_pageGroupByLevel;
    120     PageGroupLevelMap m_pageGroupLevel;
    121 };
    122 
    123 WebInspectorProxy::WebInspectorProxy(WebPageProxy* page)
    124     : m_page(page)
     61typedef HashMap<WebPageProxy*, unsigned> PageLevelMap;
     62
     63static PageLevelMap& pageLevelMap()
     64{
     65    static NeverDestroyed<PageLevelMap> map;
     66    return map;
     67}
     68
     69WebInspectorProxy::WebInspectorProxy(WebPageProxy* inspectedPage)
     70    : m_inspectedPage(inspectedPage)
    12571#if PLATFORM(MAC) && WK_API_ENABLED
    12672    , m_closeTimer(RunLoop::main(), this, &WebInspectorProxy::closeTimerFired)
    12773#endif
    12874{
    129     m_level = WebInspectorPageGroups::singleton().inspectorLevel(m_page->pageGroup());
    130     m_page->process().addMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_page->pageID(), *this);
     75    m_inspectedPage->process().addMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_inspectedPage->pageID(), *this);
    13176}
    13277
     
    13580}
    13681
    137 WebPageGroup* WebInspectorProxy::inspectorPageGroup() const
    138 {
    139     return WebInspectorPageGroups::singleton().inspectorPageGroupForLevel(m_level);
     82unsigned WebInspectorProxy::inspectorLevel() const
     83{
     84    auto findResult = pageLevelMap().find(inspectedPage());
     85    if (findResult != pageLevelMap().end())
     86        return findResult->value + 1;
     87
     88    return 1;
     89}
     90
     91String WebInspectorProxy::inspectorPageGroupIdentifier() const
     92{
     93    return String::format("__WebInspectorPageGroupLevel%u__", inspectorLevel());
    14094}
    14195
    14296WebPreferences& WebInspectorProxy::inspectorPagePreferences() const
    14397{
    144     return inspectorPageGroup()->preferences();
     98    ASSERT(m_inspectorPage);
     99    return m_inspectorPage->pageGroup().preferences();
    145100}
    146101
     
    152107#endif
    153108
    154     m_page->process().removeMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_page->pageID());
     109    m_inspectedPage->process().removeMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_inspectedPage->pageID());
    155110
    156111    didClose();
    157112    platformInvalidate();
    158113
    159     m_page = nullptr;
     114    pageLevelMap().remove(m_inspectedPage);
     115    m_inspectedPage = nullptr;
    160116}
    161117
     
    163119bool WebInspectorProxy::isFront()
    164120{
    165     if (!m_page)
     121    if (!m_inspectedPage)
    166122        return false;
    167123
     
    171127void WebInspectorProxy::connect()
    172128{
    173     if (!m_page)
     129    if (!m_inspectedPage)
    174130        return;
    175131
     
    182138    eagerlyCreateInspectorPage();
    183139
    184     m_page->process().send(Messages::WebInspector::Show(), m_page->pageID());
     140    m_inspectedPage->process().send(Messages::WebInspector::Show(), m_inspectedPage->pageID());
    185141}
    186142
    187143void WebInspectorProxy::show()
    188144{
    189     if (!m_page)
     145    if (!m_inspectedPage)
    190146        return;
    191147
     
    203159void WebInspectorProxy::hide()
    204160{
    205     if (!m_page)
     161    if (!m_inspectedPage)
    206162        return;
    207163
     
    213169void WebInspectorProxy::close()
    214170{
    215     if (!m_page)
    216         return;
    217 
    218     m_page->process().send(Messages::WebInspector::Close(), m_page->pageID());
     171    if (!m_inspectedPage)
     172        return;
     173
     174    m_inspectedPage->process().send(Messages::WebInspector::Close(), m_inspectedPage->pageID());
    219175
    220176    didClose();
     
    223179void WebInspectorProxy::didRelaunchInspectorPageProcess()
    224180{
    225     m_inspectorPage->process().addMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_page->pageID(), *this);
     181    m_inspectorPage->process().addMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_inspectedPage->pageID(), *this);
    226182    m_inspectorPage->process().assumeReadAccessToBaseURL(inspectorBaseURL());
    227183
     
    229185    // Any messages we would have sent to a terminated process need to be re-sent.
    230186
    231     m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_page->pageID(), m_underTest), m_inspectorPage->pageID());
     187    m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_inspectedPage->pageID(), m_underTest), m_inspectorPage->pageID());
    232188}
    233189
    234190void WebInspectorProxy::showConsole()
    235191{
    236     if (!m_page)
     192    if (!m_inspectedPage)
    237193        return;
    238194
    239195    eagerlyCreateInspectorPage();
    240196
    241     m_page->process().send(Messages::WebInspector::ShowConsole(), m_page->pageID());
     197    m_inspectedPage->process().send(Messages::WebInspector::ShowConsole(), m_inspectedPage->pageID());
    242198}
    243199
    244200void WebInspectorProxy::showResources()
    245201{
    246     if (!m_page)
     202    if (!m_inspectedPage)
    247203        return;
    248204
    249205    eagerlyCreateInspectorPage();
    250206
    251     m_page->process().send(Messages::WebInspector::ShowResources(), m_page->pageID());
     207    m_inspectedPage->process().send(Messages::WebInspector::ShowResources(), m_inspectedPage->pageID());
    252208}
    253209
    254210void WebInspectorProxy::showMainResourceForFrame(WebFrameProxy* frame)
    255211{
    256     if (!m_page)
     212    if (!m_inspectedPage)
    257213        return;
    258214
    259215    eagerlyCreateInspectorPage();
    260216
    261     m_page->process().send(Messages::WebInspector::ShowMainResourceForFrame(frame->frameID()), m_page->pageID());
     217    m_inspectedPage->process().send(Messages::WebInspector::ShowMainResourceForFrame(frame->frameID()), m_inspectedPage->pageID());
    262218}
    263219
    264220void WebInspectorProxy::attachBottom()
    265221{
    266     attach(AttachmentSideBottom);
     222    attach(AttachmentSide::Bottom);
    267223}
    268224
    269225void WebInspectorProxy::attachRight()
    270226{
    271     attach(AttachmentSideRight);
     227    attach(AttachmentSide::Right);
    272228}
    273229
    274230void WebInspectorProxy::attach(AttachmentSide side)
    275231{
    276     if (!m_page || !canAttach())
     232    if (!m_inspectedPage || !canAttach())
    277233        return;
    278234
     
    280236    m_attachmentSide = side;
    281237
    282     inspectorPagePreferences().setInspectorAttachmentSide(side);
     238    inspectorPagePreferences().setInspectorAttachmentSide(static_cast<uint32_t>(side));
    283239
    284240    if (m_isVisible)
    285241        inspectorPagePreferences().setInspectorStartsAttached(true);
    286242
    287     m_page->process().send(Messages::WebInspector::SetAttached(true), m_page->pageID());
     243    m_inspectedPage->process().send(Messages::WebInspector::SetAttached(true), m_inspectedPage->pageID());
    288244
    289245    switch (m_attachmentSide) {
    290     case AttachmentSideBottom:
     246    case AttachmentSide::Bottom:
    291247        m_inspectorPage->process().send(Messages::WebInspectorUI::AttachedBottom(), m_inspectorPage->pageID());
    292248        break;
    293249
    294     case AttachmentSideRight:
     250    case AttachmentSide::Right:
    295251        m_inspectorPage->process().send(Messages::WebInspectorUI::AttachedRight(), m_inspectorPage->pageID());
    296252        break;
     
    302258void WebInspectorProxy::detach()
    303259{
    304     if (!m_page)
     260    if (!m_inspectedPage)
    305261        return;
    306262
     
    310266        inspectorPagePreferences().setInspectorStartsAttached(false);
    311267
    312     m_page->process().send(Messages::WebInspector::SetAttached(false), m_page->pageID());
     268    m_inspectedPage->process().send(Messages::WebInspector::SetAttached(false), m_inspectedPage->pageID());
    313269    m_inspectorPage->process().send(Messages::WebInspectorUI::Detached(), m_inspectorPage->pageID());
    314270
     
    330286void WebInspectorProxy::togglePageProfiling()
    331287{
    332     if (!m_page)
     288    if (!m_inspectedPage)
    333289        return;
    334290
    335291    if (m_isProfilingPage)
    336         m_page->process().send(Messages::WebInspector::StopPageProfiling(), m_page->pageID());
     292        m_inspectedPage->process().send(Messages::WebInspector::StopPageProfiling(), m_inspectedPage->pageID());
    337293    else
    338         m_page->process().send(Messages::WebInspector::StartPageProfiling(), m_page->pageID());
     294        m_inspectedPage->process().send(Messages::WebInspector::StartPageProfiling(), m_inspectedPage->pageID());
    339295
    340296    // FIXME: have the WebProcess notify us on state changes.
    341297    m_isProfilingPage = !m_isProfilingPage;
    342 }
    343 
    344 bool WebInspectorProxy::isInspectorPage(WebPageProxy& page)
    345 {
    346     return WebInspectorPageGroups::singleton().isInspectorPageGroup(page.pageGroup());
    347298}
    348299
     
    360311}
    361312
     313bool WebInspectorProxy::isInspectorPage(WebPageProxy& webPage)
     314{
     315    return pageLevelMap().contains(&webPage);
     316}
     317
    362318static bool isMainOrTestInspectorPage(const WebInspectorProxy* webInspectorProxy, WKURLRequestRef requestRef)
    363319{
     
    410366
    411367    // And instead load it in the inspected page.
    412     webInspectorProxy->page()->loadRequest(toImpl(requestRef)->resourceRequest());
     368    webInspectorProxy->inspectedPage()->loadRequest(toImpl(requestRef)->resourceRequest());
    413369}
    414370
     
    422378void WebInspectorProxy::remoteFrontendConnected()
    423379{
    424     m_page->process().send(Messages::WebInspector::RemoteFrontendConnected(), m_page->pageID());
     380    m_inspectedPage->process().send(Messages::WebInspector::RemoteFrontendConnected(), m_inspectedPage->pageID());
    425381}
    426382
    427383void WebInspectorProxy::remoteFrontendDisconnected()
    428384{
    429     m_page->process().send(Messages::WebInspector::RemoteFrontendDisconnected(), m_page->pageID());
     385    m_inspectedPage->process().send(Messages::WebInspector::RemoteFrontendDisconnected(), m_inspectedPage->pageID());
    430386}
    431387
    432388void WebInspectorProxy::dispatchMessageFromRemoteFrontend(const String& message)
    433389{
    434     m_page->process().send(Messages::WebInspector::SendMessageToBackend(message), m_page->pageID());
     390    m_inspectedPage->process().send(Messages::WebInspector::SendMessageToBackend(message), m_inspectedPage->pageID());
    435391}
    436392#endif
     
    445401    if (!m_inspectorPage)
    446402        return;
     403
     404    pageLevelMap().set(m_inspectorPage, inspectorLevel());
    447405
    448406    WKPagePolicyClientV1 policyClient = {
     
    502460    WKPageSetPageLoaderClient(toAPI(m_inspectorPage), &loaderClient.base);
    503461
    504     m_inspectorPage->process().addMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_page->pageID(), *this);
     462    m_inspectorPage->process().addMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_inspectedPage->pageID(), *this);
    505463    m_inspectorPage->process().assumeReadAccessToBaseURL(inspectorBaseURL());
    506464}
     
    509467void WebInspectorProxy::createInspectorPage(IPC::Attachment connectionIdentifier, bool canAttach, bool underTest)
    510468{
    511     if (!m_page)
     469    if (!m_inspectedPage)
    512470        return;
    513471
     
    521479    m_connectionIdentifier = connectionIdentifier;
    522480
    523     m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_page->pageID(), m_underTest), m_inspectorPage->pageID());
     481    m_inspectorPage->process().send(Messages::WebInspectorUI::EstablishConnection(m_connectionIdentifier, m_inspectedPage->pageID(), m_underTest), m_inspectorPage->pageID());
    524482
    525483    if (!m_underTest) {
     
    528486        m_attachmentSide = static_cast<AttachmentSide>(inspectorPagePreferences().inspectorAttachmentSide());
    529487
    530         m_page->process().send(Messages::WebInspector::SetAttached(m_isAttached), m_page->pageID());
     488        m_inspectedPage->process().send(Messages::WebInspector::SetAttached(m_isAttached), m_inspectedPage->pageID());
    531489
    532490        if (m_isAttached) {
    533491            switch (m_attachmentSide) {
    534             case AttachmentSideBottom:
     492            case AttachmentSide::Bottom:
    535493                m_inspectorPage->process().send(Messages::WebInspectorUI::AttachedBottom(), m_inspectorPage->pageID());
    536494                break;
    537495
    538             case AttachmentSideRight:
     496            case AttachmentSide::Right:
    539497                m_inspectorPage->process().send(Messages::WebInspectorUI::AttachedRight(), m_inspectorPage->pageID());
    540498                break;
     
    562520        return;
    563521
    564     m_inspectorPage->process().removeMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_page->pageID());
     522    m_inspectorPage->process().removeMessageReceiver(Messages::WebInspectorProxy::messageReceiverName(), m_inspectedPage->pageID());
    565523    m_inspectorPage = nullptr;
    566524
  • trunk/Source/WebKit2/UIProcess/WebInspectorProxy.h

    r179573 r179705  
    6565class WebProcessPool;
    6666
    67 enum AttachmentSide {
    68     AttachmentSideBottom,
    69     AttachmentSideRight
     67enum class AttachmentSide {
     68    Bottom,
     69    Right
    7070};
    7171
    7272class WebInspectorProxy : public API::ObjectImpl<API::Object::Type::Inspector>, public IPC::MessageReceiver {
    7373public:
    74     static PassRefPtr<WebInspectorProxy> create(WebPageProxy* page)
     74    static Ref<WebInspectorProxy> create(WebPageProxy* inspectedPage)
    7575    {
    76         return adoptRef(new WebInspectorProxy(page));
     76        return adoptRef(*new WebInspectorProxy(inspectedPage));
    7777    }
    7878
     
    8282
    8383    // Public APIs
    84     WebPageProxy* page() const { return m_page; }
     84    WebPageProxy* inspectedPage() const { return m_inspectedPage; }
    8585
    8686    bool isConnected() const { return !!m_inspectorPage; }
     
    121121    void attachRight();
    122122    void attachBottom();
    123     void attach(AttachmentSide = AttachmentSideBottom);
     123    void attach(AttachmentSide = AttachmentSide::Bottom);
    124124    void detach();
    125125
     
    131131    void togglePageProfiling();
    132132
     133    static WebProcessPool& inspectorProcessPool();
    133134    static bool isInspectorPage(WebPageProxy&);
    134     static WebProcessPool& inspectorProcessPool();
    135135
    136136    // Provided by platform WebInspectorProxy implementations.
     
    193193    void open();
    194194
    195     // FIXME: this should return the page group identifier, not an instance. The Mac port cannot
    196     // directly provide a page group instance, and instances are not necessary to compute levels.
    197     WebPageGroup* inspectorPageGroup() const;
     195    // The inspector level is used to give different preferences to each inspector
     196    // level by setting a per-level page group identifier.
     197    unsigned inspectorLevel() const;
     198    String inspectorPageGroupIdentifier() const;
    198199    WebPreferences& inspectorPagePreferences() const;
    199200
     
    213214    static const unsigned initialWindowHeight;
    214215
    215     WebPageProxy* m_page {nullptr};
     216    WebPageProxy* m_inspectedPage {nullptr};
    216217    WebPageProxy* m_inspectorPage {nullptr};
    217218
     
    224225    bool m_ignoreFirstBringToFront {false};
    225226
    226     // The debugger stops all the pages in the same PageGroup. Having
    227     // all the inspectors in the same group will make it impossible to debug
    228     // the inspector code, so we use the level to make different page groups.
    229     unsigned m_level;
    230    
    231227    IPC::Attachment m_connectionIdentifier;
    232228
    233     AttachmentSide m_attachmentSide {AttachmentSideBottom};
     229    AttachmentSide m_attachmentSide {AttachmentSide::Bottom};
    234230
    235231#if PLATFORM(MAC) && WK_API_ENABLED
  • trunk/Source/WebKit2/UIProcess/efl/WebInspectorProxyEfl.cpp

    r178820 r179705  
    9090WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
    9191{
    92     ASSERT(m_page);
     92    ASSERT(m_inspectedPage);
    9393
    9494#ifdef HAVE_ECORE_X
     
    104104
    105105    WKContextRef wkContext = toAPI(&inspectorProcessPool());
    106     WKPageGroupRef wkPageGroup = toAPI(inspectorPageGroup());
     106    WKRetainPtr<WKStringRef> wkGroupIdentifier = adoptWK(WKStringCreateWithUTF8CString(inspectorPageGroupIdentifier().utf8().data()));
     107    WKPageGroupRef wkPageGroup = WKPageGroupCreateWithIdentifier(wkGroupIdentifier.get());
    107108
    108109    m_inspectorView = EWKViewCreate(wkContext, wkPageGroup, ecore_evas_get(m_inspectorWindow), /* smart */ 0);
  • trunk/Source/WebKit2/UIProcess/gtk/WebInspectorProxyGtk.cpp

    r178820 r179705  
    3131
    3232#include "WebKitWebViewBasePrivate.h"
     33#include "WebPageGroup.h"
    3334#include "WebProcessProxy.h"
    3435#include <WebCore/FileSystem.h>
     
    5960WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
    6061{
    61     ASSERT(m_page);
     62    ASSERT(inspectedPage());
    6263    ASSERT(!m_inspectorView);
    63     m_inspectorView = GTK_WIDGET(webkitWebViewBaseCreate(&inspectorProcessPool(), nullptr, inspectorPageGroup(), nullptr, nullptr));
     64    RefPtr<WebPageGroup> pageGroup = WebPageGroup::create(inspectorPageGroupIdentifier(), false, false).leakRef();
     65    m_inspectorView = GTK_WIDGET(webkitWebViewBaseCreate(&inspectorProcessPool(), nullptr, pageGroup.get(), nullptr, nullptr));
    6466    g_object_add_weak_pointer(G_OBJECT(m_inspectorView), reinterpret_cast<void**>(&m_inspectorView));
    6567    return webkitWebViewBaseGetPage(WEBKIT_WEB_VIEW_BASE(m_inspectorView));
     
    6971{
    7072    if (button == inspector->m_dockBottomButton)
    71         inspector->attach(AttachmentSideBottom);
     73        inspector->attach(AttachmentSide::Bottom);
    7274    else if (button == inspector->m_dockRightButton)
    73         inspector->attach(AttachmentSideRight);
     75        inspector->attach(AttachmentSide::Right);
    7476    else
    7577        ASSERT_NOT_REACHED();
     
    8486    m_inspectorWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    8587
    86     GtkWidget* inspectedViewParent = gtk_widget_get_toplevel(m_page->viewWidget());
     88    GtkWidget* inspectedViewParent = gtk_widget_get_toplevel(inspectedPage()->viewWidget());
    8789    if (WebCore::widgetIsOnscreenToplevelWindow(inspectedViewParent))
    8890        gtk_window_set_transient_for(GTK_WINDOW(m_inspectorWindow), GTK_WINDOW(inspectedViewParent));
     
    220222unsigned WebInspectorProxy::platformInspectedWindowHeight()
    221223{
    222     return gtk_widget_get_allocated_height(m_page->viewWidget());
     224    return gtk_widget_get_allocated_height(inspectedPage()->viewWidget());
    223225}
    224226
    225227unsigned WebInspectorProxy::platformInspectedWindowWidth()
    226228{
    227     return gtk_widget_get_allocated_width(m_page->viewWidget());
     229    return gtk_widget_get_allocated_width(inspectedPage()->viewWidget());
    228230}
    229231
     
    242244    static const unsigned minimumAttachedHeight = 250;
    243245
    244     if (m_attachmentSide == AttachmentSideBottom) {
     246    if (m_attachmentSide == AttachmentSide::Bottom) {
    245247        unsigned maximumAttachedHeight = platformInspectedWindowHeight() * 3 / 4;
    246248        platformSetAttachedWindowHeight(std::max(minimumAttachedHeight, std::min(defaultAttachedSize, maximumAttachedHeight)));
     
    253255        return;
    254256
    255     webkitWebViewBaseAddWebInspector(WEBKIT_WEB_VIEW_BASE(m_page->viewWidget()), m_inspectorView, m_attachmentSide);
     257    webkitWebViewBaseAddWebInspector(WEBKIT_WEB_VIEW_BASE(inspectedPage()->viewWidget()), m_inspectorView, m_attachmentSide);
    256258    gtk_widget_show(m_inspectorView);
    257259}
     
    259261void WebInspectorProxy::platformDetach()
    260262{
    261     if (!m_page->isValid())
     263    if (!inspectedPage()->isValid())
    262264        return;
    263265
     
    281283
    282284    m_client.didChangeAttachedHeight(this, height);
    283     webkitWebViewBaseSetInspectorViewSize(WEBKIT_WEB_VIEW_BASE(m_page->viewWidget()), height);
     285    webkitWebViewBaseSetInspectorViewSize(WEBKIT_WEB_VIEW_BASE(inspectedPage()->viewWidget()), height);
    284286}
    285287
     
    290292
    291293    m_client.didChangeAttachedWidth(this, width);
    292     webkitWebViewBaseSetInspectorViewSize(WEBKIT_WEB_VIEW_BASE(m_page->viewWidget()), width);
     294    webkitWebViewBaseSetInspectorViewSize(WEBKIT_WEB_VIEW_BASE(inspectedPage()->viewWidget()), width);
    293295}
    294296
  • trunk/Source/WebKit2/UIProcess/mac/WebInspectorProxyMac.mm

    r179573 r179705  
    115115- (IBAction)attachRight:(id)sender
    116116{
    117     static_cast<WebInspectorProxy*>(_inspectorProxy)->attach(AttachmentSideRight);
     117    static_cast<WebInspectorProxy*>(_inspectorProxy)->attach(AttachmentSide::Right);
    118118}
    119119
    120120- (IBAction)attachBottom:(id)sender
    121121{
    122     static_cast<WebInspectorProxy*>(_inspectorProxy)->attach(AttachmentSideBottom);
     122    static_cast<WebInspectorProxy*>(_inspectorProxy)->attach(AttachmentSide::Bottom);
    123123}
    124124
     
    286286        } else
    287287            WKOpenPanelResultListenerCancel(listener);
    288        
     288
    289289        WKRelease(listener);
    290290    }];
     
    349349
    350350    // Restore the saved window frame, if there was one.
    351     NSString *savedWindowFrameString = page()->pageGroup().preferences().inspectorWindowFrame();
     351    NSString *savedWindowFrameString = inspectedPage()->pageGroup().preferences().inspectorWindowFrame();
    352352    NSRect savedWindowFrame = NSRectFromString(savedWindowFrameString);
    353353    if (!NSIsEmptyRect(savedWindowFrame))
     
    448448WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
    449449{
    450     ASSERT(m_page);
     450    ASSERT(inspectedPage());
    451451
    452452    m_closeTimer.stop();
     
    462462    NSRect initialRect;
    463463    if (m_isAttached) {
    464         NSRect inspectedViewFrame = m_page->wkView().frame;
     464        NSRect inspectedViewFrame = inspectedPage()->wkView().frame;
    465465
    466466        switch (m_attachmentSide) {
    467         case AttachmentSideBottom:
     467        case AttachmentSide::Bottom:
    468468            initialRect = NSMakeRect(0, 0, NSWidth(inspectedViewFrame), inspectorPagePreferences().inspectorAttachedHeight());
    469469            break;
    470         case AttachmentSideRight:
     470        case AttachmentSide::Right:
    471471            initialRect = NSMakeRect(0, 0, inspectorPagePreferences().inspectorAttachedWidth(), NSHeight(inspectedViewFrame));
    472472            break;
     
    475475        initialRect = NSMakeRect(0, 0, initialWindowWidth, initialWindowHeight);
    476476
    477         NSString *windowFrameString = page()->pageGroup().preferences().inspectorWindowFrame();
     477        NSString *windowFrameString = inspectedPage()->pageGroup().preferences().inspectorWindowFrame();
    478478        NSRect windowFrame = NSRectFromString(windowFrameString);
    479479        if (!NSIsEmptyRect(windowFrame))
     
    490490    preferences._allowFileAccessFromFileURLs = YES;
    491491    [configuration setProcessPool: ::WebKit::wrapper(inspectorProcessPool())];
    492     [configuration _setGroupIdentifier:inspectorPageGroup()->identifier()];
     492    [configuration _setGroupIdentifier:inspectorPageGroupIdentifier()];
    493493
    494494    m_inspectorView = adoptNS([[WKWebInspectorWKWebView alloc] initWithFrame:initialRect configuration:configuration.get()]);
     
    611611    // then we need to reopen the Inspector to get it attached to the right window.
    612612    // This can happen when dragging tabs to another window in Safari.
    613     if (m_isAttached && m_inspectorView.get().window != m_page->wkView().window) {
     613    if (m_isAttached && m_inspectorView.get().window != inspectedPage()->wkView().window) {
    614614        platformOpen();
    615615        return;
     
    720720
    721721    NSString *frameString = NSStringFromRect([m_inspectorWindow frame]);
    722     page()->pageGroup().preferences().setInspectorWindowFrame(frameString);
     722    inspectedPage()->pageGroup().preferences().setInspectorWindowFrame(frameString);
    723723}
    724724
     
    728728        return;
    729729
    730     WKView *inspectedView = m_page->wkView();
     730    WKView *inspectedView = inspectedPage()->wkView();
    731731    NSRect inspectedViewFrame = [inspectedView frame];
    732732    NSRect inspectorFrame = NSZeroRect;
     
    735735
    736736    switch (m_attachmentSide) {
    737         case AttachmentSideBottom: {
    738             if (!currentDimension)
    739                 currentDimension = NSHeight([m_inspectorView frame]);
    740 
    741             CGFloat parentHeight = NSHeight(parentBounds);
    742             CGFloat inspectorHeight = InspectorFrontendClientLocal::constrainedAttachedWindowHeight(currentDimension, parentHeight);
    743 
    744             // Preserve the top position of the inspected view so banners in Safari still work.
    745             inspectedViewFrame = NSMakeRect(0, inspectorHeight, NSWidth(parentBounds), inspectedViewTop - inspectorHeight);
    746             inspectorFrame = NSMakeRect(0, 0, NSWidth(inspectedViewFrame), inspectorHeight);
    747             break;
    748         }
    749 
    750         case AttachmentSideRight: {
    751             if (!currentDimension)
    752                 currentDimension = NSWidth([m_inspectorView frame]);
    753 
    754             CGFloat parentWidth = NSWidth(parentBounds);
    755             CGFloat inspectorWidth = InspectorFrontendClientLocal::constrainedAttachedWindowWidth(currentDimension, parentWidth);
    756 
    757             // Preserve the top position of the inspected view so banners in Safari still work. But don't use that
    758             // top position for the inspector view since the banners only stretch as wide as the the inspected view.
    759             inspectedViewFrame = NSMakeRect(0, 0, parentWidth - inspectorWidth, inspectedViewTop);
    760             CGFloat insetExcludingBanners = inspectedView._topContentInset - inspectedView._totalHeightOfBanners;
    761             inspectorFrame = NSMakeRect(parentWidth - inspectorWidth, 0, inspectorWidth, NSHeight(parentBounds) - insetExcludingBanners);
    762             break;
    763         }
     737    case AttachmentSide::Bottom: {
     738        if (!currentDimension)
     739            currentDimension = NSHeight([m_inspectorView frame]);
     740
     741        CGFloat parentHeight = NSHeight(parentBounds);
     742        CGFloat inspectorHeight = InspectorFrontendClientLocal::constrainedAttachedWindowHeight(currentDimension, parentHeight);
     743
     744        // Preserve the top position of the inspected view so banners in Safari still work.
     745        inspectedViewFrame = NSMakeRect(0, inspectorHeight, NSWidth(parentBounds), inspectedViewTop - inspectorHeight);
     746        inspectorFrame = NSMakeRect(0, 0, NSWidth(inspectedViewFrame), inspectorHeight);
     747        break;
     748    }
     749
     750    case AttachmentSide::Right: {
     751        if (!currentDimension)
     752            currentDimension = NSWidth([m_inspectorView frame]);
     753
     754        CGFloat parentWidth = NSWidth(parentBounds);
     755        CGFloat inspectorWidth = InspectorFrontendClientLocal::constrainedAttachedWindowWidth(currentDimension, parentWidth);
     756
     757        // Preserve the top position of the inspected view so banners in Safari still work. But don't use that
     758        // top position for the inspector view since the banners only stretch as wide as the the inspected view.
     759        inspectedViewFrame = NSMakeRect(0, 0, parentWidth - inspectorWidth, inspectedViewTop);
     760        CGFloat insetExcludingBanners = inspectedView._topContentInset - inspectedView._totalHeightOfBanners;
     761        inspectorFrame = NSMakeRect(parentWidth - inspectorWidth, 0, inspectorWidth, NSHeight(parentBounds) - insetExcludingBanners);
     762        break;
     763    }
    764764    }
    765765
     
    778778unsigned WebInspectorProxy::platformInspectedWindowHeight()
    779779{
    780     WKView *inspectedView = m_page->wkView();
     780    WKView *inspectedView = inspectedPage()->wkView();
    781781    NSRect inspectedViewRect = [inspectedView frame];
    782782    return static_cast<unsigned>(inspectedViewRect.size.height);
     
    785785unsigned WebInspectorProxy::platformInspectedWindowWidth()
    786786{
    787     WKView *inspectedView = m_page->wkView();
     787    WKView *inspectedView = inspectedPage()->wkView();
    788788    NSRect inspectedViewRect = [inspectedView frame];
    789789    return static_cast<unsigned>(inspectedViewRect.size.width);
     
    792792void WebInspectorProxy::platformAttach()
    793793{
    794     WKView *inspectedView = m_page->wkView();
     794    WKView *inspectedView = inspectedPage()->wkView();
    795795    [[NSNotificationCenter defaultCenter] addObserver:m_inspectorProxyObjCAdapter.get() selector:@selector(inspectedViewFrameDidChange:) name:NSViewFrameDidChangeNotification object:inspectedView];
    796796
     
    806806
    807807    switch (m_attachmentSide) {
    808     case AttachmentSideBottom:
     808    case AttachmentSide::Bottom:
    809809        [m_inspectorView setAutoresizingMask:NSViewWidthSizable | NSViewMaxYMargin];
    810810        currentDimension = inspectorPagePreferences().inspectorAttachedHeight();
    811811        break;
    812     case AttachmentSideRight:
     812    case AttachmentSide::Right:
    813813        [m_inspectorView setAutoresizingMask:NSViewHeightSizable | NSViewMinXMargin];
    814814        currentDimension = inspectorPagePreferences().inspectorAttachedWidth();
     
    825825void WebInspectorProxy::platformDetach()
    826826{
    827     WKView *inspectedView = m_page->wkView();
     827    WKView *inspectedView = inspectedPage()->wkView();
    828828    [[NSNotificationCenter defaultCenter] removeObserver:m_inspectorProxyObjCAdapter.get() name:NSViewFrameDidChangeNotification object:inspectedView];
    829829
Note: See TracChangeset for help on using the changeset viewer.