Changeset 167085 in webkit for trunk/Source/JavaScriptCore/replay


Ignore:
Timestamp:
Apr 10, 2014, 1:52:31 PM (11 years ago)
Author:
Brian Burg
Message:

Web Replay: memoize plugin data for navigator.mimeTypes and navigator.plugins
https://bugs.webkit.org/show_bug.cgi?id=131341

Reviewed by Timothy Hatcher.

Source/JavaScriptCore:

Add support for encoding/decoding unsigned long with EncodedValue.
It is a distinct type from uint32_t and uint64_t.

  • replay/EncodedValue.cpp:

(JSC::EncodedValue::convertTo<unsigned long>):

  • replay/EncodedValue.h:

Source/WebCore:

Information about plugins and mime types is nondeterministic and can change
at any time, whether by system events, browser settings changes, or
triggered by script. To avoid interposing on all those code paths, just
memoize the plugin data used by DOMPluginArray and DOMMimeTypeArray.

This is less efficient than controlling mutations to the underlying PluginData
of a Page, but that can be done later if better plugin support is desired.
The point of this change is to make analytics trackers deterministic across
enabling/disabling of plugins.

Test: LayoutTests/inspector/window-navigator-plugins-memoized.hml

  • plugins/DOMMimeTypeArray.cpp:

(WebCore::DOMMimeTypeArray::getPluginData):

  • plugins/DOMPluginArray.cpp:

(WebCore::DOMPluginArray::pluginData): Save or restore memoized plugin
data during capture and replay, respectively.

  • plugins/PluginData.h:

(WebCore::PluginData::PluginData): Add a constructor that uses the
provided plugin data rather than fetching live plugin data. This is
marked protected so it's only used by a subclass specifically for
deserialization.

  • replay/SerializationMethods.cpp: Add encoder specializations.

(JSC::EncodingTraits<MimeClassInfo>::encodeValue):
(JSC::EncodingTraits<MimeClassInfo>::decodeValue):
(JSC::EncodingTraits<PluginInfo>::encodeValue):
(JSC::EncodingTraits<PluginInfo>::decodeValue):
(JSC::EncodingTraits<PluginData>::encodeValue):
(JSC::DeserializedPluginData::DeserializedPluginData): Add a custom
subclass of PluginData that can be initialized from deserialized data.
(JSC::EncodingTraits<PluginData>::decodeValue):

  • replay/SerializationMethods.h:
  • replay/WebInputs.json: Add new input FetchPluginData.

LayoutTests:

Add support for different setup methods before the initial navigation of
capture and replay. This is necessary to test that the value of
navigator.plugins is the same on replay even if the underlying data changed.

  • http/tests/inspector/replay/replay-test.js:

(InspectorTestProxy.runSingleSegmentRefTest): Add calls to optional setup
functions in the test page called setupPreCapture and setupPreReplay.

Location:
trunk/Source/JavaScriptCore/replay
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/replay/EncodedValue.cpp

    r163918 r167085  
    159159}
    160160
     161template<> unsigned long EncodedValue::convertTo<unsigned long>()
     162{
     163    unsigned long result;
     164    bool castSucceeded = m_value->asNumber(&result);
     165    ASSERT_UNUSED(castSucceeded, castSucceeded);
     166
     167    return result;
     168}
     169
    161170template<> String EncodedValue::convertTo<String>()
    162171{
  • trunk/Source/JavaScriptCore/replay/EncodedValue.h

    r163918 r167085  
    9393template<> JS_EXPORT_PRIVATE uint32_t EncodedValue::convertTo<uint32_t>();
    9494template<> JS_EXPORT_PRIVATE uint64_t EncodedValue::convertTo<uint64_t>();
     95template<> JS_EXPORT_PRIVATE unsigned long EncodedValue::convertTo<unsigned long>();
    9596template<> JS_EXPORT_PRIVATE String EncodedValue::convertTo<String>();
    9697
     
    99100    typedef T DecodedType;
    100101
    101     static EncodedValue encodeValue(DecodedType);
    102102    static EncodedValue encodeValue(const DecodedType&);
    103103
     
    157157template<> struct EncodingTraits<uint32_t> : public ScalarEncodingTraits<uint32_t> { };
    158158template<> struct EncodingTraits<uint64_t> : public ScalarEncodingTraits<uint64_t> { };
     159template<> struct EncodingTraits<unsigned long> : public ScalarEncodingTraits<unsigned long> { };
    159160
    160161template<> struct EncodingTraits<String> : public ScalarEncodingTraits<String> {
Note: See TracChangeset for help on using the changeset viewer.