2001-09-25 22:43:09 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2005-10-17 18:47:13 +00:00
|
|
|
/* vim: set ts=2 sw=2 et tw=80: */
|
2012-05-21 11:12:37 +00:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
1998-08-13 04:34:53 +00:00
|
|
|
|
2011-08-03 04:22:40 +00:00
|
|
|
#include "nsLocation.h"
|
2003-06-26 00:41:23 +00:00
|
|
|
#include "nsIScriptSecurityManager.h"
|
|
|
|
#include "nsIScriptContext.h"
|
2000-02-08 13:40:10 +00:00
|
|
|
#include "nsIDocShell.h"
|
2000-03-30 22:38:32 +00:00
|
|
|
#include "nsIDocShellLoadInfo.h"
|
2000-02-24 03:57:32 +00:00
|
|
|
#include "nsIWebNavigation.h"
|
2002-12-12 15:48:30 +00:00
|
|
|
#include "nsCDefaultURIFixup.h"
|
|
|
|
#include "nsIURIFixup.h"
|
1998-08-13 04:34:53 +00:00
|
|
|
#include "nsIURL.h"
|
2004-04-24 16:09:31 +00:00
|
|
|
#include "nsIJARURI.h"
|
1999-06-18 17:34:08 +00:00
|
|
|
#include "nsIIOService.h"
|
|
|
|
#include "nsIServiceManager.h"
|
1999-11-30 04:50:42 +00:00
|
|
|
#include "nsNetUtil.h"
|
1999-08-03 23:16:48 +00:00
|
|
|
#include "nsCOMPtr.h"
|
2002-03-06 07:48:55 +00:00
|
|
|
#include "nsEscape.h"
|
2000-01-15 02:02:27 +00:00
|
|
|
#include "nsIDOMWindow.h"
|
|
|
|
#include "nsIDOMDocument.h"
|
|
|
|
#include "nsIDocument.h"
|
2004-10-20 02:19:57 +00:00
|
|
|
#include "nsIPresShell.h"
|
|
|
|
#include "nsPresContext.h"
|
1999-09-07 02:54:19 +00:00
|
|
|
#include "nsIJSContextStack.h"
|
2000-02-10 04:56:56 +00:00
|
|
|
#include "nsXPIDLString.h"
|
2012-07-27 14:03:27 +00:00
|
|
|
#include "nsError.h"
|
2011-10-03 19:11:31 +00:00
|
|
|
#include "nsDOMClassInfoID.h"
|
2002-05-15 18:55:21 +00:00
|
|
|
#include "nsCRT.h"
|
2003-03-05 22:23:47 +00:00
|
|
|
#include "nsIProtocolHandler.h"
|
2003-12-23 15:41:10 +00:00
|
|
|
#include "nsReadableUtils.h"
|
2004-05-21 00:53:40 +00:00
|
|
|
#include "nsITextToSubURI.h"
|
2010-12-15 16:55:13 +00:00
|
|
|
#include "nsJSUtils.h"
|
2011-09-29 00:57:27 +00:00
|
|
|
#include "jsfriendapi.h"
|
2012-07-19 07:43:33 +00:00
|
|
|
#include "nsContentUtils.h"
|
2012-10-13 17:20:55 +00:00
|
|
|
#include "nsEventStateManager.h"
|
2001-11-14 23:45:23 +00:00
|
|
|
|
2005-10-17 18:47:13 +00:00
|
|
|
static nsresult
|
|
|
|
GetContextFromStack(nsIJSContextStack *aStack, JSContext **aContext)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIJSContextStackIterator>
|
2005-10-18 17:17:12 +00:00
|
|
|
iterator(do_CreateInstance("@mozilla.org/js/xpc/ContextStackIterator;1"));
|
2005-10-17 18:47:13 +00:00
|
|
|
NS_ENSURE_TRUE(iterator, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsresult rv = iterator->Reset(aStack);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2006-06-07 17:15:51 +00:00
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool done;
|
2005-10-17 18:47:13 +00:00
|
|
|
while (NS_SUCCEEDED(iterator->Done(&done)) && !done) {
|
|
|
|
rv = iterator->Prev(aContext);
|
|
|
|
NS_ASSERTION(NS_SUCCEEDED(rv), "Broken iterator implementation");
|
|
|
|
|
2006-06-07 17:15:51 +00:00
|
|
|
// Consider a null context the end of the line.
|
|
|
|
if (!*aContext) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2005-10-17 18:47:13 +00:00
|
|
|
if (nsJSUtils::GetDynamicScriptContext(*aContext)) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-30 14:20:58 +00:00
|
|
|
*aContext = nullptr;
|
2005-10-17 18:47:13 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
static nsresult
|
|
|
|
GetDocumentCharacterSetForURI(const nsAString& aHref, nsACString& aCharset)
|
2001-11-14 23:45:23 +00:00
|
|
|
{
|
2002-08-13 23:26:05 +00:00
|
|
|
aCharset.Truncate();
|
2001-11-14 23:45:23 +00:00
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIJSContextStack> stack(do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
JSContext *cx;
|
|
|
|
|
2005-10-17 18:47:13 +00:00
|
|
|
rv = GetContextFromStack(stack, &cx);
|
2001-11-14 23:45:23 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2004-03-03 18:13:00 +00:00
|
|
|
if (cx) {
|
|
|
|
nsCOMPtr<nsIDOMWindow> window =
|
|
|
|
do_QueryInterface(nsJSUtils::GetDynamicScriptGlobal(cx));
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
2001-11-14 23:45:23 +00:00
|
|
|
|
2004-03-03 18:13:00 +00:00
|
|
|
nsCOMPtr<nsIDOMDocument> domDoc;
|
|
|
|
rv = window->GetDocument(getter_AddRefs(domDoc));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(domDoc));
|
2001-11-14 23:45:23 +00:00
|
|
|
|
2004-03-03 18:13:00 +00:00
|
|
|
if (doc) {
|
|
|
|
aCharset = doc->GetDocumentCharacterSet();
|
|
|
|
}
|
|
|
|
}
|
2001-11-14 23:45:23 +00:00
|
|
|
|
2003-10-22 06:09:48 +00:00
|
|
|
return NS_OK;
|
2001-11-14 23:45:23 +00:00
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::nsLocation(nsIDocShell *aDocShell)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2006-06-20 18:56:03 +00:00
|
|
|
mDocShell = do_GetWeakReference(aDocShell);
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::~nsLocation()
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2010-01-12 13:08:43 +00:00
|
|
|
DOMCI_DATA(Location, nsLocation)
|
1998-08-13 04:34:53 +00:00
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
// QueryInterface implementation for nsLocation
|
|
|
|
NS_INTERFACE_MAP_BEGIN(nsLocation)
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMLocation)
|
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMLocation)
|
|
|
|
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(Location)
|
|
|
|
NS_INTERFACE_MAP_END
|
2001-01-09 01:16:36 +00:00
|
|
|
|
|
|
|
|
2004-12-10 19:48:22 +00:00
|
|
|
NS_IMPL_ADDREF(nsLocation)
|
|
|
|
NS_IMPL_RELEASE(nsLocation)
|
1998-08-13 04:34:53 +00:00
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
void
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetDocShell(nsIDocShell *aDocShell)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2006-06-20 18:56:03 +00:00
|
|
|
mDocShell = do_GetWeakReference(aDocShell);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIDocShell *
|
|
|
|
nsLocation::GetDocShell()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDocShell> docshell(do_QueryReferent(mDocShell));
|
|
|
|
return docshell;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2012-10-10 09:01:26 +00:00
|
|
|
// Try to get the the document corresponding to the given JSScript.
|
2010-12-15 16:55:13 +00:00
|
|
|
static already_AddRefed<nsIDocument>
|
2012-10-10 09:01:26 +00:00
|
|
|
GetScriptDocument(JSContext *cx, JSScript *script)
|
2010-12-15 16:55:13 +00:00
|
|
|
{
|
2012-10-10 09:01:26 +00:00
|
|
|
if (!cx || !script)
|
2012-07-30 14:20:58 +00:00
|
|
|
return nullptr;
|
2010-12-15 16:55:13 +00:00
|
|
|
|
2012-10-10 09:01:26 +00:00
|
|
|
JSObject* scope = JS_GetGlobalFromScript(script);
|
2010-12-15 16:55:13 +00:00
|
|
|
if (!scope)
|
2012-07-30 14:20:58 +00:00
|
|
|
return nullptr;
|
2010-12-15 16:55:13 +00:00
|
|
|
|
2012-08-22 01:42:53 +00:00
|
|
|
JSAutoCompartment ac(cx, scope);
|
2010-12-15 16:55:13 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindow> window =
|
|
|
|
do_QueryInterface(nsJSUtils::GetStaticScriptGlobal(cx, scope));
|
|
|
|
if (!window)
|
2012-07-30 14:20:58 +00:00
|
|
|
return nullptr;
|
2010-12-15 16:55:13 +00:00
|
|
|
|
|
|
|
// If it's a window, get its document.
|
|
|
|
nsCOMPtr<nsIDOMDocument> domDoc;
|
|
|
|
window->GetDocument(getter_AddRefs(domDoc));
|
|
|
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
|
|
|
|
return doc.forget();
|
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::CheckURL(nsIURI* aURI, nsIDocShellLoadInfo** aLoadInfo)
|
1999-09-07 02:54:19 +00:00
|
|
|
{
|
2012-07-30 14:20:58 +00:00
|
|
|
*aLoadInfo = nullptr;
|
2012-07-19 07:43:33 +00:00
|
|
|
JSContext* cx;
|
|
|
|
if ((cx = nsContentUtils::GetCurrentJSContext())) {
|
|
|
|
nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager();
|
|
|
|
NS_ENSURE_STATE(ssm);
|
|
|
|
// Check to see if URI is allowed.
|
|
|
|
nsresult rv = ssm->CheckLoadURIFromScript(cx, aURI);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
2002-07-24 20:42:22 +00:00
|
|
|
|
2006-06-20 18:56:03 +00:00
|
|
|
nsCOMPtr<nsIDocShell> docShell(do_QueryReferent(mDocShell));
|
2010-12-15 16:55:13 +00:00
|
|
|
NS_ENSURE_TRUE(docShell, NS_ERROR_NOT_AVAILABLE);
|
2006-06-20 18:56:03 +00:00
|
|
|
|
2010-12-15 16:55:13 +00:00
|
|
|
nsresult rv;
|
1999-09-07 02:54:19 +00:00
|
|
|
// Get JSContext from stack.
|
2001-01-09 01:16:36 +00:00
|
|
|
nsCOMPtr<nsIJSContextStack>
|
2010-12-15 16:55:13 +00:00
|
|
|
stack(do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2010-12-15 16:55:13 +00:00
|
|
|
NS_ENSURE_SUCCESS(GetContextFromStack(stack, &cx), NS_ERROR_FAILURE);
|
1999-09-07 02:54:19 +00:00
|
|
|
|
2005-02-24 20:19:58 +00:00
|
|
|
nsCOMPtr<nsISupports> owner;
|
2010-12-15 16:55:13 +00:00
|
|
|
nsCOMPtr<nsIURI> sourceURI;
|
2005-02-24 20:19:58 +00:00
|
|
|
|
|
|
|
if (cx) {
|
2002-07-24 20:42:22 +00:00
|
|
|
// No cx means that there's no JS running, or at least no JS that
|
|
|
|
// was run through code that properly pushed a context onto the
|
|
|
|
// context stack (as all code that runs JS off of web pages
|
2005-02-24 20:19:58 +00:00
|
|
|
// does). We won't bother with security checks in this case, but
|
|
|
|
// we need to create the loadinfo etc.
|
2002-07-24 20:42:22 +00:00
|
|
|
|
2005-02-24 20:19:58 +00:00
|
|
|
// Get security manager.
|
|
|
|
nsCOMPtr<nsIScriptSecurityManager>
|
2010-12-15 16:55:13 +00:00
|
|
|
secMan(do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2005-02-24 20:19:58 +00:00
|
|
|
// Check to see if URI is allowed.
|
2010-12-15 16:55:13 +00:00
|
|
|
rv = secMan->CheckLoadURIFromScript(cx, aURI);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2010-12-15 16:55:13 +00:00
|
|
|
// Make the load's referrer reflect changes to the document's URI caused by
|
|
|
|
// push/replaceState, if possible. First, get the document corresponding to
|
|
|
|
// fp. If the document's original URI (i.e. its URI before
|
|
|
|
// push/replaceState) matches the principal's URI, use the document's
|
|
|
|
// current URI as the referrer. If they don't match, use the principal's
|
|
|
|
// URI.
|
|
|
|
|
2012-10-10 09:01:26 +00:00
|
|
|
JSScript* script = nullptr;
|
2012-10-17 17:44:30 +00:00
|
|
|
nsCOMPtr<nsIDocument> doc;
|
2012-10-10 09:01:26 +00:00
|
|
|
nsCOMPtr<nsIURI> docOriginalURI, docCurrentURI, principalURI;
|
2012-10-17 17:44:30 +00:00
|
|
|
// NB: A false return value from JS_DescribeScriptedCaller means no caller
|
|
|
|
// was found. It does not signal that an exception was thrown.
|
|
|
|
if (JS_DescribeScriptedCaller(cx, &script, nullptr)) {
|
|
|
|
doc = GetScriptDocument(cx, script);
|
|
|
|
}
|
2012-10-10 09:01:26 +00:00
|
|
|
if (doc) {
|
|
|
|
docOriginalURI = doc->GetOriginalURI();
|
|
|
|
docCurrentURI = doc->GetDocumentURI();
|
|
|
|
rv = doc->NodePrincipal()->GetURI(getter_AddRefs(principalURI));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2010-12-15 16:55:13 +00:00
|
|
|
}
|
|
|
|
|
2011-09-29 06:19:26 +00:00
|
|
|
bool urisEqual = false;
|
2010-12-15 16:55:13 +00:00
|
|
|
if (docOriginalURI && docCurrentURI && principalURI) {
|
|
|
|
principalURI->Equals(docOriginalURI, &urisEqual);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (urisEqual) {
|
|
|
|
sourceURI = docCurrentURI;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
sourceURI = principalURI;
|
|
|
|
}
|
|
|
|
|
2012-10-10 09:01:26 +00:00
|
|
|
owner = do_QueryInterface(doc ? doc->NodePrincipal() : secMan->GetCxSubjectPrincipal(cx));
|
2005-02-24 20:19:58 +00:00
|
|
|
}
|
1999-09-07 02:54:19 +00:00
|
|
|
|
2000-08-11 04:31:08 +00:00
|
|
|
// Create load info
|
|
|
|
nsCOMPtr<nsIDocShellLoadInfo> loadInfo;
|
2006-06-20 18:56:03 +00:00
|
|
|
docShell->CreateLoadInfo(getter_AddRefs(loadInfo));
|
2000-08-11 04:31:08 +00:00
|
|
|
NS_ENSURE_TRUE(loadInfo, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
loadInfo->SetOwner(owner);
|
|
|
|
|
2010-12-15 16:55:13 +00:00
|
|
|
if (sourceURI) {
|
2001-11-17 17:26:18 +00:00
|
|
|
loadInfo->SetReferrer(sourceURI);
|
2010-12-15 16:55:13 +00:00
|
|
|
}
|
2005-02-24 20:19:58 +00:00
|
|
|
|
|
|
|
loadInfo.swap(*aLoadInfo);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
1999-09-07 02:54:19 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsresult
|
2011-09-29 06:19:26 +00:00
|
|
|
nsLocation::GetURI(nsIURI** aURI, bool aGetInnermostURI)
|
2002-03-06 07:48:55 +00:00
|
|
|
{
|
2012-07-30 14:20:58 +00:00
|
|
|
*aURI = nullptr;
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsresult rv;
|
2006-06-20 18:56:03 +00:00
|
|
|
nsCOMPtr<nsIDocShell> docShell(do_QueryReferent(mDocShell));
|
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(docShell, &rv));
|
2002-03-23 00:48:40 +00:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
return rv;
|
|
|
|
}
|
2002-03-06 07:48:55 +00:00
|
|
|
|
2002-12-12 15:48:30 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
rv = webNav->GetCurrentURI(getter_AddRefs(uri));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2003-01-05 06:34:53 +00:00
|
|
|
// It is valid for docshell to return a null URI. Don't try to fixup
|
|
|
|
// if this happens.
|
|
|
|
if (!uri) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-04-24 16:09:31 +00:00
|
|
|
if (aGetInnermostURI) {
|
|
|
|
nsCOMPtr<nsIJARURI> jarURI(do_QueryInterface(uri));
|
|
|
|
while (jarURI) {
|
|
|
|
jarURI->GetJARFile(getter_AddRefs(uri));
|
|
|
|
jarURI = do_QueryInterface(uri);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ASSERTION(uri, "nsJARURI screwed up?");
|
|
|
|
|
2002-12-12 15:48:30 +00:00
|
|
|
nsCOMPtr<nsIURIFixup> urifixup(do_GetService(NS_URIFIXUP_CONTRACTID, &rv));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
return urifixup->CreateExposableURI(uri, aURI);
|
2002-03-06 07:48:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetWritableURI(nsIURI** aURI)
|
2002-03-06 07:48:55 +00:00
|
|
|
{
|
2012-07-30 14:20:58 +00:00
|
|
|
*aURI = nullptr;
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
|
|
|
|
nsresult rv = GetURI(getter_AddRefs(uri));
|
2002-03-23 00:48:40 +00:00
|
|
|
if (NS_FAILED(rv) || !uri) {
|
|
|
|
return rv;
|
|
|
|
}
|
2002-03-06 07:48:55 +00:00
|
|
|
|
|
|
|
return uri->Clone(aURI);
|
|
|
|
}
|
1999-09-07 02:54:19 +00:00
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
nsresult
|
2011-09-29 06:19:26 +00:00
|
|
|
nsLocation::SetURI(nsIURI* aURI, bool aReplace)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2006-06-20 18:56:03 +00:00
|
|
|
nsCOMPtr<nsIDocShell> docShell(do_QueryReferent(mDocShell));
|
|
|
|
if (docShell) {
|
2000-03-30 22:38:32 +00:00
|
|
|
nsCOMPtr<nsIDocShellLoadInfo> loadInfo;
|
2006-06-20 18:56:03 +00:00
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(docShell));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
|
|
|
if(NS_FAILED(CheckURL(aURI, getter_AddRefs(loadInfo))))
|
1999-09-07 02:54:19 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2005-01-20 16:57:04 +00:00
|
|
|
if (aReplace) {
|
|
|
|
loadInfo->SetLoadType(nsIDocShellLoadInfo::loadStopContentAndReplace);
|
|
|
|
} else {
|
|
|
|
loadInfo->SetLoadType(nsIDocShellLoadInfo::loadStopContent);
|
|
|
|
}
|
|
|
|
|
2006-06-20 18:56:03 +00:00
|
|
|
return docShell->LoadURI(aURI, loadInfo,
|
2011-10-17 14:59:28 +00:00
|
|
|
nsIWebNavigation::LOAD_FLAGS_NONE, true);
|
1998-11-23 01:09:27 +00:00
|
|
|
}
|
2001-01-09 01:16:36 +00:00
|
|
|
|
|
|
|
return NS_OK;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetHash(nsAString& aHash)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-23 00:48:40 +00:00
|
|
|
aHash.SetLength(0);
|
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2004-05-21 00:53:40 +00:00
|
|
|
nsresult rv = GetURI(getter_AddRefs(uri));
|
2011-05-22 01:12:46 +00:00
|
|
|
if (NS_FAILED(rv) || !uri) {
|
|
|
|
return rv;
|
|
|
|
}
|
1999-06-18 17:34:08 +00:00
|
|
|
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString ref;
|
2011-05-22 01:12:46 +00:00
|
|
|
nsAutoString unicodeRef;
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2011-05-22 01:12:46 +00:00
|
|
|
rv = uri->GetRef(ref);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
nsCOMPtr<nsITextToSubURI> textToSubURI(
|
|
|
|
do_GetService(NS_ITEXTTOSUBURI_CONTRACTID, &rv));
|
2004-05-21 00:53:40 +00:00
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString charset;
|
2011-05-22 01:12:46 +00:00
|
|
|
uri->GetOriginCharset(charset);
|
2004-05-21 00:53:40 +00:00
|
|
|
|
2011-05-22 01:12:46 +00:00
|
|
|
rv = textToSubURI->UnEscapeURIForUI(charset, ref, unicodeRef);
|
|
|
|
}
|
2004-05-21 00:53:40 +00:00
|
|
|
|
2011-05-22 01:12:46 +00:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
// Oh, well. No intl here!
|
|
|
|
NS_UnescapeURL(ref);
|
|
|
|
CopyASCIItoUTF16(ref, unicodeRef);
|
|
|
|
rv = NS_OK;
|
2004-05-21 00:53:40 +00:00
|
|
|
}
|
2011-05-22 01:12:46 +00:00
|
|
|
}
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2011-05-22 01:12:46 +00:00
|
|
|
if (NS_SUCCEEDED(rv) && !unicodeRef.IsEmpty()) {
|
|
|
|
aHash.Assign(PRUnichar('#'));
|
|
|
|
aHash.Append(unicodeRef);
|
|
|
|
}
|
2011-05-20 20:21:27 +00:00
|
|
|
|
2011-05-22 01:12:46 +00:00
|
|
|
if (aHash == mCachedHash) {
|
|
|
|
// Work around ShareThis stupidly polling location.hash every
|
|
|
|
// 5ms all the time by handing out the same exact string buffer
|
|
|
|
// we handed out last time.
|
|
|
|
aHash = mCachedHash;
|
|
|
|
} else {
|
|
|
|
mCachedHash = aHash;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2004-05-21 00:53:40 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetHash(const nsAString& aHash)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2007-05-04 06:42:28 +00:00
|
|
|
nsresult rv = GetWritableURI(getter_AddRefs(uri));
|
2011-05-22 01:12:46 +00:00
|
|
|
if (NS_FAILED(rv) || !uri) {
|
|
|
|
return rv;
|
|
|
|
}
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2011-05-22 01:12:46 +00:00
|
|
|
NS_ConvertUTF16toUTF8 hash(aHash);
|
|
|
|
if (hash.IsEmpty() || hash.First() != PRUnichar('#')) {
|
|
|
|
hash.Insert(PRUnichar('#'), 0);
|
|
|
|
}
|
|
|
|
rv = uri->SetRef(hash);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
SetURI(uri);
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetHost(nsAString& aHost)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2003-12-23 15:41:10 +00:00
|
|
|
aHost.Truncate();
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
nsresult result;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
result = GetURI(getter_AddRefs(uri), true);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString hostport;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = uri->GetHostPort(hostport);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (NS_SUCCEEDED(result)) {
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendUTF8toUTF16(hostport, aHost);
|
2002-03-23 00:48:40 +00:00
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2010-08-07 07:11:43 +00:00
|
|
|
return NS_OK;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetHost(const nsAString& aHost)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2007-05-04 06:42:28 +00:00
|
|
|
nsresult rv = GetWritableURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2007-05-04 06:42:28 +00:00
|
|
|
rv = uri->SetHostPort(NS_ConvertUTF16toUTF8(aHost));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
SetURI(uri);
|
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetHostname(nsAString& aHostname)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2003-12-23 15:41:10 +00:00
|
|
|
aHostname.Truncate();
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
nsresult result;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
result = GetURI(getter_AddRefs(uri), true);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString host;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = uri->GetHost(host);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (NS_SUCCEEDED(result)) {
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendUTF8toUTF16(host, aHostname);
|
2002-03-23 00:48:40 +00:00
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2010-08-07 07:11:43 +00:00
|
|
|
return NS_OK;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetHostname(const nsAString& aHostname)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2007-05-04 06:42:28 +00:00
|
|
|
nsresult rv = GetWritableURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2007-05-04 06:42:28 +00:00
|
|
|
rv = uri->SetHost(NS_ConvertUTF16toUTF8(aHostname));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
SetURI(uri);
|
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetHref(nsAString& aHref)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2003-12-23 15:41:10 +00:00
|
|
|
aHref.Truncate();
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
nsresult result;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = GetURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString uriString;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = uri->GetSpec(uriString);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (NS_SUCCEEDED(result)) {
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendUTF8toUTF16(uriString, aHref);
|
2002-03-23 00:48:40 +00:00
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetHref(const nsAString& aHref)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
1999-08-03 23:16:48 +00:00
|
|
|
nsAutoString oldHref;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsresult rv = NS_OK;
|
1998-11-23 01:09:27 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
// Get JSContext from stack.
|
|
|
|
nsCOMPtr<nsIJSContextStack>
|
|
|
|
stack(do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return NS_ERROR_FAILURE;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
JSContext *cx;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2005-10-17 18:47:13 +00:00
|
|
|
if (NS_FAILED(GetContextFromStack(stack, &cx)))
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-10-13 17:20:55 +00:00
|
|
|
// According to HTML5 spec, |location.href = ...| must act as if
|
|
|
|
// it were |location.replace(...)| before the page load finishes.
|
|
|
|
//
|
|
|
|
// http://www.w3.org/TR/2011/WD-html5-20110113/history.html#location
|
|
|
|
//
|
|
|
|
// > The href attribute must return the current address of the
|
|
|
|
// > associated Document object, as an absolute URL.
|
|
|
|
// >
|
|
|
|
// > On setting, if the Location object's associated Document
|
|
|
|
// > object has completely loaded, then the user agent must act
|
|
|
|
// > as if the assign() method had been called with the new value
|
|
|
|
// > as its argument. Otherwise, the user agent must act as if
|
|
|
|
// > the replace() method had been called with the new value as its
|
|
|
|
// > argument.
|
|
|
|
//
|
|
|
|
// Note: The spec says the condition is "Document object has completely
|
|
|
|
// loaded", but that may break some websites. If the user was
|
|
|
|
// willing to move from one page to another, and was able to do
|
|
|
|
// so, we should not overwrite the session history entry even
|
|
|
|
// if the loading has not finished yet.
|
|
|
|
//
|
|
|
|
// https://www.w3.org/Bugs/Public/show_bug.cgi?id=17041
|
|
|
|
//
|
|
|
|
// See bug 39938, bug 72197, bug 178729 and bug 754029.
|
|
|
|
// About other browsers:
|
|
|
|
// http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-July/027372.html
|
|
|
|
|
|
|
|
bool replace = false;
|
|
|
|
if (!nsEventStateManager::IsHandlingUserInput()) {
|
|
|
|
// "completely loaded" is defined at:
|
|
|
|
//
|
|
|
|
// http://www.w3.org/TR/2012/WD-html5-20120329/the-end.html#completely-loaded
|
|
|
|
//
|
|
|
|
// > 7. document readiness to "complete", and fire "load".
|
|
|
|
// >
|
|
|
|
// > 8. "pageshow"
|
|
|
|
// >
|
|
|
|
// > 9. ApplicationCache
|
|
|
|
// >
|
|
|
|
// > 10. Print in the pending list.
|
|
|
|
// >
|
|
|
|
// > 12. Queue a task to mark the Document as completely loaded.
|
|
|
|
//
|
|
|
|
// Since Gecko doesn't (yet) have a flag corresponding to no. "12.
|
|
|
|
// ... completely loaded", here the logic is a little tricky.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShell> docShell(do_QueryReferent(mDocShell));
|
|
|
|
nsCOMPtr<nsIDocument> document(do_GetInterface(docShell));
|
|
|
|
if (document) {
|
|
|
|
replace =
|
|
|
|
nsIDocument::READYSTATE_COMPLETE != document->GetReadyStateEnum();
|
|
|
|
|
|
|
|
// nsIDocShell::isExecutingOnLoadHandler is true while
|
|
|
|
// the document is handling "load", "pageshow",
|
|
|
|
// "readystatechange" for "complete" and "beforeprint"/"afterprint".
|
|
|
|
//
|
|
|
|
// Maybe this API property needs a better name.
|
|
|
|
if (!replace) {
|
|
|
|
docShell->GetIsExecutingOnLoadHandler(&replace);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (cx) {
|
2012-10-13 17:20:55 +00:00
|
|
|
rv = SetHrefWithContext(cx, aHref, replace);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
} else {
|
|
|
|
rv = GetHref(oldHref);
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
nsCOMPtr<nsIURI> oldUri;
|
|
|
|
|
|
|
|
rv = NS_NewURI(getter_AddRefs(oldUri), oldHref);
|
|
|
|
|
|
|
|
if (oldUri) {
|
2012-10-13 17:20:55 +00:00
|
|
|
rv = SetHrefWithBase(aHref, oldUri, replace);
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
}
|
1999-08-03 23:16:48 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
return rv;
|
1999-08-03 23:16:48 +00:00
|
|
|
}
|
|
|
|
|
2000-08-29 00:14:23 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetHrefWithContext(JSContext* cx, const nsAString& aHref,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aReplace)
|
2000-08-29 00:14:23 +00:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIURI> base;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2000-08-29 00:14:23 +00:00
|
|
|
// Get the source of the caller
|
2001-11-17 17:26:18 +00:00
|
|
|
nsresult result = GetSourceBaseURL(cx, getter_AddRefs(base));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2000-08-29 00:14:23 +00:00
|
|
|
if (NS_FAILED(result)) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2001-05-15 20:58:31 +00:00
|
|
|
return SetHrefWithBase(aHref, base, aReplace);
|
2001-01-09 01:16:36 +00:00
|
|
|
}
|
2000-08-29 00:14:23 +00:00
|
|
|
|
1999-08-03 23:16:48 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetHrefWithBase(const nsAString& aHref, nsIURI* aBase,
|
2011-09-29 06:19:26 +00:00
|
|
|
bool aReplace)
|
1999-08-03 23:16:48 +00:00
|
|
|
{
|
|
|
|
nsresult result;
|
2009-03-25 01:52:24 +00:00
|
|
|
nsCOMPtr<nsIURI> newUri;
|
2003-03-05 22:23:47 +00:00
|
|
|
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString docCharset;
|
2002-08-13 23:26:05 +00:00
|
|
|
if (NS_SUCCEEDED(GetDocumentCharacterSetForURI(aHref, docCharset)))
|
2009-03-25 01:52:24 +00:00
|
|
|
result = NS_NewURI(getter_AddRefs(newUri), aHref, docCharset.get(), aBase);
|
2001-11-14 23:45:23 +00:00
|
|
|
else
|
2012-07-30 14:20:58 +00:00
|
|
|
result = NS_NewURI(getter_AddRefs(newUri), aHref, nullptr, aBase);
|
1999-09-01 00:54:35 +00:00
|
|
|
|
2005-01-20 16:57:04 +00:00
|
|
|
if (newUri) {
|
2012-10-13 17:20:55 +00:00
|
|
|
return SetURI(newUri, aReplace);
|
1998-11-23 01:09:27 +00:00
|
|
|
}
|
2001-01-09 01:16:36 +00:00
|
|
|
|
1998-11-23 01:09:27 +00:00
|
|
|
return result;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetPathname(nsAString& aPathname)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2003-12-23 15:41:10 +00:00
|
|
|
aPathname.Truncate();
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
1998-08-13 04:34:53 +00:00
|
|
|
nsresult result = NS_OK;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = GetURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
nsCOMPtr<nsIURL> url(do_QueryInterface(uri));
|
|
|
|
if (url) {
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString file;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
result = url->GetFilePath(file);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (NS_SUCCEEDED(result)) {
|
2003-12-23 15:41:10 +00:00
|
|
|
AppendUTF8toUTF16(file, aPathname);
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetPathname(const nsAString& aPathname)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2007-05-04 06:42:28 +00:00
|
|
|
nsresult rv = GetWritableURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2007-05-04 06:42:28 +00:00
|
|
|
rv = uri->SetPath(NS_ConvertUTF16toUTF8(aPathname));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
SetURI(uri);
|
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetPort(nsAString& aPort)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-23 00:48:40 +00:00
|
|
|
aPort.SetLength(0);
|
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
1998-08-13 04:34:53 +00:00
|
|
|
nsresult result = NS_OK;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
result = GetURI(getter_AddRefs(uri), true);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t port;
|
2005-07-19 21:12:18 +00:00
|
|
|
result = uri->GetPort(&port);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2005-07-19 21:12:18 +00:00
|
|
|
if (NS_SUCCEEDED(result) && -1 != port) {
|
2002-03-06 07:48:55 +00:00
|
|
|
nsAutoString portStr;
|
|
|
|
portStr.AppendInt(port);
|
|
|
|
aPort.Append(portStr);
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
2005-07-19 21:12:18 +00:00
|
|
|
|
|
|
|
// Don't propagate this exception to caller
|
|
|
|
result = NS_OK;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetPort(const nsAString& aPort)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2007-05-04 06:42:28 +00:00
|
|
|
nsresult rv = GetWritableURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2002-03-06 07:48:55 +00:00
|
|
|
// perhaps use nsReadingIterators at some point?
|
2006-02-03 14:18:39 +00:00
|
|
|
NS_ConvertUTF16toUTF8 portStr(aPort);
|
2002-03-06 07:48:55 +00:00
|
|
|
const char *buf = portStr.get();
|
2012-08-22 15:56:38 +00:00
|
|
|
int32_t port = -1;
|
2002-03-06 07:48:55 +00:00
|
|
|
|
|
|
|
if (buf) {
|
|
|
|
if (*buf == ':') {
|
|
|
|
port = atol(buf+1);
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
port = atol(buf);
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
}
|
2002-03-23 00:48:40 +00:00
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
rv = uri->SetPort(port);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
SetURI(uri);
|
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetProtocol(nsAString& aProtocol)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-23 00:48:40 +00:00
|
|
|
aProtocol.SetLength(0);
|
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
1998-08-13 04:34:53 +00:00
|
|
|
nsresult result = NS_OK;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = GetURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString protocol;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = uri->GetScheme(protocol);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
if (NS_SUCCEEDED(result)) {
|
2003-12-23 15:41:10 +00:00
|
|
|
CopyASCIItoUTF16(protocol, aProtocol);
|
2002-03-06 07:48:55 +00:00
|
|
|
aProtocol.Append(PRUnichar(':'));
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetProtocol(const nsAString& aProtocol)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2007-05-04 06:42:28 +00:00
|
|
|
nsresult rv = GetWritableURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
if (uri) {
|
2007-05-04 06:42:28 +00:00
|
|
|
rv = uri->SetScheme(NS_ConvertUTF16toUTF8(aProtocol));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
SetURI(uri);
|
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetSearch(nsAString& aSearch)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-23 00:48:40 +00:00
|
|
|
aSearch.SetLength(0);
|
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
1998-08-13 04:34:53 +00:00
|
|
|
nsresult result = NS_OK;
|
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
result = GetURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
nsCOMPtr<nsIURL> url(do_QueryInterface(uri));
|
|
|
|
|
|
|
|
if (url) {
|
2012-09-02 02:35:17 +00:00
|
|
|
nsAutoCString search;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
result = url->GetQuery(search);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-06 07:48:55 +00:00
|
|
|
if (NS_SUCCEEDED(result) && !search.IsEmpty()) {
|
2003-12-23 15:41:10 +00:00
|
|
|
aSearch.Assign(PRUnichar('?'));
|
|
|
|
AppendUTF8toUTF16(search, aSearch);
|
2002-03-06 07:48:55 +00:00
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2000-07-15 00:14:02 +00:00
|
|
|
return NS_OK;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::SetSearch(const nsAString& aSearch)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2002-03-06 07:48:55 +00:00
|
|
|
nsCOMPtr<nsIURI> uri;
|
2007-05-04 06:42:28 +00:00
|
|
|
nsresult rv = GetWritableURI(getter_AddRefs(uri));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2002-03-23 00:48:40 +00:00
|
|
|
nsCOMPtr<nsIURL> url(do_QueryInterface(uri));
|
|
|
|
if (url) {
|
2007-05-04 06:42:28 +00:00
|
|
|
rv = url->SetQuery(NS_ConvertUTF16toUTF8(aSearch));
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
SetURI(uri);
|
|
|
|
}
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2007-05-04 06:42:28 +00:00
|
|
|
return rv;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2011-09-29 06:19:26 +00:00
|
|
|
nsLocation::Reload(bool aForceget)
|
1998-08-13 04:34:53 +00:00
|
|
|
{
|
2001-10-09 05:02:25 +00:00
|
|
|
nsresult rv;
|
2006-06-20 18:56:03 +00:00
|
|
|
nsCOMPtr<nsIDocShell> docShell(do_QueryReferent(mDocShell));
|
|
|
|
nsCOMPtr<nsIWebNavigation> webNav(do_QueryInterface(docShell));
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window(do_GetInterface(docShell));
|
2004-10-20 02:19:57 +00:00
|
|
|
|
|
|
|
if (window && window->IsHandlingResizeEvent()) {
|
|
|
|
// location.reload() was called on a window that is handling a
|
|
|
|
// resize event. Sites do this since Netscape 4.x needed it, but
|
|
|
|
// we don't, and it's a horrible experience for nothing. In stead
|
|
|
|
// of reloading the page, just clear style data and reflow the
|
|
|
|
// page since some sites may use this trick to work around gecko
|
|
|
|
// reflow bugs, and this should have the same effect.
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
|
|
|
|
|
|
|
nsIPresShell *shell;
|
|
|
|
nsPresContext *pcx;
|
2010-06-25 13:59:57 +00:00
|
|
|
if (doc && (shell = doc->GetShell()) && (pcx = shell->GetPresContext())) {
|
2008-02-08 19:52:46 +00:00
|
|
|
pcx->RebuildAllStyleData(NS_STYLE_HINT_REFLOW);
|
2004-10-20 02:19:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-09-05 21:54:53 +00:00
|
|
|
if (webNav) {
|
2012-08-22 15:56:38 +00:00
|
|
|
uint32_t reloadFlags = nsIWebNavigation::LOAD_FLAGS_NONE;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2008-09-05 21:54:53 +00:00
|
|
|
if (aForceget) {
|
|
|
|
reloadFlags = nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE |
|
|
|
|
nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY;
|
|
|
|
}
|
|
|
|
rv = webNav->Reload(reloadFlags);
|
|
|
|
if (rv == NS_BINDING_ABORTED) {
|
|
|
|
// This happens when we attempt to reload a POST result and the user says
|
|
|
|
// no at the "do you want to reload?" prompt. Don't propagate this one
|
|
|
|
// back to callers.
|
|
|
|
rv = NS_OK;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
rv = NS_ERROR_FAILURE;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
|
|
|
|
2008-09-05 21:54:53 +00:00
|
|
|
return rv;
|
1999-08-03 23:16:48 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::Replace(const nsAString& aUrl)
|
2000-09-08 07:29:54 +00:00
|
|
|
{
|
2001-05-15 20:58:31 +00:00
|
|
|
nsresult rv = NS_OK;
|
2000-09-08 07:29:54 +00:00
|
|
|
|
2001-05-15 20:58:31 +00:00
|
|
|
// Get JSContext from stack.
|
|
|
|
nsCOMPtr<nsIJSContextStack>
|
2001-05-15 22:26:19 +00:00
|
|
|
stack(do_GetService("@mozilla.org/js/xpc/ContextStack;1"));
|
2001-01-09 01:16:36 +00:00
|
|
|
|
2001-05-15 20:58:31 +00:00
|
|
|
if (stack) {
|
|
|
|
JSContext *cx;
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
|
2005-10-17 18:47:13 +00:00
|
|
|
rv = GetContextFromStack(stack, &cx);
|
2001-05-15 20:58:31 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
if (cx) {
|
2011-10-17 14:59:28 +00:00
|
|
|
return SetHrefWithContext(cx, aUrl, true);
|
2000-09-08 07:29:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-05-15 20:58:31 +00:00
|
|
|
nsAutoString oldHref;
|
|
|
|
|
|
|
|
rv = GetHref(oldHref);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIURI> oldUri;
|
|
|
|
|
|
|
|
rv = NS_NewURI(getter_AddRefs(oldUri), oldHref);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2011-10-17 14:59:28 +00:00
|
|
|
return SetHrefWithBase(aUrl, oldUri, true);
|
2000-09-08 07:29:54 +00:00
|
|
|
}
|
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::Assign(const nsAString& aUrl)
|
1999-08-03 23:16:48 +00:00
|
|
|
{
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
nsAutoString oldHref;
|
1999-08-03 23:16:48 +00:00
|
|
|
nsresult result = NS_OK;
|
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
result = GetHref(oldHref);
|
1999-08-03 23:16:48 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (NS_SUCCEEDED(result)) {
|
|
|
|
nsCOMPtr<nsIURI> oldUri;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
result = NS_NewURI(getter_AddRefs(oldUri), oldHref);
|
2001-01-09 01:16:36 +00:00
|
|
|
|
Landing the XPCDOM_20010329_BRANCH branch, changes mostly done by jband@netscape.com and jst@netscape.com, also some changes done by shaver@mozilla.org, peterv@netscape.com and markh@activestate.com. r= and sr= by vidur@netscape.com, jband@netscape.com, jst@netscpae.com, danm@netscape.com, hyatt@netscape.com, shaver@mozilla.org, dbradley@netscape.com, rpotts@netscape.com.
2001-05-08 17:42:36 +00:00
|
|
|
if (oldUri) {
|
2011-10-17 14:59:28 +00:00
|
|
|
result = SetHrefWithBase(aUrl, oldUri, false);
|
1999-08-03 23:16:48 +00:00
|
|
|
}
|
|
|
|
}
|
2001-01-09 01:16:36 +00:00
|
|
|
|
1999-08-03 23:16:48 +00:00
|
|
|
return result;
|
1998-08-13 04:34:53 +00:00
|
|
|
}
|
1999-01-06 17:22:34 +00:00
|
|
|
|
2001-01-09 01:16:36 +00:00
|
|
|
NS_IMETHODIMP
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::ToString(nsAString& aReturn)
|
1999-01-06 17:22:34 +00:00
|
|
|
{
|
|
|
|
return GetHref(aReturn);
|
|
|
|
}
|
|
|
|
|
1999-08-03 23:16:48 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetSourceDocument(JSContext* cx, nsIDocument** aDocument)
|
1999-08-03 23:16:48 +00:00
|
|
|
{
|
|
|
|
// XXX Code duplicated from nsHTMLDocument
|
|
|
|
// XXX Tom said this reminded him of the "Six Degrees of
|
|
|
|
// Kevin Bacon" game. We try to get from here to there using
|
|
|
|
// whatever connections possible. The problem is that this
|
|
|
|
// could break if any of the connections along the way change.
|
|
|
|
// I wish there were a better way.
|
|
|
|
|
2004-01-09 23:54:21 +00:00
|
|
|
nsresult rv = NS_ERROR_FAILURE;
|
2001-01-09 01:16:36 +00:00
|
|
|
|
|
|
|
// We need to use the dynamically scoped global and assume that the
|
1999-12-18 20:29:29 +00:00
|
|
|
// current JSContext is a DOM context with a nsIScriptGlobalObject so
|
|
|
|
// that we can get the url of the caller.
|
|
|
|
// XXX This will fail on non-DOM contexts :(
|
|
|
|
|
2004-02-09 22:48:53 +00:00
|
|
|
nsCOMPtr<nsIDOMWindow> window =
|
|
|
|
do_QueryInterface(nsJSUtils::GetDynamicScriptGlobal(cx), &rv);
|
1999-12-18 20:29:29 +00:00
|
|
|
|
2004-01-09 23:54:21 +00:00
|
|
|
if (window) {
|
|
|
|
nsCOMPtr<nsIDOMDocument> domDoc;
|
|
|
|
rv = window->GetDocument(getter_AddRefs(domDoc));
|
|
|
|
if (domDoc) {
|
|
|
|
return CallQueryInterface(domDoc, aDocument);
|
2001-11-17 17:26:18 +00:00
|
|
|
}
|
|
|
|
} else {
|
2012-07-30 14:20:58 +00:00
|
|
|
*aDocument = nullptr;
|
2001-11-17 17:26:18 +00:00
|
|
|
}
|
2004-01-09 23:54:21 +00:00
|
|
|
|
|
|
|
return rv;
|
2001-11-17 17:26:18 +00:00
|
|
|
}
|
2000-01-15 02:02:27 +00:00
|
|
|
|
2001-11-17 17:26:18 +00:00
|
|
|
nsresult
|
2004-12-10 19:48:22 +00:00
|
|
|
nsLocation::GetSourceBaseURL(JSContext* cx, nsIURI** sourceURL)
|
2001-11-17 17:26:18 +00:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDocument> doc;
|
|
|
|
nsresult rv = GetSourceDocument(cx, getter_AddRefs(doc));
|
|
|
|
if (doc) {
|
2010-04-19 15:40:15 +00:00
|
|
|
*sourceURL = doc->GetBaseURI().get();
|
2004-01-09 23:54:21 +00:00
|
|
|
} else {
|
2012-07-30 14:20:58 +00:00
|
|
|
*sourceURL = nullptr;
|
1999-08-03 23:16:48 +00:00
|
|
|
}
|
2003-07-03 02:45:34 +00:00
|
|
|
|
2001-11-17 17:26:18 +00:00
|
|
|
return rv;
|
|
|
|
}
|