Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this
5 : * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "URIUtils.h"
8 :
9 : #include "nsIIPCSerializableURI.h"
10 :
11 : #include "mozilla/ArrayUtils.h"
12 : #include "mozilla/Assertions.h"
13 : #include "nsComponentManagerUtils.h"
14 : #include "nsDebug.h"
15 : #include "nsID.h"
16 : #include "nsJARURI.h"
17 : #include "nsIIconURI.h"
18 : #include "nsHostObjectURI.h"
19 : #include "NullPrincipalURI.h"
20 : #include "nsJSProtocolHandler.h"
21 : #include "nsNetCID.h"
22 : #include "nsSimpleNestedURI.h"
23 : #include "nsThreadUtils.h"
24 :
25 : using namespace mozilla::ipc;
26 : using mozilla::ArrayLength;
27 :
28 : namespace {
29 :
30 : NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID);
31 : NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID);
32 : NS_DEFINE_CID(kJARURICID, NS_JARURI_CID);
33 : NS_DEFINE_CID(kIconURICID, NS_MOZICONURI_CID);
34 :
35 : } // namespace
36 :
37 : namespace mozilla {
38 : namespace ipc {
39 :
40 : void
41 22 : SerializeURI(nsIURI* aURI,
42 : URIParams& aParams)
43 : {
44 22 : MOZ_ASSERT(NS_IsMainThread());
45 22 : MOZ_ASSERT(aURI);
46 :
47 44 : nsCOMPtr<nsIIPCSerializableURI> serializable = do_QueryInterface(aURI);
48 22 : if (!serializable) {
49 0 : MOZ_CRASH("All IPDL URIs must be serializable!");
50 : }
51 :
52 22 : serializable->Serialize(aParams);
53 22 : if (aParams.type() == URIParams::T__None) {
54 0 : MOZ_CRASH("Serialize failed!");
55 : }
56 22 : }
57 :
58 : void
59 23 : SerializeURI(nsIURI* aURI,
60 : OptionalURIParams& aParams)
61 : {
62 23 : MOZ_ASSERT(NS_IsMainThread());
63 :
64 23 : if (aURI) {
65 22 : URIParams params;
66 11 : SerializeURI(aURI, params);
67 11 : aParams = params;
68 : }
69 : else {
70 12 : aParams = mozilla::void_t();
71 : }
72 23 : }
73 :
74 : already_AddRefed<nsIURI>
75 22 : DeserializeURI(const URIParams& aParams)
76 : {
77 22 : MOZ_ASSERT(NS_IsMainThread());
78 :
79 44 : nsCOMPtr<nsIIPCSerializableURI> serializable;
80 :
81 22 : switch (aParams.type()) {
82 : case URIParams::TSimpleURIParams:
83 0 : serializable = do_CreateInstance(kSimpleURICID);
84 0 : break;
85 :
86 : case URIParams::TStandardURLParams:
87 22 : serializable = do_CreateInstance(kStandardURLCID);
88 22 : break;
89 :
90 : case URIParams::TJARURIParams:
91 0 : serializable = do_CreateInstance(kJARURICID);
92 0 : break;
93 :
94 : case URIParams::TJSURIParams:
95 0 : serializable = new nsJSURI();
96 0 : break;
97 :
98 : case URIParams::TIconURIParams:
99 0 : serializable = do_CreateInstance(kIconURICID);
100 0 : break;
101 :
102 : case URIParams::TNullPrincipalURIParams:
103 0 : serializable = new NullPrincipalURI();
104 0 : break;
105 :
106 : case URIParams::TSimpleNestedURIParams:
107 0 : serializable = new nsSimpleNestedURI();
108 0 : break;
109 :
110 : case URIParams::THostObjectURIParams:
111 0 : serializable = new nsHostObjectURI();
112 0 : break;
113 :
114 : default:
115 0 : MOZ_CRASH("Unknown params!");
116 : }
117 :
118 22 : MOZ_ASSERT(serializable);
119 :
120 22 : if (!serializable->Deserialize(aParams)) {
121 0 : MOZ_ASSERT(false, "Deserialize failed!");
122 : return nullptr;
123 : }
124 :
125 44 : nsCOMPtr<nsIURI> uri = do_QueryInterface(serializable);
126 22 : MOZ_ASSERT(uri);
127 :
128 22 : return uri.forget();
129 : }
130 :
131 : already_AddRefed<nsIURI>
132 23 : DeserializeURI(const OptionalURIParams& aParams)
133 : {
134 23 : MOZ_ASSERT(NS_IsMainThread());
135 :
136 46 : nsCOMPtr<nsIURI> uri;
137 :
138 23 : switch (aParams.type()) {
139 : case OptionalURIParams::Tvoid_t:
140 12 : break;
141 :
142 : case OptionalURIParams::TURIParams:
143 11 : uri = DeserializeURI(aParams.get_URIParams());
144 11 : break;
145 :
146 : default:
147 0 : MOZ_CRASH("Unknown params!");
148 : }
149 :
150 46 : return uri.forget();
151 : }
152 :
153 : } // namespace ipc
154 : } // namespace mozilla
|