Replace WTF::move with WTFMove
[WebKit-https.git] / Source / WebCore / replay / SegmentedInputStorage.cpp
1 /*
2  * Copyright (C) 2013 University of Washington. All rights reserved.
3  * Copyright (C) 2014 Apple Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "config.h"
29 #include "SegmentedInputStorage.h"
30
31 #if ENABLE(WEB_REPLAY)
32
33 #if !LOG_DISABLED
34 #include "Logging.h"
35 #include "SerializationMethods.h"
36 #include <replay/EncodedValue.h>
37 #include <wtf/text/CString.h>
38 #include <wtf/text/WTFString.h>
39 #endif
40
41 namespace WebCore {
42
43 #if !LOG_DISABLED
44 // These are used to make the log spew from LOG(WebReplay, ...) more readable.
45 static const char* queueTypeToLogPrefix(InputQueue inputQueue, bool isLoad)
46 {
47     if (isLoad) {
48         switch (inputQueue) {
49         case InputQueue::EventLoopInput: return "(DSPTCH-LOAD)";
50         case InputQueue::LoaderMemoizedData: return "<LDMEMO-LOAD";
51         case InputQueue::ScriptMemoizedData: return "<---<---<---JSMEMO-LOAD";
52         case InputQueue::Count: return "ERROR!";
53         }
54     } else {
55         switch (inputQueue) {
56         case InputQueue::EventLoopInput: return ">DSPTCH-STORE";
57         case InputQueue::LoaderMemoizedData: return "<LDMEMO-STORE";
58         case InputQueue::ScriptMemoizedData: return "<---<---<---JSMEMO-STORE";
59         case InputQueue::Count: return "ERROR!";
60         }
61     }
62 }
63
64 static String jsonStringForInput(const NondeterministicInputBase& input)
65 {
66     EncodedValue encodedValue = EncodingTraits<NondeterministicInputBase>::encodeValue(input);
67     return encodedValue.asObject()->toJSONString();
68 }
69 #endif // !LOG_DISABLED
70
71 static size_t offsetForInputQueue(InputQueue inputQueue)
72 {
73     return static_cast<size_t>(inputQueue);
74 }
75
76 SegmentedInputStorage::SegmentedInputStorage()
77 {
78     for (size_t i = 0; i < offsetForInputQueue(InputQueue::Count); i++)
79         m_queues.append(new QueuedInputs);
80 }
81
82 SegmentedInputStorage::~SegmentedInputStorage()
83 {
84     for (size_t i = 0; i < offsetForInputQueue(InputQueue::Count); i++)
85         delete m_queues.at(i);
86 }
87
88 NondeterministicInputBase* SegmentedInputStorage::load(InputQueue inputQueue, size_t offset)
89 {
90     ASSERT(offset < queueSize(inputQueue));
91
92     NondeterministicInputBase* input = queue(inputQueue).at(offset).get();
93     ASSERT(input);
94
95     LOG(WebReplay, "%-20s %s: %s %s\n", "ReplayEvents", queueTypeToLogPrefix(inputQueue, true), input->type().utf8().data(), jsonStringForInput(*input).utf8().data());
96
97     return input;
98 }
99
100 void SegmentedInputStorage::store(std::unique_ptr<NondeterministicInputBase> input)
101 {
102     ASSERT_ARG(input, input);
103     ASSERT_ARG(input, input->queue() < InputQueue::Count);
104
105     LOG(WebReplay, "%-14s#%-5u %s: %s %s\n", "ReplayEvents", m_inputCount++, queueTypeToLogPrefix(input->queue(), false), input->type().utf8().data(), jsonStringForInput(*input).utf8().data());
106
107     m_queues.at(offsetForInputQueue(input->queue()))->append(WTFMove(input));
108 }
109
110 size_t SegmentedInputStorage::queueSize(InputQueue inputQueue) const
111 {
112     return queue(inputQueue).size();
113 }
114
115 const SegmentedInputStorage::QueuedInputs& SegmentedInputStorage::queue(InputQueue queue) const
116 {
117     ASSERT_ARG(queue, queue < InputQueue::Count);
118     return *m_queues.at(offsetForInputQueue(queue));
119 }
120
121 } // namespace WebCore
122
123 #endif // ENABLE(WEB_REPLAY)