2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
27 #include "WebCoreArgumentCoders.h"
29 #include "ShareableBitmap.h"
30 #include <WebCore/AuthenticationChallenge.h>
31 #include <WebCore/CertificateInfo.h>
32 #include <WebCore/Cookie.h>
33 #include <WebCore/Credential.h>
34 #include <WebCore/Cursor.h>
35 #include <WebCore/DatabaseDetails.h>
36 #include <WebCore/DictationAlternative.h>
37 #include <WebCore/DragSession.h>
38 #include <WebCore/Editor.h>
39 #include <WebCore/FileChooser.h>
40 #include <WebCore/FilterOperation.h>
41 #include <WebCore/FilterOperations.h>
42 #include <WebCore/GraphicsContext.h>
43 #include <WebCore/GraphicsLayer.h>
44 #include <WebCore/IDBDatabaseMetadata.h>
45 #include <WebCore/IDBKeyData.h>
46 #include <WebCore/IDBKeyPath.h>
47 #include <WebCore/Image.h>
48 #include <WebCore/Length.h>
49 #include <WebCore/PluginData.h>
50 #include <WebCore/ProtectionSpace.h>
51 #include <WebCore/ResourceError.h>
52 #include <WebCore/ResourceRequest.h>
53 #include <WebCore/ResourceResponse.h>
54 #include <WebCore/ScrollingConstraints.h>
55 #include <WebCore/ScrollingCoordinator.h>
56 #include <WebCore/TextCheckerClient.h>
57 #include <WebCore/TransformationMatrix.h>
58 #include <WebCore/URL.h>
59 #include <WebCore/UserScript.h>
60 #include <WebCore/UserStyleSheet.h>
61 #include <WebCore/ViewportArguments.h>
62 #include <WebCore/WindowFeatures.h>
63 #include <wtf/text/CString.h>
64 #include <wtf/text/StringHash.h>
67 #include <WebCore/FloatQuad.h>
68 #include <WebCore/Pasteboard.h>
69 #include <WebCore/SelectionRect.h>
70 #include <WebCore/SharedBuffer.h>
71 #endif // PLATFORM(IOS)
73 using namespace WebCore;
74 using namespace WebKit;
78 void ArgumentCoder<AffineTransform>::encode(ArgumentEncoder& encoder, const AffineTransform& affineTransform)
80 SimpleArgumentCoder<AffineTransform>::encode(encoder, affineTransform);
83 bool ArgumentCoder<AffineTransform>::decode(ArgumentDecoder& decoder, AffineTransform& affineTransform)
85 return SimpleArgumentCoder<AffineTransform>::decode(decoder, affineTransform);
89 void ArgumentCoder<TransformationMatrix>::encode(ArgumentEncoder& encoder, const TransformationMatrix& transformationMatrix)
91 SimpleArgumentCoder<TransformationMatrix>::encode(encoder, transformationMatrix);
94 bool ArgumentCoder<TransformationMatrix>::decode(ArgumentDecoder& decoder, TransformationMatrix& transformationMatrix)
96 return SimpleArgumentCoder<TransformationMatrix>::decode(decoder, transformationMatrix);
99 void ArgumentCoder<FloatPoint>::encode(ArgumentEncoder& encoder, const FloatPoint& floatPoint)
101 SimpleArgumentCoder<FloatPoint>::encode(encoder, floatPoint);
104 bool ArgumentCoder<FloatPoint>::decode(ArgumentDecoder& decoder, FloatPoint& floatPoint)
106 return SimpleArgumentCoder<FloatPoint>::decode(decoder, floatPoint);
110 void ArgumentCoder<FloatPoint3D>::encode(ArgumentEncoder& encoder, const FloatPoint3D& floatPoint)
112 SimpleArgumentCoder<FloatPoint3D>::encode(encoder, floatPoint);
115 bool ArgumentCoder<FloatPoint3D>::decode(ArgumentDecoder& decoder, FloatPoint3D& floatPoint)
117 return SimpleArgumentCoder<FloatPoint3D>::decode(decoder, floatPoint);
121 void ArgumentCoder<FloatRect>::encode(ArgumentEncoder& encoder, const FloatRect& floatRect)
123 SimpleArgumentCoder<FloatRect>::encode(encoder, floatRect);
126 bool ArgumentCoder<FloatRect>::decode(ArgumentDecoder& decoder, FloatRect& floatRect)
128 return SimpleArgumentCoder<FloatRect>::decode(decoder, floatRect);
132 void ArgumentCoder<FloatSize>::encode(ArgumentEncoder& encoder, const FloatSize& floatSize)
134 SimpleArgumentCoder<FloatSize>::encode(encoder, floatSize);
137 bool ArgumentCoder<FloatSize>::decode(ArgumentDecoder& decoder, FloatSize& floatSize)
139 return SimpleArgumentCoder<FloatSize>::decode(decoder, floatSize);
144 void ArgumentCoder<FloatQuad>::encode(ArgumentEncoder& encoder, const FloatQuad& floatQuad)
146 SimpleArgumentCoder<FloatQuad>::encode(encoder, floatQuad);
149 bool ArgumentCoder<FloatQuad>::decode(ArgumentDecoder& decoder, FloatQuad& floatQuad)
151 return SimpleArgumentCoder<FloatQuad>::decode(decoder, floatQuad);
154 void ArgumentCoder<ViewportArguments>::encode(ArgumentEncoder& encoder, const ViewportArguments& viewportArguments)
156 SimpleArgumentCoder<ViewportArguments>::encode(encoder, viewportArguments);
159 bool ArgumentCoder<ViewportArguments>::decode(ArgumentDecoder& decoder, ViewportArguments& viewportArguments)
161 return SimpleArgumentCoder<ViewportArguments>::decode(decoder, viewportArguments);
163 #endif // PLATFORM(IOS)
166 void ArgumentCoder<IntPoint>::encode(ArgumentEncoder& encoder, const IntPoint& intPoint)
168 SimpleArgumentCoder<IntPoint>::encode(encoder, intPoint);
171 bool ArgumentCoder<IntPoint>::decode(ArgumentDecoder& decoder, IntPoint& intPoint)
173 return SimpleArgumentCoder<IntPoint>::decode(decoder, intPoint);
177 void ArgumentCoder<IntRect>::encode(ArgumentEncoder& encoder, const IntRect& intRect)
179 SimpleArgumentCoder<IntRect>::encode(encoder, intRect);
182 bool ArgumentCoder<IntRect>::decode(ArgumentDecoder& decoder, IntRect& intRect)
184 return SimpleArgumentCoder<IntRect>::decode(decoder, intRect);
188 void ArgumentCoder<IntSize>::encode(ArgumentEncoder& encoder, const IntSize& intSize)
190 SimpleArgumentCoder<IntSize>::encode(encoder, intSize);
193 bool ArgumentCoder<IntSize>::decode(ArgumentDecoder& decoder, IntSize& intSize)
195 return SimpleArgumentCoder<IntSize>::decode(decoder, intSize);
199 void ArgumentCoder<Length>::encode(ArgumentEncoder& encoder, const Length& length)
201 SimpleArgumentCoder<Length>::encode(encoder, length);
204 bool ArgumentCoder<Length>::decode(ArgumentDecoder& decoder, Length& length)
206 return SimpleArgumentCoder<Length>::decode(decoder, length);
210 void ArgumentCoder<ViewportAttributes>::encode(ArgumentEncoder& encoder, const ViewportAttributes& viewportAttributes)
212 SimpleArgumentCoder<ViewportAttributes>::encode(encoder, viewportAttributes);
215 bool ArgumentCoder<ViewportAttributes>::decode(ArgumentDecoder& decoder, ViewportAttributes& viewportAttributes)
217 return SimpleArgumentCoder<ViewportAttributes>::decode(decoder, viewportAttributes);
221 void ArgumentCoder<MimeClassInfo>::encode(ArgumentEncoder& encoder, const MimeClassInfo& mimeClassInfo)
223 encoder << mimeClassInfo.type << mimeClassInfo.desc << mimeClassInfo.extensions;
226 bool ArgumentCoder<MimeClassInfo>::decode(ArgumentDecoder& decoder, MimeClassInfo& mimeClassInfo)
228 if (!decoder.decode(mimeClassInfo.type))
230 if (!decoder.decode(mimeClassInfo.desc))
232 if (!decoder.decode(mimeClassInfo.extensions))
239 void ArgumentCoder<PluginInfo>::encode(ArgumentEncoder& encoder, const PluginInfo& pluginInfo)
241 encoder << pluginInfo.name << pluginInfo.file << pluginInfo.desc << pluginInfo.mimes << pluginInfo.isApplicationPlugin;
244 bool ArgumentCoder<PluginInfo>::decode(ArgumentDecoder& decoder, PluginInfo& pluginInfo)
246 if (!decoder.decode(pluginInfo.name))
248 if (!decoder.decode(pluginInfo.file))
250 if (!decoder.decode(pluginInfo.desc))
252 if (!decoder.decode(pluginInfo.mimes))
254 if (!decoder.decode(pluginInfo.isApplicationPlugin))
261 void ArgumentCoder<HTTPHeaderMap>::encode(ArgumentEncoder& encoder, const HTTPHeaderMap& headerMap)
263 encoder << static_cast<const HashMap<AtomicString, String, CaseFoldingHash>&>(headerMap);
266 bool ArgumentCoder<HTTPHeaderMap>::decode(ArgumentDecoder& decoder, HTTPHeaderMap& headerMap)
268 return decoder.decode(static_cast<HashMap<AtomicString, String, CaseFoldingHash>&>(headerMap));
272 void ArgumentCoder<AuthenticationChallenge>::encode(ArgumentEncoder& encoder, const AuthenticationChallenge& challenge)
274 encoder << challenge.protectionSpace() << challenge.proposedCredential() << challenge.previousFailureCount() << challenge.failureResponse() << challenge.error();
277 bool ArgumentCoder<AuthenticationChallenge>::decode(ArgumentDecoder& decoder, AuthenticationChallenge& challenge)
279 ProtectionSpace protectionSpace;
280 if (!decoder.decode(protectionSpace))
283 Credential proposedCredential;
284 if (!decoder.decode(proposedCredential))
287 unsigned previousFailureCount;
288 if (!decoder.decode(previousFailureCount))
291 ResourceResponse failureResponse;
292 if (!decoder.decode(failureResponse))
296 if (!decoder.decode(error))
299 challenge = AuthenticationChallenge(protectionSpace, proposedCredential, previousFailureCount, failureResponse, error);
304 void ArgumentCoder<ProtectionSpace>::encode(ArgumentEncoder& encoder, const ProtectionSpace& space)
306 encoder << space.host() << space.port() << space.realm();
307 encoder.encodeEnum(space.authenticationScheme());
308 encoder.encodeEnum(space.serverType());
311 bool ArgumentCoder<ProtectionSpace>::decode(ArgumentDecoder& decoder, ProtectionSpace& space)
314 if (!decoder.decode(host))
318 if (!decoder.decode(port))
322 if (!decoder.decode(realm))
325 ProtectionSpaceAuthenticationScheme authenticationScheme;
326 if (!decoder.decodeEnum(authenticationScheme))
329 ProtectionSpaceServerType serverType;
330 if (!decoder.decodeEnum(serverType))
333 space = ProtectionSpace(host, port, serverType, realm, authenticationScheme);
337 void ArgumentCoder<Credential>::encode(ArgumentEncoder& encoder, const Credential& credential)
339 encoder << credential.user() << credential.password();
340 encoder.encodeEnum(credential.persistence());
343 bool ArgumentCoder<Credential>::decode(ArgumentDecoder& decoder, Credential& credential)
346 if (!decoder.decode(user))
350 if (!decoder.decode(password))
353 CredentialPersistence persistence;
354 if (!decoder.decodeEnum(persistence))
357 credential = Credential(user, password, persistence);
361 static void encodeImage(ArgumentEncoder& encoder, Image* image)
363 RefPtr<ShareableBitmap> bitmap = ShareableBitmap::createShareable(image->size(), ShareableBitmap::SupportsAlpha);
364 bitmap->createGraphicsContext()->drawImage(image, ColorSpaceDeviceRGB, IntPoint());
366 ShareableBitmap::Handle handle;
367 bitmap->createHandle(handle);
372 static bool decodeImage(ArgumentDecoder& decoder, RefPtr<Image>& image)
374 ShareableBitmap::Handle handle;
375 if (!decoder.decode(handle))
378 RefPtr<ShareableBitmap> bitmap = ShareableBitmap::create(handle);
381 image = bitmap->createImage();
388 void ArgumentCoder<Cursor>::encode(ArgumentEncoder& encoder, const Cursor& cursor)
390 encoder.encodeEnum(cursor.type());
392 if (cursor.type() != Cursor::Custom)
395 if (cursor.image()->isNull()) {
396 encoder << false; // There is no valid image being encoded.
401 encodeImage(encoder, cursor.image());
402 encoder << cursor.hotSpot();
405 bool ArgumentCoder<Cursor>::decode(ArgumentDecoder& decoder, Cursor& cursor)
408 if (!decoder.decodeEnum(type))
411 if (type > Cursor::Custom)
414 if (type != Cursor::Custom) {
415 const Cursor& cursorReference = Cursor::fromType(type);
416 // Calling platformCursor here will eagerly create the platform cursor for the cursor singletons inside WebCore.
417 // This will avoid having to re-create the platform cursors over and over.
418 (void)cursorReference.platformCursor();
420 cursor = cursorReference;
424 bool isValidImagePresent;
425 if (!decoder.decode(isValidImagePresent))
428 if (!isValidImagePresent) {
429 cursor = Cursor(Image::nullImage(), IntPoint());
434 if (!decodeImage(decoder, image))
438 if (!decoder.decode(hotSpot))
441 if (!image->rect().contains(hotSpot))
444 cursor = Cursor(image.get(), hotSpot);
449 void ArgumentCoder<ResourceRequest>::encode(ArgumentEncoder& encoder, const ResourceRequest& resourceRequest)
451 if (kShouldSerializeWebCoreData) {
452 encoder << resourceRequest.url().string();
453 encoder << resourceRequest.httpMethod();
454 encoder << resourceRequest.httpHeaderFields();
456 // FIXME: Do not encode HTTP message body.
457 // 1. It can be large and thus costly to send across.
458 // 2. It is misleading to provide a body with some requests, while others use body streams, which cannot be serialized at all.
459 FormData* httpBody = resourceRequest.httpBody();
460 encoder << static_cast<bool>(httpBody);
462 encoder << httpBody->flattenToString();
464 encoder << resourceRequest.firstPartyForCookies().string();
467 #if ENABLE(CACHE_PARTITIONING)
468 encoder << resourceRequest.cachePartition();
471 encodePlatformData(encoder, resourceRequest);
474 bool ArgumentCoder<ResourceRequest>::decode(ArgumentDecoder& decoder, ResourceRequest& resourceRequest)
476 if (kShouldSerializeWebCoreData) {
477 ResourceRequest request;
480 if (!decoder.decode(url))
482 request.setURL(URL(URL(), url));
485 if (!decoder.decode(httpMethod))
487 request.setHTTPMethod(httpMethod);
489 HTTPHeaderMap headers;
490 if (!decoder.decode(headers))
492 request.addHTTPHeaderFields(headers);
495 if (!decoder.decode(hasHTTPBody))
499 if (!decoder.decode(httpBody))
501 request.setHTTPBody(FormData::create(httpBody.utf8()));
504 String firstPartyForCookies;
505 if (!decoder.decode(firstPartyForCookies))
507 request.setFirstPartyForCookies(URL(URL(), firstPartyForCookies));
509 resourceRequest = request;
512 #if ENABLE(CACHE_PARTITIONING)
513 String cachePartition;
514 if (!decoder.decode(cachePartition))
516 resourceRequest.setCachePartition(cachePartition);
519 return decodePlatformData(decoder, resourceRequest);
522 void ArgumentCoder<ResourceResponse>::encode(ArgumentEncoder& encoder, const ResourceResponse& resourceResponse)
525 bool shouldSerializeWebCoreData = !resourceResponse.platformResponseIsUpToDate();
526 encoder << shouldSerializeWebCoreData;
528 bool shouldSerializeWebCoreData = true;
531 encodePlatformData(encoder, resourceResponse);
533 if (shouldSerializeWebCoreData) {
534 bool responseIsNull = resourceResponse.isNull();
535 encoder << responseIsNull;
539 encoder << resourceResponse.url().string();
540 encoder << static_cast<int32_t>(resourceResponse.httpStatusCode());
541 encoder << resourceResponse.httpHeaderFields();
543 encoder << resourceResponse.mimeType();
544 encoder << resourceResponse.textEncodingName();
545 encoder << static_cast<int64_t>(resourceResponse.expectedContentLength());
546 encoder << resourceResponse.httpStatusText();
547 encoder << resourceResponse.suggestedFilename();
551 bool ArgumentCoder<ResourceResponse>::decode(ArgumentDecoder& decoder, ResourceResponse& resourceResponse)
554 bool hasSerializedWebCoreData;
555 if (!decoder.decode(hasSerializedWebCoreData))
558 bool hasSerializedWebCoreData = true;
561 ResourceResponse response;
563 if (!decodePlatformData(decoder, response))
566 if (hasSerializedWebCoreData) {
568 if (!decoder.decode(responseIsNull))
570 if (responseIsNull) {
571 resourceResponse = ResourceResponse();
576 if (!decoder.decode(url))
578 response.setURL(URL(URL(), url));
580 int32_t httpStatusCode;
581 if (!decoder.decode(httpStatusCode))
583 response.setHTTPStatusCode(httpStatusCode);
585 HTTPHeaderMap headers;
586 if (!decoder.decode(headers))
588 for (HTTPHeaderMap::const_iterator it = headers.begin(), end = headers.end(); it != end; ++it)
589 response.setHTTPHeaderField(it->key, it->value);
592 if (!decoder.decode(mimeType))
594 response.setMimeType(mimeType);
596 String textEncodingName;
597 if (!decoder.decode(textEncodingName))
599 response.setTextEncodingName(textEncodingName);
601 int64_t contentLength;
602 if (!decoder.decode(contentLength))
604 response.setExpectedContentLength(contentLength);
606 String httpStatusText;
607 if (!decoder.decode(httpStatusText))
609 response.setHTTPStatusText(httpStatusText);
611 String suggestedFilename;
612 if (!decoder.decode(suggestedFilename))
614 response.setSuggestedFilename(suggestedFilename);
617 resourceResponse = response;
622 void ArgumentCoder<ResourceError>::encode(ArgumentEncoder& encoder, const ResourceError& resourceError)
624 if (kShouldSerializeWebCoreData) {
625 bool errorIsNull = resourceError.isNull();
626 encoder << errorIsNull;
630 encoder << resourceError.domain();
631 encoder << resourceError.errorCode();
632 encoder << resourceError.failingURL();
633 encoder << resourceError.localizedDescription();
634 encoder << resourceError.isCancellation();
635 encoder << resourceError.isTimeout();
638 encodePlatformData(encoder, resourceError);
641 bool ArgumentCoder<ResourceError>::decode(ArgumentDecoder& decoder, ResourceError& resourceError)
643 if (kShouldSerializeWebCoreData) {
645 if (!decoder.decode(errorIsNull))
648 resourceError = ResourceError();
653 if (!decoder.decode(domain))
657 if (!decoder.decode(errorCode))
661 if (!decoder.decode(failingURL))
664 String localizedDescription;
665 if (!decoder.decode(localizedDescription))
669 if (!decoder.decode(isCancellation))
673 if (!decoder.decode(isTimeout))
676 resourceError = ResourceError(domain, errorCode, failingURL, localizedDescription);
677 resourceError.setIsCancellation(isCancellation);
678 resourceError.setIsTimeout(isTimeout);
681 return decodePlatformData(decoder, resourceError);
686 void ArgumentCoder<SelectionRect>::encode(ArgumentEncoder& encoder, const SelectionRect& selectionRect)
688 encoder << selectionRect.rect();
689 encoder << static_cast<uint32_t>(selectionRect.direction());
690 encoder << selectionRect.minX();
691 encoder << selectionRect.maxX();
692 encoder << selectionRect.maxY();
693 encoder << selectionRect.lineNumber();
694 encoder << selectionRect.isLineBreak();
695 encoder << selectionRect.isFirstOnLine();
696 encoder << selectionRect.isLastOnLine();
697 encoder << selectionRect.containsStart();
698 encoder << selectionRect.containsEnd();
699 encoder << selectionRect.isHorizontal();
702 bool ArgumentCoder<SelectionRect>::decode(ArgumentDecoder& decoder, SelectionRect& selectionRect)
704 WebCore::IntRect rect;
705 if (!decoder.decode(rect))
707 selectionRect.setRect(rect);
710 if (!decoder.decode(direction))
712 selectionRect.setDirection((WebCore::TextDirection)direction);
715 if (!decoder.decode(intValue))
717 selectionRect.setMinX(intValue);
719 if (!decoder.decode(intValue))
721 selectionRect.setMaxX(intValue);
723 if (!decoder.decode(intValue))
725 selectionRect.setMaxY(intValue);
727 if (!decoder.decode(intValue))
729 selectionRect.setLineNumber(intValue);
732 if (!decoder.decode(boolValue))
734 selectionRect.setIsLineBreak(boolValue);
736 if (!decoder.decode(boolValue))
738 selectionRect.setIsFirstOnLine(boolValue);
740 if (!decoder.decode(boolValue))
742 selectionRect.setIsLastOnLine(boolValue);
744 if (!decoder.decode(boolValue))
746 selectionRect.setContainsStart(boolValue);
748 if (!decoder.decode(boolValue))
750 selectionRect.setContainsEnd(boolValue);
752 if (!decoder.decode(boolValue))
754 selectionRect.setIsHorizontal(boolValue);
761 void ArgumentCoder<WindowFeatures>::encode(ArgumentEncoder& encoder, const WindowFeatures& windowFeatures)
763 encoder << windowFeatures.x;
764 encoder << windowFeatures.y;
765 encoder << windowFeatures.width;
766 encoder << windowFeatures.height;
767 encoder << windowFeatures.xSet;
768 encoder << windowFeatures.ySet;
769 encoder << windowFeatures.widthSet;
770 encoder << windowFeatures.heightSet;
771 encoder << windowFeatures.menuBarVisible;
772 encoder << windowFeatures.statusBarVisible;
773 encoder << windowFeatures.toolBarVisible;
774 encoder << windowFeatures.locationBarVisible;
775 encoder << windowFeatures.scrollbarsVisible;
776 encoder << windowFeatures.resizable;
777 encoder << windowFeatures.fullscreen;
778 encoder << windowFeatures.dialog;
781 bool ArgumentCoder<WindowFeatures>::decode(ArgumentDecoder& decoder, WindowFeatures& windowFeatures)
783 if (!decoder.decode(windowFeatures.x))
785 if (!decoder.decode(windowFeatures.y))
787 if (!decoder.decode(windowFeatures.width))
789 if (!decoder.decode(windowFeatures.height))
791 if (!decoder.decode(windowFeatures.xSet))
793 if (!decoder.decode(windowFeatures.ySet))
795 if (!decoder.decode(windowFeatures.widthSet))
797 if (!decoder.decode(windowFeatures.heightSet))
799 if (!decoder.decode(windowFeatures.menuBarVisible))
801 if (!decoder.decode(windowFeatures.statusBarVisible))
803 if (!decoder.decode(windowFeatures.toolBarVisible))
805 if (!decoder.decode(windowFeatures.locationBarVisible))
807 if (!decoder.decode(windowFeatures.scrollbarsVisible))
809 if (!decoder.decode(windowFeatures.resizable))
811 if (!decoder.decode(windowFeatures.fullscreen))
813 if (!decoder.decode(windowFeatures.dialog))
819 void ArgumentCoder<Color>::encode(ArgumentEncoder& encoder, const Color& color)
821 if (!color.isValid()) {
827 encoder << color.rgb();
830 bool ArgumentCoder<Color>::decode(ArgumentDecoder& decoder, Color& color)
833 if (!decoder.decode(isValid))
842 if (!decoder.decode(rgba))
850 void ArgumentCoder<CompositionUnderline>::encode(ArgumentEncoder& encoder, const CompositionUnderline& underline)
852 encoder << underline.startOffset;
853 encoder << underline.endOffset;
854 encoder << underline.thick;
855 encoder << underline.color;
858 bool ArgumentCoder<CompositionUnderline>::decode(ArgumentDecoder& decoder, CompositionUnderline& underline)
860 if (!decoder.decode(underline.startOffset))
862 if (!decoder.decode(underline.endOffset))
864 if (!decoder.decode(underline.thick))
866 if (!decoder.decode(underline.color))
873 void ArgumentCoder<Cookie>::encode(ArgumentEncoder& encoder, const Cookie& cookie)
875 encoder << cookie.name;
876 encoder << cookie.value;
877 encoder << cookie.domain;
878 encoder << cookie.path;
879 encoder << cookie.expires;
880 encoder << cookie.httpOnly;
881 encoder << cookie.secure;
882 encoder << cookie.session;
885 bool ArgumentCoder<Cookie>::decode(ArgumentDecoder& decoder, Cookie& cookie)
887 if (!decoder.decode(cookie.name))
889 if (!decoder.decode(cookie.value))
891 if (!decoder.decode(cookie.domain))
893 if (!decoder.decode(cookie.path))
895 if (!decoder.decode(cookie.expires))
897 if (!decoder.decode(cookie.httpOnly))
899 if (!decoder.decode(cookie.secure))
901 if (!decoder.decode(cookie.session))
908 #if ENABLE(SQL_DATABASE)
909 void ArgumentCoder<DatabaseDetails>::encode(ArgumentEncoder& encoder, const DatabaseDetails& details)
911 encoder << details.name();
912 encoder << details.displayName();
913 encoder << details.expectedUsage();
914 encoder << details.currentUsage();
917 bool ArgumentCoder<DatabaseDetails>::decode(ArgumentDecoder& decoder, DatabaseDetails& details)
920 if (!decoder.decode(name))
924 if (!decoder.decode(displayName))
927 uint64_t expectedUsage;
928 if (!decoder.decode(expectedUsage))
931 uint64_t currentUsage;
932 if (!decoder.decode(currentUsage))
935 details = DatabaseDetails(name, displayName, expectedUsage, currentUsage);
943 static void encodeSharedBuffer(ArgumentEncoder& encoder, SharedBuffer* buffer)
945 SharedMemory::Handle handle;
946 encoder << (buffer ? static_cast<uint64_t>(buffer->size()): 0);
948 RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::create(buffer->size());
949 memcpy(sharedMemoryBuffer->data(), buffer->data(), buffer->size());
950 sharedMemoryBuffer->createHandle(handle, SharedMemory::ReadOnly);
955 static bool decodeSharedBuffer(ArgumentDecoder& decoder, RefPtr<SharedBuffer>& buffer)
957 uint64_t bufferSize = 0;
958 if (!decoder.decode(bufferSize))
962 SharedMemory::Handle handle;
963 if (!decoder.decode(handle))
966 RefPtr<SharedMemory> sharedMemoryBuffer = SharedMemory::create(handle, SharedMemory::ReadOnly);
967 buffer = SharedBuffer::create(static_cast<unsigned char*>(sharedMemoryBuffer->data()), bufferSize);
973 void ArgumentCoder<PasteboardWebContent>::encode(ArgumentEncoder& encoder, const WebCore::PasteboardWebContent& content)
975 encoder << content.canSmartCopyOrDelete;
976 encoder << content.dataInStringFormat;
978 encodeSharedBuffer(encoder, content.dataInWebArchiveFormat.get());
979 encodeSharedBuffer(encoder, content.dataInRTFDFormat.get());
980 encodeSharedBuffer(encoder, content.dataInRTFFormat.get());
982 encoder << content.clientTypes;
983 encoder << static_cast<uint64_t>(content.clientData.size());
984 for (size_t i = 0; i < content.clientData.size(); i++)
985 encodeSharedBuffer(encoder, content.clientData[i].get());
988 bool ArgumentCoder<PasteboardWebContent>::decode(ArgumentDecoder& decoder, WebCore::PasteboardWebContent& content)
990 if (!decoder.decode(content.canSmartCopyOrDelete))
992 if (!decoder.decode(content.dataInStringFormat))
994 if (!decodeSharedBuffer(decoder, content.dataInWebArchiveFormat))
996 if (!decodeSharedBuffer(decoder, content.dataInRTFDFormat))
998 if (!decodeSharedBuffer(decoder, content.dataInRTFFormat))
1000 if (!decoder.decode(content.clientTypes))
1002 uint64_t clientDataSize;
1003 if (!decoder.decode(clientDataSize))
1006 content.clientData.resize(clientDataSize);
1007 for (size_t i = 0; i < clientDataSize; i++)
1008 decodeSharedBuffer(decoder, content.clientData[i]);
1012 void ArgumentCoder<PasteboardImage>::encode(ArgumentEncoder& encoder, const WebCore::PasteboardImage& pasteboardImage)
1014 encodeImage(encoder, pasteboardImage.image.get());
1015 encoder << pasteboardImage.url.url;
1016 encoder << pasteboardImage.url.title;
1017 encoder << pasteboardImage.resourceMIMEType;
1018 if (pasteboardImage.resourceData)
1019 encodeSharedBuffer(encoder, pasteboardImage.resourceData.get());
1022 bool ArgumentCoder<PasteboardImage>::decode(ArgumentDecoder& decoder, WebCore::PasteboardImage& pasteboardImage)
1024 if (!decodeImage(decoder, pasteboardImage.image))
1026 if (!decoder.decode(pasteboardImage.url.url))
1028 if (!decoder.decode(pasteboardImage.url.title))
1030 if (!decoder.decode(pasteboardImage.resourceMIMEType))
1032 if (!decodeSharedBuffer(decoder, pasteboardImage.resourceData))
1039 void ArgumentCoder<DictationAlternative>::encode(ArgumentEncoder& encoder, const DictationAlternative& dictationAlternative)
1041 encoder << dictationAlternative.rangeStart;
1042 encoder << dictationAlternative.rangeLength;
1043 encoder << dictationAlternative.dictationContext;
1046 bool ArgumentCoder<DictationAlternative>::decode(ArgumentDecoder& decoder, DictationAlternative& dictationAlternative)
1048 if (!decoder.decode(dictationAlternative.rangeStart))
1050 if (!decoder.decode(dictationAlternative.rangeLength))
1052 if (!decoder.decode(dictationAlternative.dictationContext))
1058 void ArgumentCoder<FileChooserSettings>::encode(ArgumentEncoder& encoder, const FileChooserSettings& settings)
1060 encoder << settings.allowsMultipleFiles;
1061 #if ENABLE(DIRECTORY_UPLOAD)
1062 encoder << settings.allowsDirectoryUpload;
1064 encoder << settings.acceptMIMETypes;
1065 encoder << settings.selectedFiles;
1066 #if ENABLE(MEDIA_CAPTURE)
1067 encoder << settings.capture;
1071 bool ArgumentCoder<FileChooserSettings>::decode(ArgumentDecoder& decoder, FileChooserSettings& settings)
1073 if (!decoder.decode(settings.allowsMultipleFiles))
1075 #if ENABLE(DIRECTORY_UPLOAD)
1076 if (!decoder.decode(settings.allowsDirectoryUpload))
1079 if (!decoder.decode(settings.acceptMIMETypes))
1081 if (!decoder.decode(settings.selectedFiles))
1083 #if ENABLE(MEDIA_CAPTURE)
1084 if (!decoder.decode(settings.capture))
1092 void ArgumentCoder<GrammarDetail>::encode(ArgumentEncoder& encoder, const GrammarDetail& detail)
1094 encoder << detail.location;
1095 encoder << detail.length;
1096 encoder << detail.guesses;
1097 encoder << detail.userDescription;
1100 bool ArgumentCoder<GrammarDetail>::decode(ArgumentDecoder& decoder, GrammarDetail& detail)
1102 if (!decoder.decode(detail.location))
1104 if (!decoder.decode(detail.length))
1106 if (!decoder.decode(detail.guesses))
1108 if (!decoder.decode(detail.userDescription))
1114 void ArgumentCoder<TextCheckingRequestData>::encode(ArgumentEncoder& encoder, const TextCheckingRequestData& request)
1116 encoder << request.sequence();
1117 encoder << request.text();
1118 encoder << request.mask();
1119 encoder.encodeEnum(request.processType());
1122 bool ArgumentCoder<TextCheckingRequestData>::decode(ArgumentDecoder& decoder, TextCheckingRequestData& request)
1125 if (!decoder.decode(sequence))
1129 if (!decoder.decode(text))
1132 TextCheckingTypeMask mask;
1133 if (!decoder.decode(mask))
1136 TextCheckingProcessType processType;
1137 if (!decoder.decodeEnum(processType))
1140 request = TextCheckingRequestData(sequence, text, mask, processType);
1144 void ArgumentCoder<TextCheckingResult>::encode(ArgumentEncoder& encoder, const TextCheckingResult& result)
1146 encoder.encodeEnum(result.type);
1147 encoder << result.location;
1148 encoder << result.length;
1149 encoder << result.details;
1150 encoder << result.replacement;
1153 bool ArgumentCoder<TextCheckingResult>::decode(ArgumentDecoder& decoder, TextCheckingResult& result)
1155 if (!decoder.decodeEnum(result.type))
1157 if (!decoder.decode(result.location))
1159 if (!decoder.decode(result.length))
1161 if (!decoder.decode(result.details))
1163 if (!decoder.decode(result.replacement))
1168 void ArgumentCoder<DragSession>::encode(ArgumentEncoder& encoder, const DragSession& result)
1170 encoder.encodeEnum(result.operation);
1171 encoder << result.mouseIsOverFileInput;
1172 encoder << result.numberOfItemsToBeAccepted;
1175 bool ArgumentCoder<DragSession>::decode(ArgumentDecoder& decoder, DragSession& result)
1177 if (!decoder.decodeEnum(result.operation))
1179 if (!decoder.decode(result.mouseIsOverFileInput))
1181 if (!decoder.decode(result.numberOfItemsToBeAccepted))
1186 void ArgumentCoder<URL>::encode(ArgumentEncoder& encoder, const URL& result)
1188 encoder << result.string();
1191 bool ArgumentCoder<URL>::decode(ArgumentDecoder& decoder, URL& result)
1194 if (!decoder.decode(urlAsString))
1196 result = URL(WebCore::ParsedURLString, urlAsString);
1200 void ArgumentCoder<WebCore::UserStyleSheet>::encode(ArgumentEncoder& encoder, const WebCore::UserStyleSheet& userStyleSheet)
1202 encoder << userStyleSheet.source();
1203 encoder << userStyleSheet.url();
1204 encoder << userStyleSheet.whitelist();
1205 encoder << userStyleSheet.blacklist();
1206 encoder.encodeEnum(userStyleSheet.injectedFrames());
1207 encoder.encodeEnum(userStyleSheet.level());
1210 bool ArgumentCoder<WebCore::UserStyleSheet>::decode(ArgumentDecoder& decoder, WebCore::UserStyleSheet& userStyleSheet)
1213 if (!decoder.decode(source))
1217 if (!decoder.decode(url))
1220 Vector<String> whitelist;
1221 if (!decoder.decode(whitelist))
1224 Vector<String> blacklist;
1225 if (!decoder.decode(blacklist))
1228 WebCore::UserContentInjectedFrames injectedFrames;
1229 if (!decoder.decodeEnum(injectedFrames))
1232 WebCore::UserStyleLevel level;
1233 if (!decoder.decodeEnum(level))
1236 userStyleSheet = WebCore::UserStyleSheet(source, url, whitelist, blacklist, injectedFrames, level);
1240 void ArgumentCoder<WebCore::UserScript>::encode(ArgumentEncoder& encoder, const WebCore::UserScript& userScript)
1242 encoder << userScript.source();
1243 encoder << userScript.url();
1244 encoder << userScript.whitelist();
1245 encoder << userScript.blacklist();
1246 encoder.encodeEnum(userScript.injectionTime());
1247 encoder.encodeEnum(userScript.injectedFrames());
1250 bool ArgumentCoder<WebCore::UserScript>::decode(ArgumentDecoder& decoder, WebCore::UserScript& userScript)
1253 if (!decoder.decode(source))
1257 if (!decoder.decode(url))
1260 Vector<String> whitelist;
1261 if (!decoder.decode(whitelist))
1264 Vector<String> blacklist;
1265 if (!decoder.decode(blacklist))
1268 WebCore::UserScriptInjectionTime injectionTime;
1269 if (!decoder.decodeEnum(injectionTime))
1272 WebCore::UserContentInjectedFrames injectedFrames;
1273 if (!decoder.decodeEnum(injectedFrames))
1276 userScript = WebCore::UserScript(source, url, whitelist, blacklist, injectionTime, injectedFrames);
1280 void ArgumentCoder<WebCore::ScrollableAreaParameters>::encode(ArgumentEncoder& encoder, const WebCore::ScrollableAreaParameters& parameters)
1282 encoder.encodeEnum(parameters.horizontalScrollElasticity);
1283 encoder.encodeEnum(parameters.verticalScrollElasticity);
1285 encoder.encodeEnum(parameters.horizontalScrollbarMode);
1286 encoder.encodeEnum(parameters.verticalScrollbarMode);
1288 encoder << parameters.hasEnabledHorizontalScrollbar;
1289 encoder << parameters.hasEnabledVerticalScrollbar;
1292 bool ArgumentCoder<WebCore::ScrollableAreaParameters>::decode(ArgumentDecoder& decoder, WebCore::ScrollableAreaParameters& params)
1294 if (!decoder.decodeEnum(params.horizontalScrollElasticity))
1296 if (!decoder.decodeEnum(params.verticalScrollElasticity))
1299 if (!decoder.decodeEnum(params.horizontalScrollbarMode))
1301 if (!decoder.decodeEnum(params.verticalScrollbarMode))
1304 if (!decoder.decode(params.hasEnabledHorizontalScrollbar))
1306 if (!decoder.decode(params.hasEnabledVerticalScrollbar))
1312 void ArgumentCoder<WebCore::FixedPositionViewportConstraints>::encode(ArgumentEncoder& encoder, const WebCore::FixedPositionViewportConstraints& viewportConstraints)
1314 encoder << viewportConstraints.alignmentOffset();
1315 encoder << viewportConstraints.anchorEdges();
1317 encoder << viewportConstraints.viewportRectAtLastLayout();
1318 encoder << viewportConstraints.layerPositionAtLastLayout();
1321 bool ArgumentCoder<WebCore::FixedPositionViewportConstraints>::decode(ArgumentDecoder& decoder, WebCore::FixedPositionViewportConstraints& viewportConstraints)
1323 FloatSize alignmentOffset;
1324 if (!decoder.decode(alignmentOffset))
1327 ViewportConstraints::AnchorEdges anchorEdges;
1328 if (!decoder.decode(anchorEdges))
1331 FloatRect viewportRectAtLastLayout;
1332 if (!decoder.decode(viewportRectAtLastLayout))
1335 FloatPoint layerPositionAtLastLayout;
1336 if (!decoder.decode(layerPositionAtLastLayout))
1339 viewportConstraints = WebCore::FixedPositionViewportConstraints();
1340 viewportConstraints.setAlignmentOffset(alignmentOffset);
1341 viewportConstraints.setAnchorEdges(anchorEdges);
1343 viewportConstraints.setViewportRectAtLastLayout(viewportRectAtLastLayout);
1344 viewportConstraints.setLayerPositionAtLastLayout(layerPositionAtLastLayout);
1349 void ArgumentCoder<WebCore::StickyPositionViewportConstraints>::encode(ArgumentEncoder& encoder, const WebCore::StickyPositionViewportConstraints& viewportConstraints)
1351 encoder << viewportConstraints.alignmentOffset();
1352 encoder << viewportConstraints.anchorEdges();
1354 encoder << viewportConstraints.leftOffset();
1355 encoder << viewportConstraints.rightOffset();
1356 encoder << viewportConstraints.topOffset();
1357 encoder << viewportConstraints.bottomOffset();
1359 encoder << viewportConstraints.constrainingRectAtLastLayout();
1360 encoder << viewportConstraints.containingBlockRect();
1361 encoder << viewportConstraints.stickyBoxRect();
1363 encoder << viewportConstraints.stickyOffsetAtLastLayout();
1364 encoder << viewportConstraints.layerPositionAtLastLayout();
1367 bool ArgumentCoder<WebCore::StickyPositionViewportConstraints>::decode(ArgumentDecoder& decoder, WebCore::StickyPositionViewportConstraints& viewportConstraints)
1369 FloatSize alignmentOffset;
1370 if (!decoder.decode(alignmentOffset))
1373 ViewportConstraints::AnchorEdges anchorEdges;
1374 if (!decoder.decode(anchorEdges))
1378 if (!decoder.decode(leftOffset))
1382 if (!decoder.decode(rightOffset))
1386 if (!decoder.decode(topOffset))
1390 if (!decoder.decode(bottomOffset))
1393 FloatRect constrainingRectAtLastLayout;
1394 if (!decoder.decode(constrainingRectAtLastLayout))
1397 FloatRect containingBlockRect;
1398 if (!decoder.decode(containingBlockRect))
1401 FloatRect stickyBoxRect;
1402 if (!decoder.decode(stickyBoxRect))
1405 FloatSize stickyOffsetAtLastLayout;
1406 if (!decoder.decode(stickyOffsetAtLastLayout))
1409 FloatPoint layerPositionAtLastLayout;
1410 if (!decoder.decode(layerPositionAtLastLayout))
1413 viewportConstraints = WebCore::StickyPositionViewportConstraints();
1414 viewportConstraints.setAlignmentOffset(alignmentOffset);
1415 viewportConstraints.setAnchorEdges(anchorEdges);
1417 viewportConstraints.setLeftOffset(leftOffset);
1418 viewportConstraints.setRightOffset(rightOffset);
1419 viewportConstraints.setTopOffset(topOffset);
1420 viewportConstraints.setBottomOffset(bottomOffset);
1422 viewportConstraints.setConstrainingRectAtLastLayout(constrainingRectAtLastLayout);
1423 viewportConstraints.setContainingBlockRect(containingBlockRect);
1424 viewportConstraints.setStickyBoxRect(stickyBoxRect);
1426 viewportConstraints.setStickyOffsetAtLastLayout(stickyOffsetAtLastLayout);
1427 viewportConstraints.setLayerPositionAtLastLayout(layerPositionAtLastLayout);
1432 #if ENABLE(CSS_FILTERS) && !USE(COORDINATED_GRAPHICS)
1433 static void encodeFilterOperation(ArgumentEncoder& encoder, const FilterOperation& filter)
1435 encoder.encodeEnum(filter.type());
1437 switch (filter.type()) {
1438 case FilterOperation::REFERENCE: {
1439 const auto& referenceFilter = static_cast<const ReferenceFilterOperation&>(filter);
1440 encoder << referenceFilter.url();
1441 encoder << referenceFilter.fragment();
1444 case FilterOperation::GRAYSCALE:
1445 case FilterOperation::SEPIA:
1446 case FilterOperation::SATURATE:
1447 case FilterOperation::HUE_ROTATE:
1448 encoder << static_cast<const BasicColorMatrixFilterOperation&>(filter).amount();
1450 case FilterOperation::INVERT:
1451 case FilterOperation::OPACITY:
1452 case FilterOperation::BRIGHTNESS:
1453 case FilterOperation::CONTRAST:
1454 encoder << static_cast<const BasicComponentTransferFilterOperation&>(filter).amount();
1456 case FilterOperation::BLUR:
1457 encoder << static_cast<const BlurFilterOperation&>(filter).stdDeviation();
1459 case FilterOperation::DROP_SHADOW: {
1460 const auto& dropShadowFilter = static_cast<const DropShadowFilterOperation&>(filter);
1461 encoder << dropShadowFilter.location();
1462 encoder << dropShadowFilter.stdDeviation();
1463 encoder << dropShadowFilter.color();
1466 #if ENABLE(CSS_SHADERS)
1467 case FilterOperation::CUSTOM:
1468 case FilterOperation::VALIDATED_CUSTOM:
1469 ASSERT_NOT_REACHED();
1472 case FilterOperation::PASSTHROUGH:
1473 case FilterOperation::NONE:
1478 static bool decodeFilterOperation(ArgumentDecoder& decoder, RefPtr<FilterOperation>& filter)
1480 FilterOperation::OperationType type;
1481 if (!decoder.decodeEnum(type))
1485 case FilterOperation::REFERENCE: {
1488 if (!decoder.decode(url))
1490 if (!decoder.decode(fragment))
1492 filter = ReferenceFilterOperation::create(url, fragment, type);
1495 case FilterOperation::GRAYSCALE:
1496 case FilterOperation::SEPIA:
1497 case FilterOperation::SATURATE:
1498 case FilterOperation::HUE_ROTATE: {
1500 if (!decoder.decode(amount))
1502 filter = BasicColorMatrixFilterOperation::create(amount, type);
1505 case FilterOperation::INVERT:
1506 case FilterOperation::OPACITY:
1507 case FilterOperation::BRIGHTNESS:
1508 case FilterOperation::CONTRAST: {
1510 if (!decoder.decode(amount))
1512 filter = BasicComponentTransferFilterOperation::create(amount, type);
1515 case FilterOperation::BLUR: {
1516 Length stdDeviation;
1517 if (!decoder.decode(stdDeviation))
1519 filter = BlurFilterOperation::create(stdDeviation, type);
1522 case FilterOperation::DROP_SHADOW: {
1526 if (!decoder.decode(location))
1528 if (!decoder.decode(stdDeviation))
1530 if (!decoder.decode(color))
1532 filter = DropShadowFilterOperation::create(location, stdDeviation, color, type);
1535 #if ENABLE(CSS_SHADERS)
1536 case FilterOperation::CUSTOM:
1537 case FilterOperation::VALIDATED_CUSTOM:
1538 ASSERT_NOT_REACHED();
1541 case FilterOperation::PASSTHROUGH:
1542 case FilterOperation::NONE:
1550 void ArgumentCoder<FilterOperations>::encode(ArgumentEncoder& encoder, const FilterOperations& filters)
1552 encoder << static_cast<uint64_t>(filters.size());
1554 for (const auto& filter : filters.operations())
1555 encodeFilterOperation(encoder, *filter);
1558 bool ArgumentCoder<FilterOperations>::decode(ArgumentDecoder& decoder, FilterOperations& filters)
1560 uint64_t filterCount;
1561 if (!decoder.decode(filterCount))
1564 for (uint64_t i = 0; i < filterCount; ++i) {
1565 RefPtr<FilterOperation> filter;
1566 if (!decodeFilterOperation(decoder, filter))
1568 filters.operations().append(std::move(filter));
1573 #endif // ENABLE(CSS_FILTERS) && !USE(COORDINATED_GRAPHICS)
1575 #if ENABLE(INDEXED_DATABASE)
1576 void ArgumentCoder<IDBDatabaseMetadata>::encode(ArgumentEncoder& encoder, const IDBDatabaseMetadata& metadata)
1578 encoder << metadata.name << metadata.id << metadata.version << metadata.maxObjectStoreId << metadata.objectStores;
1581 bool ArgumentCoder<IDBDatabaseMetadata>::decode(ArgumentDecoder& decoder, IDBDatabaseMetadata& metadata)
1583 if (!decoder.decode(metadata.name))
1586 if (!decoder.decode(metadata.id))
1589 if (!decoder.decode(metadata.version))
1592 if (!decoder.decode(metadata.maxObjectStoreId))
1595 if (!decoder.decode(metadata.objectStores))
1601 void ArgumentCoder<IDBIndexMetadata>::encode(ArgumentEncoder& encoder, const IDBIndexMetadata& metadata)
1603 encoder << metadata.name << metadata.id << metadata.keyPath << metadata.unique << metadata.multiEntry;
1606 bool ArgumentCoder<IDBIndexMetadata>::decode(ArgumentDecoder& decoder, IDBIndexMetadata& metadata)
1608 if (!decoder.decode(metadata.name))
1611 if (!decoder.decode(metadata.id))
1614 if (!decoder.decode(metadata.keyPath))
1617 if (!decoder.decode(metadata.unique))
1620 if (!decoder.decode(metadata.multiEntry))
1626 void ArgumentCoder<IDBKeyData>::encode(ArgumentEncoder& encoder, const IDBKeyData& keyData)
1628 encoder << keyData.isNull;
1632 encoder.encodeEnum(keyData.type);
1634 switch (keyData.type) {
1635 case IDBKey::InvalidType:
1637 case IDBKey::ArrayType:
1638 encoder << keyData.arrayValue;
1640 case IDBKey::StringType:
1641 encoder << keyData.stringValue;
1643 case IDBKey::DateType:
1644 case IDBKey::NumberType:
1645 encoder << keyData.numberValue;
1647 case IDBKey::MinType:
1648 ASSERT_NOT_REACHED();
1653 bool ArgumentCoder<IDBKeyData>::decode(ArgumentDecoder& decoder, IDBKeyData& keyData)
1655 if (!decoder.decode(keyData.isNull))
1661 if (!decoder.decodeEnum(keyData.type))
1664 switch (keyData.type) {
1665 case IDBKey::InvalidType:
1667 case IDBKey::ArrayType:
1668 if (!decoder.decode(keyData.arrayValue))
1671 case IDBKey::StringType:
1672 if (!decoder.decode(keyData.stringValue))
1675 case IDBKey::DateType:
1676 case IDBKey::NumberType:
1677 if (!decoder.decode(keyData.numberValue))
1680 case IDBKey::MinType:
1681 ASSERT_NOT_REACHED();
1688 void ArgumentCoder<IDBKeyPath>::encode(ArgumentEncoder& encoder, const IDBKeyPath& keyPath)
1690 encoder.encodeEnum(keyPath.type());
1692 switch (keyPath.type()) {
1693 case IDBKeyPath::NullType:
1695 case IDBKeyPath::StringType:
1696 encoder << keyPath.string();
1698 case IDBKeyPath::ArrayType:
1699 encoder << keyPath.array();
1702 ASSERT_NOT_REACHED();
1706 bool ArgumentCoder<IDBKeyPath>::decode(ArgumentDecoder& decoder, IDBKeyPath& keyPath)
1708 IDBKeyPath::Type type;
1709 if (!decoder.decodeEnum(type))
1713 case IDBKeyPath::NullType:
1714 keyPath = IDBKeyPath();
1717 case IDBKeyPath::StringType: {
1719 if (!decoder.decode(string))
1722 keyPath = IDBKeyPath(string);
1725 case IDBKeyPath::ArrayType: {
1726 Vector<String> array;
1727 if (!decoder.decode(array))
1730 keyPath = IDBKeyPath(array);
1738 void ArgumentCoder<IDBObjectStoreMetadata>::encode(ArgumentEncoder& encoder, const IDBObjectStoreMetadata& metadata)
1740 encoder << metadata.name << metadata.id << metadata.keyPath << metadata.autoIncrement << metadata.maxIndexId << metadata.indexes;
1743 bool ArgumentCoder<IDBObjectStoreMetadata>::decode(ArgumentDecoder& decoder, IDBObjectStoreMetadata& metadata)
1745 if (!decoder.decode(metadata.name))
1748 if (!decoder.decode(metadata.id))
1751 if (!decoder.decode(metadata.keyPath))
1754 if (!decoder.decode(metadata.autoIncrement))
1757 if (!decoder.decode(metadata.maxIndexId))
1760 if (!decoder.decode(metadata.indexes))