Need Setting/WKPreference that allows clients to prevent scrollbars from drawing 
on a secondary thread
https://bugs.webkit.org/show_bug.cgi?id=134778
-and corresponding-
<rdar://problem/17595333>

Reviewed by Tim Horton.


Source/WebCore: 
This is a requirement for some types of performance tests. The patch adds a new 
virtual function to ScrollableArea that forces subclasses to indicate the value of 
the Setting. This is required because Scrollbar and ScrollableArea can’t get to 
Settings on their own.

* page/FrameView.cpp:
(WebCore::FrameView::forceUpdateScrollbarsOnMainThreadForPerformanceTesting):
* page/FrameView.h:
* page/Settings.in:
* platform/ScrollableArea.h:
* platform/Scrollbar.cpp:
(WebCore::Scrollbar::supportsUpdateOnSecondaryThread):
* platform/win/PopupMenuWin.h:
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::forceUpdateScrollbarsOnMainThreadForPerformanceTesting):
* rendering/RenderLayer.h:
* rendering/RenderListBox.cpp:
(WebCore::RenderListBox::forceUpdateScrollbarsOnMainThreadForPerformanceTesting):
* rendering/RenderListBox.h:

Source/WebKit2: 
This is a requirement for some types of performance tests.

New pref.
* Shared/WebPreferencesDefinitions.h:

PDFPlugin has to implement this new ScrollableArea virtual function to indicate 
the Setting’s value.
* WebProcess/Plugins/PDF/PDFPlugin.h:
* WebProcess/Plugins/PDF/PDFPlugin.mm:
(WebKit::PDFPlugin::forceUpdateScrollbarsOnMainThreadForPerformanceTesting):

New pref.
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::updatePreferences):



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@170972 268f45cc-cd09-0410-ab3c-d52691b4dbfc
[iOS WebKit2] Some memory pressure relief tweaks.
<https://webkit.org/b/134811>

Split memory pressure relief into critical and non-critical sections.
Non-critical relief is for clearing out things that are really not
essential, e.g unused font data, text measurement caches, etc.

On iOS, only flip the "WebKit is under memory pressure" flag when we
are under *critical* memroy pressure, rather than doing it early on
and gimping ourselves because other processes are too big.

Also added logging for when we transition in/out of system pressure.

Reviewed by Geoffrey Garen.

* platform/MemoryPressureHandler.cpp:
(WebCore::MemoryPressureHandler::releaseNoncriticalMemory):
(WebCore::MemoryPressureHandler::releaseCriticalMemory):
(WebCore::MemoryPressureHandler::releaseMemory):
* platform/MemoryPressureHandler.h:
(WebCore::MemoryPressureHandler::ReliefLogger::loggingEnabled):
* platform/cocoa/MemoryPressureHandlerCocoa.mm:
(WebCore::MemoryPressureHandler::install):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@170973 268f45cc-cd09-0410-ab3c-d52691b4dbfc
Store ViewSnapshots directly on the WebBackForwardListItem
https://bugs.webkit.org/show_bug.cgi?id=134667
<rdar://problem/17082639>

Reviewed by Dan Bernstein.

Make ViewSnapshot a refcounted class. Store it directly on the back-forward item
instead of in a side map referenced by UUID. Switch to a very simple LRU eviction model for now.
This fixes a ton of snapshot management bugs; for example, we would start throwing out snapshots
in the page that was actively being interacted with *first* when evicting snapshots, instead of
preferring older snapshots. Additionally, we would not throw away snapshots when back forward items
became unreachable.

There is definitely room for improvement of the eviction mechanism, but this is closer to a time-tested implementation.

* Shared/SessionState.h:
Keep a ViewSnapshot instead of a UUID on the BackForwardListItemState.

* Shared/WebBackForwardListItem.h:
Fix some indented namespace contents.

