Changeset 191849 in webkit


Ignore:
Timestamp:
Oct 31, 2015 7:29:47 PM (8 years ago)
Author:
akling@apple.com
Message:

Add a debug overlay with information about web process resource usage.
<https://webkit.org/b/150599>

Reviewed by Darin Adler.

Source/JavaScriptCore:

Have Heap track the exact number of bytes allocated in CopiedBlock, MarkedBlock and
WeakBlock objects, keeping them in a single location that can be sampled by the
resource usage overlay thread.

The bulk of these changes is threading a Heap& through from sites where blocks are
allocated or freed.

  • heap/CopiedBlock.cpp:

(JSC::CopiedBlock::createNoZeroFill):
(JSC::CopiedBlock::destroy):
(JSC::CopiedBlock::create):

  • heap/CopiedBlock.h:
  • heap/CopiedSpace.cpp:

(JSC::CopiedSpace::~CopiedSpace):
(JSC::CopiedSpace::tryAllocateOversize):
(JSC::CopiedSpace::tryReallocateOversize):

  • heap/CopiedSpaceInlines.h:

(JSC::CopiedSpace::recycleEvacuatedBlock):
(JSC::CopiedSpace::recycleBorrowedBlock):
(JSC::CopiedSpace::allocateBlockForCopyingPhase):
(JSC::CopiedSpace::allocateBlock):
(JSC::CopiedSpace::startedCopying):

  • heap/Heap.cpp:

(JSC::Heap::~Heap):
(JSC::Heap::sweepNextLogicallyEmptyWeakBlock):

  • heap/Heap.h:

(JSC::Heap::blockBytesAllocated):

  • heap/HeapInlines.h:

(JSC::Heap::didAllocateBlock):
(JSC::Heap::didFreeBlock):

  • heap/MarkedAllocator.cpp:

(JSC::MarkedAllocator::allocateBlock):

  • heap/MarkedBlock.cpp:

(JSC::MarkedBlock::create):
(JSC::MarkedBlock::destroy):

  • heap/MarkedBlock.h:
  • heap/MarkedSpace.cpp:

(JSC::MarkedSpace::freeBlock):

  • heap/WeakBlock.cpp:

(JSC::WeakBlock::create):
(JSC::WeakBlock::destroy):

  • heap/WeakBlock.h:
  • heap/WeakSet.cpp:

(JSC::WeakSet::~WeakSet):
(JSC::WeakSet::addAllocator):
(JSC::WeakSet::removeAllocator):

Source/WebCore:

A new kind of PageOverlay is added behind the ENABLE(RESOURCE_USAGE_OVERLAY) flag.
It's owned by Page, but not instantiated unless the Settings::resourceUsageOverlayVisible flag is set.

All ResourceUsageOverlay objects share a single sampler thread. The thread currently runs every 500ms
and samples CPU usage, dirty memory regions, and GC heap size/capacity.

Most things in here are currently quite Mac-specific, but I will be iterating on this towards a more
cross-platform friendly solution.

There are two small changes to PageOverlay in order to support dragging the resource usage overlay:

  • A "should ignore mouse events outside bounds" state flag. This is on by default but turned off during a drag.
  • PageOverlay::bounds() will now return the override frame verbatim if one is set, instead of returning it relocated to 0,0.

Note that this is intended as a tool for WebKit engine developers to better understand memory usage.
It's not a goal to expose this information to end users.

  • WebCore.xcodeproj/project.pbxproj:
  • page/Page.cpp:

(WebCore::Page::setResourceUsageOverlayVisible):

  • page/Page.h:
  • page/PageOverlay.cpp:

(WebCore::PageOverlay::bounds):
(WebCore::PageOverlay::mouseEvent):

  • page/PageOverlay.h:
  • page/ResourceUsageOverlay.cpp: Added.

(WebCore::ResourceUsageOverlay::ResourceUsageOverlay):
(WebCore::ResourceUsageOverlay::~ResourceUsageOverlay):
(WebCore::ResourceUsageOverlay::mouseEvent):

  • page/ResourceUsageOverlay.h: Added.
  • page/Settings.cpp:

(WebCore::Settings::setResourceUsageOverlayVisible):

  • page/Settings.h:

(WebCore::Settings::resourceUsageOverlayVisible):

  • page/cocoa/ResourceUsageOverlayCocoa.mm: Added.

(-[WebOverlayLayer initWithResourceUsageOverlay:]):
(-[WebOverlayLayer drawInContext:]):
(WebCore::RingBuffer::RingBuffer):
(WebCore::RingBuffer::append):
(WebCore::RingBuffer::last):
(WebCore::RingBuffer::forEach):
(WebCore::RingBuffer::incrementIndex):
(WebCore::RingBuffer::decrementIndex):
(WebCore::sharedData):
(WebCore::ResourceUsageOverlay::platformInitialize):
(WebCore::ResourceUsageOverlay::platformDestroy):
(WebCore::drawCpuHistory):
(WebCore::drawGCHistory):
(WebCore::drawSlice):
(WebCore::drawPlate):
(WebCore::drawMemoryPie):
(WebCore::formatByteNumber):
(WebCore::showText):
(WebCore::ResourceUsageOverlay::draw):
(WebCore::dirtyPagesPerVMTag):
(WebCore::cpuUsage):
(WebCore::runSamplerThread):

  • platform/spi/cocoa/MachVMSPI.h:

Source/WebKit2:

Add WK2 preferences SPI for showing/hiding the resource usage overlay.

  • Shared/WebPreferencesDefinitions.h:
  • UIProcess/API/C/WKPreferences.cpp:

(WKPreferencesSetResourceUsageOverlayVisible):
(WKPreferencesGetResourceUsageOverlayVisible):

  • UIProcess/API/C/WKPreferencesRefPrivate.h:
  • UIProcess/API/Cocoa/WKPreferences.mm:

(-[WKPreferences _resourceUsageOverlayVisible]):
(-[WKPreferences _setResourceUsageOverlayVisible:]):

  • UIProcess/API/Cocoa/WKPreferencesPrivate.h:
  • WebProcess/WebPage/WebPage.cpp:

(WebKit::WebPage::updatePreferences):

Source/WTF:

Add ENABLE(RESOURCE_USAGE_OVERLAY) flag, enabled on Mac by default.

  • wtf/Platform.h:

Tools:

