/* * Copyright (C) 2013 University of Washington. All rights reserved. * Copyright (C) 2014 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "SegmentedInputStorage.h" #if ENABLE(WEB_REPLAY) #if !LOG_DISABLED #include "Logging.h" #include "SerializationMethods.h" #include #include #include #endif namespace WebCore { #if !LOG_DISABLED // These are used to make the log spew from LOG(WebReplay, ...) more readable. static const char* queueTypeToLogPrefix(InputQueue inputQueue, bool isLoad) { if (isLoad) { switch (inputQueue) { case InputQueue::EventLoopInput: return "(DSPTCH-LOAD)"; case InputQueue::LoaderMemoizedData: return "DSPTCH-STORE"; case InputQueue::LoaderMemoizedData: return "::encodeValue(input); return encodedValue.asObject()->toJSONString(); } #endif // !LOG_DISABLED static size_t offsetForInputQueue(InputQueue inputQueue) { return static_cast(inputQueue); } SegmentedInputStorage::SegmentedInputStorage() { for (size_t i = 0; i < offsetForInputQueue(InputQueue::Count); i++) m_queues.append(new QueuedInputs); } SegmentedInputStorage::~SegmentedInputStorage() { for (size_t i = 0; i < offsetForInputQueue(InputQueue::Count); i++) delete m_queues.at(i); } NondeterministicInputBase* SegmentedInputStorage::load(InputQueue inputQueue, size_t offset) { ASSERT(offset < queueSize(inputQueue)); NondeterministicInputBase* input = queue(inputQueue).at(offset).get(); ASSERT(input); LOG(WebReplay, "%-20s %s: %s %s\n", "ReplayEvents", queueTypeToLogPrefix(inputQueue, true), input->type().utf8().data(), jsonStringForInput(*input).utf8().data()); return input; } void SegmentedInputStorage::store(std::unique_ptr input) { ASSERT_ARG(input, input); ASSERT_ARG(input, input->queue() < InputQueue::Count); LOG(WebReplay, "%-14s#%-5u %s: %s %s\n", "ReplayEvents", m_inputCount++, queueTypeToLogPrefix(input->queue(), false), input->type().utf8().data(), jsonStringForInput(*input).utf8().data()); m_queues.at(offsetForInputQueue(input->queue()))->append(WTFMove(input)); } size_t SegmentedInputStorage::queueSize(InputQueue inputQueue) const { return queue(inputQueue).size(); } const SegmentedInputStorage::QueuedInputs& SegmentedInputStorage::queue(InputQueue queue) const { ASSERT_ARG(queue, queue < InputQueue::Count); return *m_queues.at(offsetForInputQueue(queue)); } } // namespace WebCore #endif // ENABLE(WEB_REPLAY)