(WebKit::WebBackForwardListItem::snapshot):
(WebKit::WebBackForwardListItem::setSnapshot):
(WebKit::WebBackForwardListItem::setSnapshotUUID): Deleted.
(WebKit::WebBackForwardListItem::snapshotUUID): Deleted.
Switch the snapshot getter/setter to operate on ViewSnapshots instead of UUIDs.

* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _takeViewSnapshot]):
* UIProcess/API/Cocoa/WKWebViewInternal.h:
* UIProcess/API/mac/WKView.mm:
(-[WKView _takeViewSnapshot]):
* UIProcess/API/mac/WKViewInternal.h:
* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::takeViewSnapshot):
* UIProcess/WebPageProxy.h:
* UIProcess/ios/PageClientImplIOS.h:
* UIProcess/ios/PageClientImplIOS.mm:
(WebKit::PageClientImpl::takeViewSnapshot):
* UIProcess/mac/PageClientImpl.h:
* UIProcess/mac/PageClientImpl.mm:
(WebKit::PageClientImpl::takeViewSnapshot):
Adopt ViewSnapshot::create, return a PassRefPtr, and class-ify ViewSnapshot.

* UIProcess/ios/ViewGestureControllerIOS.mm:
(WebKit::ViewGestureController::beginSwipeGesture):
(WebKit::ViewGestureController::endSwipeGesture):
* UIProcess/mac/ViewGestureController.h:
* UIProcess/mac/ViewGestureControllerMac.mm:
(WebKit::ViewGestureController::shouldUseSnapshotForSize):
(WebKit::ViewGestureController::beginSwipeGesture):
(WebKit::ViewGestureController::endSwipeGesture):
Grab the ViewSnapshot directly from the WebBackForwardListItem, and adopt the new functions.

* UIProcess/ios/WebMemoryPressureHandlerIOS.mm:
(WebKit::WebMemoryPressureHandler::WebMemoryPressureHandler):
Rename discardSnapshots to discardSnapshotImages, because we're really only discarding
the images; the render tree size/background color "snapshot" remains and is useful.

* UIProcess/mac/ViewSnapshotStore.h:
(WebKit::ViewSnapshot::setRenderTreeSize):
(WebKit::ViewSnapshot::renderTreeSize):
(WebKit::ViewSnapshot::setBackgroundColor):
(WebKit::ViewSnapshot::backgroundColor):
(WebKit::ViewSnapshot::setDeviceScaleFactor):
(WebKit::ViewSnapshot::deviceScaleFactor):
(WebKit::ViewSnapshot::imageSizeInBytes):
(WebKit::ViewSnapshot::surface):
(WebKit::ViewSnapshot::size):
(WebKit::ViewSnapshot::creationTime):
Make ViewSnapshot a refcounted class.
Add create functions which take an image (or slot ID), and relevant sizes.
It is expected that a ViewSnapshot is created with an image, and it is only possible
to remove that image, never to replace it. A new ViewSnapshot is required in that case.
Add setters for things that ViewSnapshotStore sets on the snapshot after the PageClient
retrieves it from the view. Add getters for things that the ViewGestureControllers need.

Remove removeSnapshotImage, getSnapshot, and the snapshot map.

* UIProcess/mac/ViewSnapshotStore.mm:
(WebKit::ViewSnapshotStore::~ViewSnapshotStore):
(WebKit::ViewSnapshotStore::didAddImageToSnapshot):
(WebKit::ViewSnapshotStore::willRemoveImageFromSnapshot):
Manage m_snapshotCacheSize and m_snapshotsWithImages via didAddImageToSnapshot and willRemoveImageFromSnapshot.
willRemoveImageFromSnapshot will -always- be called before the ViewSnapshot is destroyed.

(WebKit::ViewSnapshotStore::pruneSnapshots):
Switch to a simple LRU eviction model. As previously mentioned, it's possible to do better, but
this is much less broken than the previous implementation.