Add a menu item to the MiniBrowser so we can toggle the resource usage overlay on/off.

  • MiniBrowser/mac/SettingsController.h:
  • MiniBrowser/mac/SettingsController.m:

(-[SettingsController _populateMenu]):
(-[SettingsController validateMenuItem:]):
(-[SettingsController toggleShowResourceUsageOverlay:]):
(-[SettingsController resourceUsageOverlayVisible]):

  • MiniBrowser/mac/WK2BrowserWindowController.m:

(-[WK2BrowserWindowController didChangeSettings]):

Location:
trunk
Files:
3 added
39 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r191846 r191849  
     12015-10-31  Andreas Kling  <akling@apple.com>
     2
     3        Add a debug overlay with information about web process resource usage.
     4        <https://webkit.org/b/150599>
     5
     6        Reviewed by Darin Adler.
     7
     8        Have Heap track the exact number of bytes allocated in CopiedBlock, MarkedBlock and
     9        WeakBlock objects, keeping them in a single location that can be sampled by the
     10        resource usage overlay thread.
     11
     12        The bulk of these changes is threading a Heap& through from sites where blocks are
     13        allocated or freed.
     14
     15        * heap/CopiedBlock.cpp:
     16        (JSC::CopiedBlock::createNoZeroFill):
     17        (JSC::CopiedBlock::destroy):
     18        (JSC::CopiedBlock::create):
     19        * heap/CopiedBlock.h:
     20        * heap/CopiedSpace.cpp:
     21        (JSC::CopiedSpace::~CopiedSpace):
     22        (JSC::CopiedSpace::tryAllocateOversize):
     23        (JSC::CopiedSpace::tryReallocateOversize):
     24        * heap/CopiedSpaceInlines.h:
     25        (JSC::CopiedSpace::recycleEvacuatedBlock):
     26        (JSC::CopiedSpace::recycleBorrowedBlock):
     27        (JSC::CopiedSpace::allocateBlockForCopyingPhase):
     28        (JSC::CopiedSpace::allocateBlock):
     29        (JSC::CopiedSpace::startedCopying):
     30        * heap/Heap.cpp:
     31        (JSC::Heap::~Heap):
     32        (JSC::Heap::sweepNextLogicallyEmptyWeakBlock):
     33        * heap/Heap.h:
     34        (JSC::Heap::blockBytesAllocated):
     35        * heap/HeapInlines.h:
     36        (JSC::Heap::didAllocateBlock):
     37        (JSC::Heap::didFreeBlock):
     38        * heap/MarkedAllocator.cpp:
     39        (JSC::MarkedAllocator::allocateBlock):
     40        * heap/MarkedBlock.cpp:
     41        (JSC::MarkedBlock::create):
     42        (JSC::MarkedBlock::destroy):
     43        * heap/MarkedBlock.h:
     44        * heap/MarkedSpace.cpp:
     45        (JSC::MarkedSpace::freeBlock):
     46        * heap/WeakBlock.cpp:
     47        (JSC::WeakBlock::create):
     48        (JSC::WeakBlock::destroy):
     49        * heap/WeakBlock.h:
     50        * heap/WeakSet.cpp:
     51        (JSC::WeakSet::~WeakSet):
     52        (JSC::WeakSet::addAllocator):
     53        (JSC::WeakSet::removeAllocator):
     54
    1552015-10-30  Filip Pizlo  <fpizlo@apple.com>
    256
  • trunk/Source/JavaScriptCore/heap/CopiedBlock.cpp

    r191248 r191849  
    3434static size_t balance;
    3535
    36 CopiedBlock* CopiedBlock::createNoZeroFill(size_t capacity)
     36CopiedBlock* CopiedBlock::createNoZeroFill(Heap& heap, size_t capacity)
    3737{
    3838    if (computeBalance) {
     
    4141            dataLog("CopiedBlock Balance: ", balance, "\n");
    4242    }
    43     return new(NotNull, fastAlignedMalloc(CopiedBlock::blockSize, capacity)) CopiedBlock(capacity);
     43    CopiedBlock* block = new (NotNull, fastAlignedMalloc(CopiedBlock::blockSize, capacity)) CopiedBlock(capacity);
     44    heap.didAllocateBlock(capacity);
     45    return block;
    4446}
    4547
    46 void CopiedBlock::destroy(CopiedBlock* copiedBlock)
     48void CopiedBlock::destroy(Heap& heap, CopiedBlock* copiedBlock)
    4749{
    4850    if (computeBalance) {
     
    5153            dataLog("CopiedBlock Balance: ", balance, "\n");
    5254    }
     55    size_t capacity = copiedBlock->capacity();
    5356    copiedBlock->~CopiedBlock();
    5457    fastAlignedFree(copiedBlock);
     58    heap.didFreeBlock(capacity);
    5559}
    5660
    57 CopiedBlock* CopiedBlock::create(size_t capacity)
     61CopiedBlock* CopiedBlock::create(Heap& heap, size_t capacity)
    5862{
    59     CopiedBlock* newBlock = createNoZeroFill(capacity);
     63    CopiedBlock* newBlock = createNoZeroFill(heap, capacity);
    6064    newBlock->zeroFillWilderness();
    6165    return newBlock;
  • trunk/Source/JavaScriptCore/heap/CopiedBlock.h

    r191248 r191849  
    4242    friend class CopiedAllocator;
    4343public:
    44     static CopiedBlock* create(size_t = blockSize);
    45     static CopiedBlock* createNoZeroFill(size_t = blockSize);
    46     static void destroy(CopiedBlock*);
     44    static CopiedBlock* create(Heap&, size_t = blockSize);
     45    static CopiedBlock* createNoZeroFill(Heap&, size_t = blockSize);
     46    static void destroy(Heap&, CopiedBlock*);
    4747
    4848    void pin();
  • trunk/Source/JavaScriptCore/heap/CopiedSpace.cpp

    r190705 r191849  
    4545{
    4646    while (!m_oldGen.toSpace->isEmpty())
    47         CopiedBlock::destroy(m_oldGen.toSpace->removeHead());
     47        CopiedBlock::destroy(*heap(), m_oldGen.toSpace->removeHead());
    4848
    4949    while (!m_oldGen.fromSpace->isEmpty())
    50         CopiedBlock::destroy(m_oldGen.fromSpace->removeHead());
     50        CopiedBlock::destroy(*heap(), m_oldGen.fromSpace->removeHead());
    5151
    5252    while (!m_oldGen.oversizeBlocks.isEmpty())
    53         CopiedBlock::destroy(m_oldGen.oversizeBlocks.removeHead());
     53        CopiedBlock::destroy(*heap(), m_oldGen.oversizeBlocks.removeHead());
    5454
    5555    while (!m_newGen.toSpace->isEmpty())
    56         CopiedBlock::destroy(m_newGen.toSpace->removeHead());
     56        CopiedBlock::destroy(*heap(), m_newGen.toSpace->removeHead());
    5757
    5858    while (!m_newGen.fromSpace->isEmpty())
    59         CopiedBlock::destroy(m_newGen.fromSpace->removeHead());
     59        CopiedBlock::destroy(*heap(), m_newGen.fromSpace->removeHead());
    6060
    6161    while (!m_newGen.oversizeBlocks.isEmpty())
    62         CopiedBlock::destroy(m_newGen.oversizeBlocks.removeHead());
     62        CopiedBlock::destroy(*heap(), m_newGen.oversizeBlocks.removeHead());
    6363
    6464    ASSERT(m_oldGen.toSpace->isEmpty());
     
    9999    ASSERT(isOversize(bytes));
    100100   
    101     CopiedBlock* block = CopiedBlock::create(WTF::roundUpToMultipleOf<sizeof(double)>(sizeof(CopiedBlock) + bytes));
     101    CopiedBlock* block = CopiedBlock::create(*m_heap, WTF::roundUpToMultipleOf<sizeof(double)>(sizeof(CopiedBlock) + bytes));
    102102    m_newGen.oversizeBlocks.push(block);
    103103    m_newGen.blockFilter.add(reinterpret_cast<Bits>(block));
     
    165165            m_newGen.oversizeBlocks.remove(oldBlock);
    166166        m_blockSet.remove(oldBlock);
    167         CopiedBlock::destroy(oldBlock);
     167        CopiedBlock::destroy(*heap(), oldBlock);
    168168    }
    169169   
  • trunk/Source/JavaScriptCore/heap/CopiedSpaceInlines.h

    r191248 r191849  
    105105            m_oldGen.fromSpace->remove(block);
    106106    }
    107     CopiedBlock::destroy(block);
     107    CopiedBlock::destroy(*heap(), block);
    108108}
    109109
    110110inline void CopiedSpace::recycleBorrowedBlock(CopiedBlock* block)
    111111{
    112     CopiedBlock::destroy(block);
     112    CopiedBlock::destroy(*heap(), block);
    113113
    114114    {
     
    123123{
    124124    ASSERT(m_inCopyingPhase);
    125     CopiedBlock* block = CopiedBlock::createNoZeroFill();
     125    CopiedBlock* block = CopiedBlock::createNoZeroFill(*m_heap);
    126126
    127127    {
     
    140140    m_allocator.resetCurrentBlock();
    141141   
    142     CopiedBlock* block = CopiedBlock::create();
     142    CopiedBlock* block = CopiedBlock::create(*m_heap);
    143143       
    144144    m_newGen.toSpace->push(block);
     
    232232            oversizeBlocks->remove(block);
    233233            m_blockSet.remove(block);
    234             CopiedBlock::destroy(block);
     234            CopiedBlock::destroy(*heap(), block);
    235235        }
    236236        block = next;
  • trunk/Source/JavaScriptCore/heap/Heap.cpp

    r191248 r191849  
    364364{
    365365    for (WeakBlock* block : m_logicallyEmptyWeakBlocks)
    366         WeakBlock::destroy(block);
     366        WeakBlock::destroy(*this, block);
    367367}
    368368
     
    15731573        std::swap(m_logicallyEmptyWeakBlocks[m_indexOfNextLogicallyEmptyWeakBlockToSweep], m_logicallyEmptyWeakBlocks.last());
    15741574        m_logicallyEmptyWeakBlocks.removeLast();
    1575         WeakBlock::destroy(block);
     1575        WeakBlock::destroy(*this, block);
    15761576    } else
    15771577        m_indexOfNextLogicallyEmptyWeakBlockToSweep++;
  • trunk/Source/JavaScriptCore/heap/Heap.h

    r191248 r191849  
    179179    JS_EXPORT_PRIVATE bool unprotect(JSValue); // True when the protect count drops to 0.
    180180   
    181     size_t extraMemorySize(); // Non-GC memory referenced by GC objects.
     181    JS_EXPORT_PRIVATE size_t extraMemorySize(); // Non-GC memory referenced by GC objects.
    182182    JS_EXPORT_PRIVATE size_t size();
    183183    JS_EXPORT_PRIVATE size_t capacity();
     
    236236
    237237    void addLogicallyEmptyWeakBlock(WeakBlock*);
     238
     239#if ENABLE(RESOURCE_USAGE_OVERLAY)
     240    size_t blockBytesAllocated() const { return m_blockBytesAllocated; }
     241#endif
     242
     243    void didAllocateBlock(size_t capacity);
     244    void didFreeBlock(size_t capacity);
    238245
    239246private:
     
    440447
    441448    ParallelHelperClient m_helperClient;
     449
     450#if ENABLE(RESOURCE_USAGE_OVERLAY)
     451    size_t m_blockBytesAllocated { 0 };
     452#endif
    442453};
    443454
  • trunk/Source/JavaScriptCore/heap/HeapInlines.h

    r191248 r191849  
    308308    m_weakGCMaps.remove(weakGCMap);
    309309}
    310    
     310
     311inline void Heap::didAllocateBlock(size_t capacity)
     312{
     313#if ENABLE(RESOURCE_USAGE_OVERLAY)
     314    m_blockBytesAllocated += capacity;
     315#else
     316    UNUSED_PARAM(capacity);
     317#endif
     318}
     319
     320inline void Heap::didFreeBlock(size_t capacity)
     321{
     322#if ENABLE(RESOURCE_USAGE_OVERLAY)
     323    m_blockBytesAllocated -= capacity;
     324#else
     325    UNUSED_PARAM(capacity);
     326#endif
     327}
     328
    311329} // namespace JSC
    312330
  • trunk/Source/JavaScriptCore/heap/MarkedAllocator.cpp

    r189012 r191849  
    182182    size_t cellSize = m_cellSize ? m_cellSize : WTF::roundUpToMultipleOf<MarkedBlock::atomSize>(bytes);
    183183
    184     return MarkedBlock::create(this, blockSize, cellSize, m_needsDestruction);
     184    return MarkedBlock::create(*m_heap, this, blockSize, cellSize, m_needsDestruction);
    185185}
    186186
  • trunk/Source/JavaScriptCore/heap/MarkedBlock.cpp

    r191248 r191849  
    3636static size_t balance;
    3737
    38 MarkedBlock* MarkedBlock::create(MarkedAllocator* allocator, size_t capacity, size_t cellSize, bool needsDestruction)
     38MarkedBlock* MarkedBlock::create(Heap& heap, MarkedAllocator* allocator, size_t capacity, size_t cellSize, bool needsDestruction)
    3939{
    4040    if (computeBalance) {
     
    4343            dataLog("MarkedBlock Balance: ", balance, "\n");
    4444    }
    45     return new (NotNull, fastAlignedMalloc(blockSize, capacity)) MarkedBlock(allocator, capacity, cellSize, needsDestruction);
    46 }
    47 
    48 void MarkedBlock::destroy(MarkedBlock* block)
     45    MarkedBlock* block = new (NotNull, fastAlignedMalloc(blockSize, capacity)) MarkedBlock(allocator, capacity, cellSize, needsDestruction);
     46    heap.didAllocateBlock(capacity);
     47    return block;
     48}
     49
     50void MarkedBlock::destroy(Heap& heap, MarkedBlock* block)
    4951{
    5052    if (computeBalance) {
     
    5355            dataLog("MarkedBlock Balance: ", balance, "\n");
    5456    }
     57    size_t capacity = block->capacity();
    5558    block->~MarkedBlock();
    5659    fastAlignedFree(block);
     60    heap.didFreeBlock(capacity);
    5761}
    5862
  • trunk/Source/JavaScriptCore/heap/MarkedBlock.h

    r191015 r191849  
    107107        };
    108108
    109         static MarkedBlock* create(MarkedAllocator*, size_t capacity, size_t cellSize, bool needsDestruction);
    110         static void destroy(MarkedBlock*);
     109        static MarkedBlock* create(Heap&, MarkedAllocator*, size_t capacity, size_t cellSize, bool needsDestruction);
     110        static void destroy(Heap&, MarkedBlock*);
    111111
    112112        static bool isAtomAligned(const void*);
  • trunk/Source/JavaScriptCore/heap/MarkedSpace.cpp

    r190739 r191849  
    210210    m_capacity -= block->capacity();
    211211    m_blocks.remove(block);
    212     MarkedBlock::destroy(block);
     212    MarkedBlock::destroy(*m_heap, block);
    213213}
    214214
  • trunk/Source/JavaScriptCore/heap/WeakBlock.cpp

    r191015 r191849  
    3535namespace JSC {
    3636
    37 WeakBlock* WeakBlock::create(MarkedBlock& markedBlock)
     37WeakBlock* WeakBlock::create(Heap& heap, MarkedBlock& markedBlock)
    3838{
     39    heap.didAllocateBlock(WeakBlock::blockSize);
    3940    return new (NotNull, fastMalloc(blockSize)) WeakBlock(markedBlock);
    4041}
    4142
    42 void WeakBlock::destroy(WeakBlock* block)
     43void WeakBlock::destroy(Heap& heap, WeakBlock* block)
    4344{
    4445    block->~WeakBlock();
    4546    fastFree(block);
     47    heap.didFreeBlock(WeakBlock::blockSize);
    4648}
    4749
  • trunk/Source/JavaScriptCore/heap/WeakBlock.h

    r191015 r191849  
    3333namespace JSC {
    3434
     35class Heap;
    3536class HeapRootVisitor;
    3637class MarkedBlock;
     
    5354    };
    5455
    55     static WeakBlock* create(MarkedBlock&);
    56     static void destroy(WeakBlock*);
     56    static WeakBlock* create(Heap&, MarkedBlock&);
     57    static void destroy(Heap&, WeakBlock*);
    5758
    5859    static WeakImpl* asWeakImpl(FreeCell*);
  • trunk/Source/JavaScriptCore/heap/WeakSet.cpp

    r183769 r191849  
    3535WeakSet::~WeakSet()
    3636{
     37    Heap& heap = *this->heap();
    3738    WeakBlock* next = 0;
    3839    for (WeakBlock* block = m_blocks.head(); block; block = next) {
    3940        next = block->next();
    40         WeakBlock::destroy(block);
     41        WeakBlock::destroy(heap, block);
    4142    }
    4243    m_blocks.clear();
     
    8687WeakBlock::FreeCell* WeakSet::addAllocator()
    8788{
    88     WeakBlock* block = WeakBlock::create(m_markedBlock);
     89    WeakBlock* block = WeakBlock::create(*heap(), m_markedBlock);
    8990    heap()->didAllocate(WeakBlock::blockSize);
    9091    m_blocks.append(block);
     
    9798{
    9899    m_blocks.remove(block);
    99     WeakBlock::destroy(block);
     100    WeakBlock::destroy(*heap(), block);
    100101}
    101102
  • trunk/Source/WTF/ChangeLog

    r191803 r191849  
     12015-10-31  Andreas Kling  <akling@apple.com>
     2
     3        Add a debug overlay with information about web process resource usage.
     4        <https://webkit.org/b/150599>
     5
     6        Reviewed by Darin Adler.
     7
     8        Add ENABLE(RESOURCE_USAGE_OVERLAY) flag, enabled on Mac by default.
     9
     10        * wtf/Platform.h:
     11
    1122015-10-30  Chris Dumez  <cdumez@apple.com>
    213
  • trunk/Source/WTF/wtf/Platform.h

    r191749 r191849  
    10821082#endif
    10831083
     1084#if PLATFORM(MAC)
     1085#define ENABLE_RESOURCE_USAGE_OVERLAY 1
     1086#endif
     1087
    10841088#if PLATFORM(GTK) || PLATFORM(EFL)
    10851089#undef ENABLE_OPENTYPE_VERTICAL
  • trunk/Source/WebCore/CMakeLists.txt

    r191842 r191849  
    20462046    page/PointerLockController.cpp
    20472047    page/PrintContext.cpp
     2048    page/ResourceUsageOverlay.cpp
    20482049    page/Screen.cpp
    20492050    page/SecurityOrigin.cpp
  • trunk/Source/WebCore/ChangeLog

    r191847 r191849  
     12015-10-31  Andreas Kling  <akling@apple.com>
     2
     3        Add a debug overlay with information about web process resource usage.
     4        <https://webkit.org/b/150599>
     5
     6        Reviewed by Darin Adler.
     7
     8        A new kind of PageOverlay is added behind the ENABLE(RESOURCE_USAGE_OVERLAY) flag.
     9        It's owned by Page, but not instantiated unless the Settings::resourceUsageOverlayVisible flag is set.
     10
     11        All ResourceUsageOverlay objects share a single sampler thread. The thread currently runs every 500ms
     12        and samples CPU usage, dirty memory regions, and GC heap size/capacity.
     13
     14        Most things in here are currently quite Mac-specific, but I will be iterating on this towards a more
     15        cross-platform friendly solution.
     16
     17        There are two small changes to PageOverlay in order to support dragging the resource usage overlay:
     18
     19            - A "should ignore mouse events outside bounds" state flag. This is on by default
     20              but turned off during a drag.
     21            - PageOverlay::bounds() will now return the override frame verbatim if one is set,
     22              instead of returning it relocated to 0,0.
     23
     24        Note that this is intended as a tool for WebKit engine developers to better understand memory usage.
     25        It's not a goal to expose this information to end users.
     26
     27        * WebCore.xcodeproj/project.pbxproj:
     28        * page/Page.cpp:
     29        (WebCore::Page::setResourceUsageOverlayVisible):
     30        * page/Page.h:
     31        * page/PageOverlay.cpp:
     32        (WebCore::PageOverlay::bounds):
     33        (WebCore::PageOverlay::mouseEvent):
     34        * page/PageOverlay.h:
     35        * page/ResourceUsageOverlay.cpp: Added.
     36        (WebCore::ResourceUsageOverlay::ResourceUsageOverlay):
     37        (WebCore::ResourceUsageOverlay::~ResourceUsageOverlay):
     38        (WebCore::ResourceUsageOverlay::mouseEvent):
     39        * page/ResourceUsageOverlay.h: Added.
     40        * page/Settings.cpp:
     41        (WebCore::Settings::setResourceUsageOverlayVisible):
     42        * page/Settings.h:
     43        (WebCore::Settings::resourceUsageOverlayVisible):
     44        * page/cocoa/ResourceUsageOverlayCocoa.mm: Added.
     45        (-[WebOverlayLayer initWithResourceUsageOverlay:]):
     46        (-[WebOverlayLayer drawInContext:]):
     47        (WebCore::RingBuffer::RingBuffer):
     48        (WebCore::RingBuffer::append):
     49        (WebCore::RingBuffer::last):
     50        (WebCore::RingBuffer::forEach):
     51        (WebCore::RingBuffer::incrementIndex):
     52        (WebCore::RingBuffer::decrementIndex):
     53        (WebCore::sharedData):
     54        (WebCore::ResourceUsageOverlay::platformInitialize):
     55        (WebCore::ResourceUsageOverlay::platformDestroy):
     56        (WebCore::drawCpuHistory):
     57        (WebCore::drawGCHistory):
     58        (WebCore::drawSlice):
     59        (WebCore::drawPlate):
     60        (WebCore::drawMemoryPie):
     61        (WebCore::formatByteNumber):
     62        (WebCore::showText):
     63        (WebCore::ResourceUsageOverlay::draw):
     64        (WebCore::dirtyPagesPerVMTag):
     65        (WebCore::cpuUsage):
     66        (WebCore::runSamplerThread):
     67        * platform/spi/cocoa/MachVMSPI.h:
     68
    1692015-10-31  Brady Eidson  <beidson@apple.com>
    270
  • trunk/Source/WebCore/PlatformMac.cmake

    r191789 r191849  
    270270
    271271    page/cocoa/UserAgent.mm
     272    page/cocoa/ResourceUsageOverlayCocoa.mm
    272273
    273274    page/mac/ChromeMac.mm
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r191842 r191849  
    46264626                AD9FF6E11908391D003B61E0 /* IOSurfacePoolCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = AD9FF6E01908391D003B61E0 /* IOSurfacePoolCocoa.mm */; };
    46274627                ADB6B29818FB90240081963E /* MemoryPressureHandlerCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = ADB6B29718FB90240081963E /* MemoryPressureHandlerCocoa.mm */; };
     4628                ADBAD6EE1BCDD95500381325 /* ResourceUsageOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADBAD6EC1BCDD95000381325 /* ResourceUsageOverlay.cpp */; };
     4629                ADBAD6EF1BCDD95700381325 /* ResourceUsageOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = ADBAD6ED1BCDD95000381325 /* ResourceUsageOverlay.h */; };
    46284630                ADDA94C219687AA500453029 /* JSDocumentCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = ADDA94BF19686F8000453029 /* JSDocumentCustom.h */; settings = {ATTRIBUTES = (Private, ); }; };
    46294631                ADDF1AD71257CD9A0003A759 /* RenderSVGPath.h in Headers */ = {isa = PBXBuildFile; fileRef = ADDF1AD51257CD9A0003A759 /* RenderSVGPath.h */; };
    46304632                ADEC78F818EE5308001315C2 /* JSElementCustom.h in Headers */ = {isa = PBXBuildFile; fileRef = ADEC78F718EE5308001315C2 /* JSElementCustom.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4633                ADFE2B551BD5F61200DAB457 /* ResourceUsageOverlayCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = ADFE2B541BD5F41200DAB457 /* ResourceUsageOverlayCocoa.mm */; };
    46314634                B10B6980140C174000BC1C26 /* WebVTTToken.h in Headers */ = {isa = PBXBuildFile; fileRef = B10B697D140C174000BC1C26 /* WebVTTToken.h */; };
    46324635                B10B6981140C174000BC1C26 /* WebVTTTokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B10B697E140C174000BC1C26 /* WebVTTTokenizer.cpp */; };
     
    1220712210                AD9FF6E01908391D003B61E0 /* IOSurfacePoolCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IOSurfacePoolCocoa.mm; sourceTree = "<group>"; };
    1220812211                ADB6B29718FB90240081963E /* MemoryPressureHandlerCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MemoryPressureHandlerCocoa.mm; sourceTree = "<group>"; };
     12212                ADBAD6EC1BCDD95000381325 /* ResourceUsageOverlay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ResourceUsageOverlay.cpp; sourceTree = "<group>"; };
     12213                ADBAD6ED1BCDD95000381325 /* ResourceUsageOverlay.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceUsageOverlay.h; sourceTree = "<group>"; };
    1220912214                ADDA94BF19686F8000453029 /* JSDocumentCustom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDocumentCustom.h; sourceTree = "<group>"; };
    1221012215                ADDF1AD41257CD9A0003A759 /* RenderSVGPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGPath.cpp; sourceTree = "<group>"; };
     
    1221312218                ADE16736181050C300463A2E /* RenderPtr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderPtr.h; sourceTree = "<group>"; };
    1221412219                ADEC78F718EE5308001315C2 /* JSElementCustom.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSElementCustom.h; sourceTree = "<group>"; };
     12220                ADFE2B541BD5F41200DAB457 /* ResourceUsageOverlayCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ResourceUsageOverlayCocoa.mm; sourceTree = "<group>"; };
    1221512221                B10B697D140C174000BC1C26 /* WebVTTToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebVTTToken.h; sourceTree = "<group>"; };
    1221612222                B10B697E140C174000BC1C26 /* WebVTTTokenizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebVTTTokenizer.cpp; sourceTree = "<group>"; };
     
    1496914975                };
    1497014976/* End PBXFrameworksBuildPhase section */
    14971 
    1497214977/* Begin PBXGroup section */
    1497314978                00B9318013BA867F0035A948 /* parser */ = {
     
    1707717082                        isa = PBXGroup;
    1707817083                        children = (
     17084                                ADFE2B541BD5F41200DAB457 /* ResourceUsageOverlayCocoa.mm */,
    1707917085                                26255F0118878E110006E1FD /* UserAgent.h */,
    1708017086                                5D5975B61963637B00D00878 /* UserAgent.mm */,
     
    1750517511                        isa = PBXGroup;
    1750617512                        children = (
     17513                                ADBAD6EC1BCDD95000381325 /* ResourceUsageOverlay.cpp */,
     17514                                ADBAD6ED1BCDD95000381325 /* ResourceUsageOverlay.h */,
    1750717515                                316FE1060E6E1D8400BF6088 /* animation */,
    1750817516                                5D5975B5196362BE00D00878 /* cocoa */,
     
    2774127749                                37FD4298118368460093C029 /* TreeDepthLimit.h in Headers */,
    2774227750                                14D64B5D134A5B6B00E58FDA /* TreeScope.h in Headers */,
     27751                                ADBAD6EF1BCDD95700381325 /* ResourceUsageOverlay.h in Headers */,
    2774327752                                A77E1FF014AACB6E005B7CB6 /* TreeScopeAdopter.h in Headers */,
    2774427753                                854FE7390A2297BE0058D7AD /* TreeWalker.h in Headers */,
     
    2951629525                                BCC5BE000C0E93110011C2DB /* JSCSSStyleSheet.cpp in Sources */,
    2951729526                                FD67773A195CB14A0072E0D3 /* JSCSSSupportsRule.cpp in Sources */,
     29527                                ADFE2B551BD5F61200DAB457 /* ResourceUsageOverlayCocoa.mm in Sources */,
    2951829528                                14CF78A409F58CBF00EB3665 /* JSCSSValue.cpp in Sources */,
    2951929529                                BC20FB7F0C0E8E6C00D1447F /* JSCSSValueCustom.cpp in Sources */,
     
    3038930399                                F34742DC134362F000531BC2 /* PageDebuggerAgent.cpp in Sources */,
    3039030400                                9302B0BD0D79F82900C7EE83 /* PageGroup.cpp in Sources */,
     30401                                ADBAD6EE1BCDD95500381325 /* ResourceUsageOverlay.cpp in Sources */,
    3039130402                                7A674BDB0F9EBF4E006CF099 /* PageGroupLoadDeferrer.cpp in Sources */,
    3039230403                                2D5C9CFF19C7B52E00B3C5C1 /* PageOverlay.cpp in Sources */,
  • trunk/Source/WebCore/page/Page.cpp

    r191673 r191849  
    7474#include "RenderView.h"
    7575#include "RenderWidget.h"
     76#include "ResourceUsageOverlay.h"
    7677#include "RuntimeEnabledFeatures.h"
    7778#include "SchemeRegistry.h"
     
    17831784#endif
    17841785
     1786#if ENABLE(RESOURCE_USAGE_OVERLAY)
     1787void Page::setResourceUsageOverlayVisible(bool visible)
     1788{
     1789    if (!visible) {
     1790        m_resourceUsageOverlay = nullptr;
     1791        return;
     1792    }
     1793
     1794    if (!m_resourceUsageOverlay)
     1795        m_resourceUsageOverlay = std::make_unique<ResourceUsageOverlay>(*this);
     1796}
     1797#endif
     1798
    17851799} // namespace WebCore
  • trunk/Source/WebCore/page/Page.h

    r191673 r191849  
    110110class RenderTheme;
    111111class ReplayController;
     112class ResourceUsageOverlay;
    112113class VisibleSelection;
    113114class ScrollableArea;
     
    334335    void storageBlockingStateChanged();
    335336
     337#if ENABLE(RESOURCE_USAGE_OVERLAY)
     338    void setResourceUsageOverlayVisible(bool);
     339#endif
     340
    336341    void setDebugger(JSC::Debugger*);
    337342    JSC::Debugger* debugger() const { return m_debugger; }
     
    632637    HashSet<ViewStateChangeObserver*> m_viewStateChangeObservers;
    633638
     639#if ENABLE(RESOURCE_USAGE_OVERLAY)
     640    std::unique_ptr<ResourceUsageOverlay> m_resourceUsageOverlay;
     641#endif
     642
    634643    SessionID m_sessionID;
    635644
  • trunk/Source/WebCore/page/PageOverlay.cpp

    r189270 r191849  
    8080{
    8181    if (!m_overrideFrame.isEmpty())
    82         return IntRect(IntPoint(), m_overrideFrame.size());
     82        return m_overrideFrame;
    8383
    8484    FrameView* frameView = m_page->mainFrame().view();
     
    193193
    194194    // Ignore events outside the bounds.
    195     if (!bounds().contains(mousePositionInOverlayCoordinates))
     195    if (m_shouldIgnoreMouseEventsOutsideBounds && !bounds().contains(mousePositionInOverlayCoordinates))
    196196        return false;
    197197
  • trunk/Source/WebCore/page/PageOverlay.h

    r184066 r191849  
    111111    void setBackgroundColor(RGBA32);
    112112
     113    void setShouldIgnoreMouseEventsOutsideBounds(bool flag) { m_shouldIgnoreMouseEventsOutsideBounds = flag; }
     114
    113115    // FIXME: PageOverlay should own its layer, instead of PageOverlayController.
    114116    WEBCORE_EXPORT GraphicsLayer& layer();
     
    141143    RGBA32 m_backgroundColor;
    142144    PageOverlayID m_pageOverlayID;
     145
     146    bool m_shouldIgnoreMouseEventsOutsideBounds { true };
    143147};
    144148
  • trunk/Source/WebCore/page/Settings.cpp

    r189129 r191849  
    532532}
    533533
     534#if ENABLE(RESOURCE_USAGE_OVERLAY)
     535void Settings::setResourceUsageOverlayVisible(bool visible)
     536{
     537    if (m_resourceUsageOverlayVisible == visible)
     538        return;
     539
     540    m_resourceUsageOverlayVisible = visible;
     541    if (m_page)
     542        m_page->setResourceUsageOverlayVisible(visible);
     543}
     544#endif
     545
    534546#if PLATFORM(WIN)
    535547void Settings::setShouldUseHighResolutionTimers(bool shouldUseHighResolutionTimers)
  • trunk/Source/WebCore/page/Settings.h

    r188234 r191849  
    190190    bool showTiledScrollingIndicator() const { return m_showTiledScrollingIndicator; }
    191191
     192#if ENABLE(RESOURCE_USAGE_OVERLAY)
     193    bool resourceUsageOverlayVisible() const { return m_resourceUsageOverlayVisible; }
     194    WEBCORE_EXPORT void setResourceUsageOverlayVisible(bool);
     195#endif
     196
    192197#if PLATFORM(WIN)
    193198    static void setShouldUseHighResolutionTimers(bool);
     
    334339    bool m_forcePendingWebGLPolicy : 1;
    335340
     341#if ENABLE(RESOURCE_USAGE_OVERLAY)
     342    bool m_resourceUsageOverlayVisible { false };
     343#endif
     344
    336345#if USE(AVFOUNDATION)
    337346    WEBCORE_EXPORT static bool gAVFoundationEnabled;
  • trunk/Source/WebCore/platform/spi/cocoa/MachVMSPI.h

    r176265 r191849  
    4242EXTERN_C kern_return_t mach_vm_region(vm_map_t targetTask, mach_vm_address_t*, mach_vm_size_t*, vm_region_flavor_t, vm_region_info_t,
    4343                                      mach_msg_type_number_t* infoCount, mach_port_t* objectName);
     44EXTERN_C kern_return_t mach_vm_region_recurse(vm_map_t targetTask, mach_vm_address_t*, mach_vm_size_t*, uint32_t* depth, vm_region_recurse_info_t, mach_msg_type_number_t* infoCount);
    4445
    4546#endif // MachVMSPI_h
  • trunk/Source/WebKit2/ChangeLog

    r191848 r191849  
     12015-10-31  Andreas Kling  <akling@apple.com>
     2
     3        Add a debug overlay with information about web process resource usage.
     4        <https://webkit.org/b/150599>
     5
     6        Reviewed by Darin Adler.
     7
     8        Add WK2 preferences SPI for showing/hiding the resource usage overlay.
     9
     10        * Shared/WebPreferencesDefinitions.h:
     11        * UIProcess/API/C/WKPreferences.cpp:
     12        (WKPreferencesSetResourceUsageOverlayVisible):
     13        (WKPreferencesGetResourceUsageOverlayVisible):
     14        * UIProcess/API/C/WKPreferencesRefPrivate.h:
     15        * UIProcess/API/Cocoa/WKPreferences.mm:
     16        (-[WKPreferences _resourceUsageOverlayVisible]):
     17        (-[WKPreferences _setResourceUsageOverlayVisible:]):
     18        * UIProcess/API/Cocoa/WKPreferencesPrivate.h:
     19        * WebProcess/WebPage/WebPage.cpp:
     20        (WebKit::WebPage::updatePreferences):
     21
    1222015-10-31  Alex Christensen  <achristensen@webkit.org>
    223
  • trunk/Source/WebKit2/Shared/WebPreferencesDefinitions.h

    r191323 r191849  
    244244    macro(IgnoreViewportScalingConstraints, ignoreViewportScalingConstraints, Bool, bool, true) \
    245245    macro(ForceAlwaysUserScalable, forceAlwaysUserScalable, Bool, bool, false) \
     246    macro(ResourceUsageOverlayVisible, resourceUsageOverlayVisible, Bool, bool, false) \
    246247    \
    247248
  • trunk/Source/WebKit2/UIProcess/API/C/WKPreferences.cpp

    r191323 r191849  
    14071407    return toImpl(preferencesRef)->allowsAirPlayForMediaPlayback();
    14081408}
     1409
     1410void WKPreferencesSetResourceUsageOverlayVisible(WKPreferencesRef preferencesRef, bool javaEnabled)
     1411{
     1412    toImpl(preferencesRef)->setResourceUsageOverlayVisible(javaEnabled);
     1413}
     1414
     1415bool WKPreferencesGetResourceUsageOverlayVisible(WKPreferencesRef preferencesRef)
     1416{
     1417    return toImpl(preferencesRef)->resourceUsageOverlayVisible();
     1418}
     1419
  • trunk/Source/WebKit2/UIProcess/API/C/WKPreferencesRefPrivate.h

    r191323 r191849  
    384384WK_EXPORT bool WKPreferencesGetHTTPEquivEnabled(WKPreferencesRef preferences);
    385385
     386// Defaults to false.
     387WK_EXPORT void WKPreferencesSetResourceUsageOverlayVisible(WKPreferencesRef, bool);
     388WK_EXPORT bool WKPreferencesGetResourceUsageOverlayVisible(WKPreferencesRef);
     389
    386390#ifdef __cplusplus
    387391}
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKPreferences.mm

    r189513 r191849  
    218218}
    219219
     220- (BOOL)_resourceUsageOverlayVisible
     221{
     222    return _preferences->resourceUsageOverlayVisible();
     223}
     224
     225- (void)_setResourceUsageOverlayVisible:(BOOL)resourceUsageOverlayVisible
     226{
     227    _preferences->setResourceUsageOverlayVisible(resourceUsageOverlayVisible);
     228}
     229
    220230- (_WKDebugOverlayRegions)_visibleDebugOverlayRegions
    221231{
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKPreferencesPrivate.h

    r189547 r191849  
    5656@property (nonatomic, setter=_setCompositingRepaintCountersVisible:) BOOL _compositingRepaintCountersVisible;
    5757@property (nonatomic, setter=_setTiledScrollingIndicatorVisible:) BOOL _tiledScrollingIndicatorVisible;
     58@property (nonatomic, setter=_setResourceUsageOverlayVisible:) BOOL _resourceUsageOverlayVisible WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA);
    5859@property (nonatomic, setter=_setVisibleDebugOverlayRegions:) _WKDebugOverlayRegions _visibleDebugOverlayRegions WK_AVAILABLE(10_11, 9_0);
    5960@property (nonatomic, setter=_setSimpleLineLayoutDebugBordersEnabled:) BOOL _simpleLineLayoutDebugBordersEnabled WK_AVAILABLE(10_11, 9_0);
  • trunk/Source/WebKit2/WebProcess/WebPage/WebPage.cpp

    r191644 r191849  
    28252825#endif
    28262826
     2827#if ENABLE(RESOURCE_USAGE_OVERLAY)
     2828    settings.setResourceUsageOverlayVisible(store.getBoolValueForKey(WebPreferencesKey::resourceUsageOverlayVisibleKey()));
     2829#endif
     2830
    28272831    settings.setSuppressesIncrementalRendering(store.getBoolValueForKey(WebPreferencesKey::suppressesIncrementalRenderingKey()));
    28282832    settings.setIncrementalRenderingSuppressionTimeoutInSeconds(store.getDoubleValueForKey(WebPreferencesKey::incrementalRenderingSuppressionTimeoutKey()));
  • trunk/Tools/ChangeLog

    r191843 r191849  
     12015-10-31  Andreas Kling  <akling@apple.com>
     2
     3        Add a debug overlay with information about web process resource usage.
     4        <https://webkit.org/b/150599>
     5
     6        Reviewed by Darin Adler.
     7
     8        Add a menu item to the MiniBrowser so we can toggle the resource usage overlay on/off.
     9
     10        * MiniBrowser/mac/SettingsController.h:
     11        * MiniBrowser/mac/SettingsController.m:
     12        (-[SettingsController _populateMenu]):
     13        (-[SettingsController validateMenuItem:]):
     14        (-[SettingsController toggleShowResourceUsageOverlay:]):
     15        (-[SettingsController resourceUsageOverlayVisible]):
     16        * MiniBrowser/mac/WK2BrowserWindowController.m:
     17        (-[WK2BrowserWindowController didChangeSettings]):
     18
    1192015-10-31  Lucas Forschler  <lforschler@apple.com>
    220
  • trunk/Tools/MiniBrowser/mac/SettingsController.h

    r189513 r191849  
    4141@property (nonatomic, readonly) BOOL incrementalRenderingSuppressed;
    4242@property (nonatomic, readonly) BOOL tiledScrollingIndicatorVisible;
     43@property (nonatomic, readonly) BOOL resourceUsageOverlayVisible;
    4344@property (nonatomic, readonly) BOOL nonFastScrollableRegionOverlayVisible;
    4445@property (nonatomic, readonly) BOOL wheelEventHandlerRegionOverlayVisible;
  • trunk/Tools/MiniBrowser/mac/SettingsController.m

    r189513 r191849  
    3636static NSString * const SimpleLineLayoutDebugBordersEnabledPreferenceKey = @"SimpleLineLayoutDebugBordersEnabled";
    3737static NSString * const TiledScrollingIndicatorVisiblePreferenceKey = @"TiledScrollingIndicatorVisible";
     38static NSString * const ResourceUsageOverlayVisiblePreferenceKey = @"ResourceUsageOverlayVisible";
    3839static NSString * const IncrementalRenderingSuppressedPreferenceKey = @"IncrementalRenderingSuppressed";
    3940static NSString * const AcceleratedDrawingEnabledPreferenceKey = @"AcceleratedDrawingEnabled";
     
    116117    [self _addItemWithTitle:@"Use UI-Side Compositing" action:@selector(toggleUseUISideCompositing:) indented:YES];
    117118    [self _addItemWithTitle:@"Disable Per-Window Web Processes" action:@selector(togglePerWindowWebProcessesDisabled:) indented:YES];
     119    [self _addItemWithTitle:@"Show Resource Usage Overlay" action:@selector(toggleShowResourceUsageOverlay:) indented:YES];
    118120
    119121    NSMenuItem *debugOverlaysSubmenuItem = [[NSMenuItem alloc] initWithTitle:@"Debug Overlays" action:nil keyEquivalent:@""];
     
    159161    else if (action == @selector(toggleShowTiledScrollingIndicator:))
    160162        [menuItem setState:[self tiledScrollingIndicatorVisible] ? NSOnState : NSOffState];
     163    else if (action == @selector(toggleShowResourceUsageOverlay:))
     164        [menuItem setState:[self resourceUsageOverlayVisible] ? NSOnState : NSOffState];
    161165    else if (action == @selector(toggleUseUISideCompositing:))
    162166        [menuItem setState:[self useUISideCompositing] ? NSOnState : NSOffState];
     
    284288}
    285289
     290- (void)toggleShowResourceUsageOverlay:(id)sender
     291{
     292    [self _toggleBooleanDefault:ResourceUsageOverlayVisiblePreferenceKey];
     293}
     294
    286295- (BOOL)tiledScrollingIndicatorVisible
    287296{
    288297    return [[NSUserDefaults standardUserDefaults] boolForKey:TiledScrollingIndicatorVisiblePreferenceKey];
     298}
     299
     300- (BOOL)resourceUsageOverlayVisible
     301{
     302    return [[NSUserDefaults standardUserDefaults] boolForKey:ResourceUsageOverlayVisiblePreferenceKey];
    289303}
    290304
  • trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m

    r189513 r191849  
    343343    preferences._simpleLineLayoutDebugBordersEnabled = settings.simpleLineLayoutDebugBordersEnabled;
    344344    preferences._acceleratedDrawingEnabled = settings.acceleratedDrawingEnabled;
     345    preferences._resourceUsageOverlayVisible = settings.resourceUsageOverlayVisible;
    345346
    346347    BOOL useTransparentWindows = settings.useTransparentWindows;
Note: See TracChangeset for help on using the changeset viewer.