1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* ***** BEGIN LICENSE BLOCK *****
3
* Version: NPL 1.1/GPL 2.0/LGPL 2.1
5
* The contents of this file are subject to the Netscape Public License
6
* Version 1.1 (the "License"); you may not use this file except in
7
* compliance with the License. You may obtain a copy of the License at
8
* http://www.mozilla.org/NPL/
10
* Software distributed under the License is distributed on an "AS IS" basis,
11
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
* for the specific language governing rights and limitations under the
15
* The Original Code is mozilla.org code.
17
* The Initial Developer of the Original Code is
18
* Netscape Communications Corporation.
19
* Portions created by the Initial Developer are Copyright (C) 1998
20
* the Initial Developer. All Rights Reserved.
23
* Johnny Stenback <jst@mozilla.jstenback.com> (original author)
25
* Alternatively, the contents of this file may be used under the terms of
26
* either the GNU General Public License Version 2 or later (the "GPL"), or
27
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28
* in which case the provisions of the GPL or the LGPL are applicable instead
29
* of those above. If you wish to allow use of your version of this file only
30
* under the terms of either the GPL or the LGPL, and not to allow others to
31
* use your version of this file under the terms of the NPL, indicate your
32
* decision by deleting the provisions above and replace them with the notice
33
* and other provisions required by the GPL or the LGPL. If you do not delete
34
* the provisions above, a recipient may use your version of this file under
35
* the terms of any one of the NPL, the GPL or the LGPL.
37
* ***** END LICENSE BLOCK ***** */
39
#include "nsLSParser.h"
40
#include "nsLSEvent.h"
41
#include "nsAutoPtr.h"
42
#include "nsXMLHttpRequest.h"
43
#include "nsIDOMLSParserFilter.h"
44
#include "nsIDOMDocument.h"
45
#include "nsIDOMDOMImplementation.h"
46
#include "nsIDOMEventListener.h"
47
#include "nsIDOMEventTarget.h"
49
#include "nsIDOMClassInfo.h"
52
// QueryInterface implementation for nsLSParser
53
NS_INTERFACE_MAP_BEGIN(nsLSParser)
54
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMLSParser)
55
NS_INTERFACE_MAP_ENTRY(nsIDOMLSParser)
56
NS_INTERFACE_MAP_ENTRY(nsIDOMEventTarget)
57
NS_INTERFACE_MAP_ENTRY_EXTERNAL_DOM_CLASSINFO(LSParser)
61
NS_IMPL_ADDREF(nsLSParser)
62
NS_IMPL_RELEASE(nsLSParser)
64
nsLSParser::nsLSParser()
69
nsLSParser::~nsLSParser()
74
nsLSParser::GetDomConfig(nsIDOMDOMConfiguration * *aDomConfig)
78
return NS_ERROR_NOT_IMPLEMENTED;
82
nsLSParser::GetFilter(nsIDOMLSParserFilter * *aFilter)
90
nsLSParser::SetFilter(nsIDOMLSParserFilter * aFilter)
98
nsLSParser::GetAsync(PRBool *aAsync)
106
nsLSParser::GetBusy(PRBool *aBusy)
109
nsresult rv = mXMLHttpRequest->GetReadyState(&readyState);
110
NS_ENSURE_SUCCESS(rv, rv);
112
*aBusy = readyState == 0 || readyState == 4;
117
class nsLSParserEventListener : public nsIDOMEventListener
120
nsLSParserEventListener(nsLSParser *aParser)
125
virtual ~nsLSParserEventListener()
131
NS_DECL_NSIDOMEVENTLISTENER
134
nsRefPtr<nsLSParser> mParser;
138
NS_IMPL_ISUPPORTS1(nsLSParserEventListener, nsIDOMEventListener)
141
nsLSParserEventListener::HandleEvent(nsIDOMEvent *aEvent)
143
mParser->FireOnLoad();
150
nsLSParser::Parse(nsIDOMLSInput *input, nsIDOMDocument **_retval)
152
return NS_ERROR_NOT_IMPLEMENTED;
156
nsLSParser::ParseURI(const nsAString & uri, nsIDOMDocument **_retval)
160
nsCOMPtr<nsIDOMEventListener> listener = new nsLSParserEventListener(this);
161
NS_ENSURE_TRUE(listener, NS_ERROR_OUT_OF_MEMORY);
164
rv = mXMLHttpRequest->OpenRequest(NS_LITERAL_CSTRING("GET"),
165
NS_ConvertUTF16toUTF8(uri),
166
mIsAsync, EmptyString(), EmptyString());
167
NS_ENSURE_SUCCESS(rv, rv);
169
nsCOMPtr<nsIDOMEventTarget> target(do_QueryInterface(mXMLHttpRequest));
170
rv = target->AddEventListener(NS_LITERAL_STRING("load"), listener, PR_FALSE);
171
NS_ENSURE_SUCCESS(rv, rv);
173
rv = mXMLHttpRequest->Send(nsnull);
175
if (!mIsAsync && NS_SUCCEEDED(rv)) {
176
rv = mXMLHttpRequest->GetResponseXML(_retval);
183
nsLSParser::ParseWithContext(nsIDOMLSInput *input, nsIDOMNode *contextArg,
184
PRUint16 action, nsIDOMNode **_retval)
186
return NS_ERROR_NOT_IMPLEMENTED;
192
return mXMLHttpRequest->Abort();
196
nsLSParser::AddEventListener(const nsAString& aType,
197
nsIDOMEventListener *aListener,
200
nsCOMArray<nsIDOMEventListener> *listeners;
202
if (aType.Equals(NS_LITERAL_STRING("ls-load"))) {
203
listeners = &mLoadListeners;
204
} else if (aType.Equals(NS_LITERAL_STRING("ls-progress"))) {
205
listeners = &mProgressListeners;
207
// Not a supported event
212
if (listeners->IndexOf(aListener) < 0) {
213
listeners->AppendObject(aListener);
220
nsLSParser::RemoveEventListener(const nsAString& aType,
221
nsIDOMEventListener *aListener,
224
nsCOMArray<nsIDOMEventListener> *listeners;
226
if (aType.Equals(NS_LITERAL_STRING("ls-load"))) {
227
listeners = &mLoadListeners;
228
} else if (aType.Equals(NS_LITERAL_STRING("ls-progress"))) {
229
listeners = &mProgressListeners;
231
// Not a supported event
236
listeners->RemoveObject(aListener);
242
nsLSParser::DispatchEvent(nsIDOMEvent *aEvt, PRBool *_retval)
244
return NS_ERROR_NOT_IMPLEMENTED;
248
nsLSParser::FireOnLoad()
250
for (PRInt32 i = 0; i < mLoadListeners.Count(); ++i) {
251
nsRefPtr<nsLSParserLoadEvent> event = new nsLSParserLoadEvent(this);
254
mLoadListeners.ObjectAt(i)->HandleEvent(NS_STATIC_CAST(nsLSEvent *,
263
mXMLHttpRequest = new nsXMLHttpRequest();
265
return mXMLHttpRequest ? NS_OK : NS_ERROR_OUT_OF_MEMORY;