|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #include "nsFormData.h" |
|
6 #include "nsIVariant.h" |
|
7 #include "nsIInputStream.h" |
|
8 #include "nsIDOMFile.h" |
|
9 #include "mozilla/dom/HTMLFormElement.h" |
|
10 #include "mozilla/dom/FormDataBinding.h" |
|
11 |
|
12 using namespace mozilla; |
|
13 using namespace mozilla::dom; |
|
14 |
|
15 nsFormData::nsFormData(nsISupports* aOwner) |
|
16 : nsFormSubmission(NS_LITERAL_CSTRING("UTF-8"), nullptr) |
|
17 , mOwner(aOwner) |
|
18 { |
|
19 SetIsDOMBinding(); |
|
20 } |
|
21 |
|
22 // ------------------------------------------------------------------------- |
|
23 // nsISupports |
|
24 |
|
25 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(nsFormData, mOwner) |
|
26 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsFormData) |
|
27 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsFormData) |
|
28 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsFormData) |
|
29 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY |
|
30 NS_INTERFACE_MAP_ENTRY(nsIDOMFormData) |
|
31 NS_INTERFACE_MAP_ENTRY(nsIXHRSendable) |
|
32 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMFormData) |
|
33 NS_INTERFACE_MAP_END |
|
34 |
|
35 // ------------------------------------------------------------------------- |
|
36 // nsFormSubmission |
|
37 nsresult |
|
38 nsFormData::GetEncodedSubmission(nsIURI* aURI, |
|
39 nsIInputStream** aPostDataStream) |
|
40 { |
|
41 NS_NOTREACHED("Shouldn't call nsFormData::GetEncodedSubmission"); |
|
42 return NS_OK; |
|
43 } |
|
44 |
|
45 void |
|
46 nsFormData::Append(const nsAString& aName, const nsAString& aValue) |
|
47 { |
|
48 AddNameValuePair(aName, aValue); |
|
49 } |
|
50 |
|
51 void |
|
52 nsFormData::Append(const nsAString& aName, nsIDOMBlob* aBlob, |
|
53 const Optional<nsAString>& aFilename) |
|
54 { |
|
55 nsString filename; |
|
56 if (aFilename.WasPassed()) { |
|
57 filename = aFilename.Value(); |
|
58 } else { |
|
59 filename.SetIsVoid(true); |
|
60 } |
|
61 AddNameFilePair(aName, aBlob, filename); |
|
62 } |
|
63 |
|
64 // ------------------------------------------------------------------------- |
|
65 // nsIDOMFormData |
|
66 |
|
67 NS_IMETHODIMP |
|
68 nsFormData::Append(const nsAString& aName, nsIVariant* aValue) |
|
69 { |
|
70 uint16_t dataType; |
|
71 nsresult rv = aValue->GetDataType(&dataType); |
|
72 NS_ENSURE_SUCCESS(rv, rv); |
|
73 |
|
74 if (dataType == nsIDataType::VTYPE_INTERFACE || |
|
75 dataType == nsIDataType::VTYPE_INTERFACE_IS) { |
|
76 nsCOMPtr<nsISupports> supports; |
|
77 nsID *iid; |
|
78 rv = aValue->GetAsInterface(&iid, getter_AddRefs(supports)); |
|
79 NS_ENSURE_SUCCESS(rv, rv); |
|
80 |
|
81 nsMemory::Free(iid); |
|
82 |
|
83 nsCOMPtr<nsIDOMBlob> domBlob = do_QueryInterface(supports); |
|
84 if (domBlob) { |
|
85 Optional<nsAString> temp; |
|
86 Append(aName, domBlob, temp); |
|
87 return NS_OK; |
|
88 } |
|
89 } |
|
90 |
|
91 char16_t* stringData = nullptr; |
|
92 uint32_t stringLen = 0; |
|
93 rv = aValue->GetAsWStringWithSize(&stringLen, &stringData); |
|
94 NS_ENSURE_SUCCESS(rv, rv); |
|
95 |
|
96 nsString valAsString; |
|
97 valAsString.Adopt(stringData, stringLen); |
|
98 |
|
99 Append(aName, valAsString); |
|
100 return NS_OK; |
|
101 } |
|
102 |
|
103 /* virtual */ JSObject* |
|
104 nsFormData::WrapObject(JSContext* aCx) |
|
105 { |
|
106 return FormDataBinding::Wrap(aCx, this); |
|
107 } |
|
108 |
|
109 /* static */ already_AddRefed<nsFormData> |
|
110 nsFormData::Constructor(const GlobalObject& aGlobal, |
|
111 const Optional<NonNull<HTMLFormElement> >& aFormElement, |
|
112 ErrorResult& aRv) |
|
113 { |
|
114 nsRefPtr<nsFormData> formData = new nsFormData(aGlobal.GetAsSupports()); |
|
115 if (aFormElement.WasPassed()) { |
|
116 aRv = aFormElement.Value().WalkFormElements(formData); |
|
117 } |
|
118 return formData.forget(); |
|
119 } |
|
120 |
|
121 // ------------------------------------------------------------------------- |
|
122 // nsIXHRSendable |
|
123 |
|
124 NS_IMETHODIMP |
|
125 nsFormData::GetSendInfo(nsIInputStream** aBody, uint64_t* aContentLength, |
|
126 nsACString& aContentType, nsACString& aCharset) |
|
127 { |
|
128 nsFSMultipartFormData fs(NS_LITERAL_CSTRING("UTF-8"), nullptr); |
|
129 |
|
130 for (uint32_t i = 0; i < mFormData.Length(); ++i) { |
|
131 if (mFormData[i].valueIsFile) { |
|
132 fs.AddNameFilePair(mFormData[i].name, mFormData[i].fileValue, |
|
133 mFormData[i].filename); |
|
134 } |
|
135 else { |
|
136 fs.AddNameValuePair(mFormData[i].name, mFormData[i].stringValue); |
|
137 } |
|
138 } |
|
139 |
|
140 fs.GetContentType(aContentType); |
|
141 aCharset.Truncate(); |
|
142 *aContentLength = 0; |
|
143 NS_ADDREF(*aBody = fs.GetSubmissionBody(aContentLength)); |
|
144 |
|
145 return NS_OK; |
|
146 } |