(WebKit::ViewSnapshotStore::recordSnapshot):
(WebKit::ViewSnapshotStore::discardSnapshotImages):
(WebKit::ViewSnapshot::create):
(WebKit::ViewSnapshot::ViewSnapshot):
(WebKit::ViewSnapshot::~ViewSnapshot):
(WebKit::ViewSnapshot::hasImage):
(WebKit::ViewSnapshot::clearImage):
(WebKit::ViewSnapshot::asLayerContents):
If a surface is Empty when it comes back from being volatile, throw away the surface
and notify the Store to remove it from m_snapshotCacheSize (via clearImage()).

(WebKit::ViewSnapshotStore::removeSnapshotImage): Deleted.
(WebKit::ViewSnapshotStore::getSnapshot): Deleted.
(WebKit::ViewSnapshotStore::discardSnapshots): Deleted.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@170974 268f45cc-cd09-0410-ab3c-d52691b4dbfc
ASSERT in SharedBuffer::maybeAppendDataArray() on MobileSafari launch
https://bugs.webkit.org/show_bug.cgi?id=134812
<rdar://problem/17628434>

Reviewed by Joseph Pecoraro.

Fix bug in my fix in r170930. Initialize the badly named m_shouldUsePurgeableMemory field to
false. This field indicates when it is okay to use purgeable memory and is set to true once
the resource is finished loading. By setting it to true in the constructor we were creating
purgeable memory while the resource was still being loaded and this triggered the assert.

No new tests. Should be covered by existing tests.

* platform/cf/SharedBufferCF.cpp:
(WebCore::SharedBuffer::SharedBuffer):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@170975 268f45cc-cd09-0410-ab3c-d52691b4dbfc
[MSE] Overlapping appended ranges must cause the decoder to flush and re-enqueue.
https://bugs.webkit.org/show_bug.cgi?id=134805

Reviewed by Eric Carlson.

When appending a range of media data which overlaps with an existing range, SourceBuffer
must cause the decoder to flush and re-enqueue samples. Those samples removed by appending
the overlapping range may have already been enqueued for display, and unless the decode
queue is flushed, corruption or decode errors may occur as the new samples are enqueued for
display.

Add a boolean flag onto TrackBuffer to indicate whether the decoder needs to be flushed and
re-enqueued the next time an append operation completes. Set this flag whenever samples are
removed due to overlapping or an explicit call to removeCodedFrames(). Move the contents of
sourceBufferPrivateSeekToTime() (which previously did flushing and re-enqueueing) into a new
function, reenqueueMediaForTime(), which can be called from sourceBufferPrivateAppendComplete().

Drive-by fix: findSyncSampleAfterDecodeIterator() would return the passed in iterator if that
sample is a sync-sample. Fix this to correctly return the next sync sample.

Drive-by fix: Use a SampleMap, rather than a DecodeOrderSampleMap, to track erased samples
so that the erasedSamples are correctly accounted for in both presentation and decode orders.

* Modules/mediasource/SampleMap.cpp:
(WebCore::SampleMap::empty): Add convenience method.
(WebCore::DecodeOrderSampleMap::findSyncSampleAfterDecodeIterator): Drive-by fix.
* Modules/mediasource/SampleMap.h:
(WebCore::SampleMap::decodeOrder): Added const accessor.
(WebCore::SampleMap::presentationOrder): Ditto.
(WebCore::SampleMap::addRange): Added.
* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::TrackBuffer::TrackBuffer): Add needsReenqueeing flag.
(WebCore::SourceBuffer::sourceBufferPrivateSeekToTime): Move contents into reenqueueMediaForTime().
(WebCore::SourceBuffer::sourceBufferPrivateAppendComplete): Call reenqueMediaForTime() if necessary.
(WebCore::SourceBuffer::removeCodedFrames): Set needsReenqueing.
(WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample): Ditto.
(WebCore::SourceBuffer::provideMediaData): Drive-by fix.
(WebCore::SourceBuffer::reenqueueMediaForTime): Moved from sourceBufferPrivateSeekToTime().
* Modules/mediasource/SourceBuffer.h:

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@170976 268f45cc-cd09-0410-ab3c-d52691b4dbfc