Fix assorted issues with fastback, including adding progress listener notifications and introducing the PageHide and PageShow events. See bug 292971 for all of the details. r=darin, sr=bzbarsky, a=shaver.

This commit is contained in:
bryner%brianryner.com 2005-06-15 23:52:46 +00:00
parent f00b4902e7
commit e4a343f08f
62 changed files with 791 additions and 443 deletions

View File

@ -278,12 +278,11 @@ nsresult nsRootAccessible::AddEventListeners()
GetChromeEventHandler(getter_AddRefs(target)); GetChromeEventHandler(getter_AddRefs(target));
NS_ASSERTION(target, "No chrome event handler for document"); NS_ASSERTION(target, "No chrome event handler for document");
if (target) { if (target) {
// onunload doesn't fire unless we use chrome event handler for target target->AddEventListener(NS_LITERAL_STRING("PageHide"),
target->AddEventListener(NS_LITERAL_STRING("unload"),
NS_STATIC_CAST(nsIDOMXULListener*, this), NS_STATIC_CAST(nsIDOMXULListener*, this),
PR_TRUE); PR_TRUE);
target->AddEventListener(NS_LITERAL_STRING("load"), target->AddEventListener(NS_LITERAL_STRING("PageShow"),
NS_STATIC_CAST(nsIDOMXULListener*, this), NS_STATIC_CAST(nsIDOMXULListener*, this),
PR_TRUE); PR_TRUE);
} }
@ -323,10 +322,10 @@ nsresult nsRootAccessible::RemoveEventListeners()
GetChromeEventHandler(getter_AddRefs(target)); GetChromeEventHandler(getter_AddRefs(target));
if (target) { if (target) {
target->RemoveEventListener(NS_LITERAL_STRING("unload"), target->RemoveEventListener(NS_LITERAL_STRING("PageHide"),
NS_STATIC_CAST(nsIDOMXULListener*, this), NS_STATIC_CAST(nsIDOMXULListener*, this),
PR_TRUE); PR_TRUE);
target->RemoveEventListener(NS_LITERAL_STRING("load"), target->RemoveEventListener(NS_LITERAL_STRING("PageShow"),
NS_STATIC_CAST(nsIDOMXULListener*, this), NS_STATIC_CAST(nsIDOMXULListener*, this),
PR_TRUE); PR_TRUE);
} }
@ -482,8 +481,8 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
return NS_OK; return NS_OK;
} }
if (eventType.LowerCaseEqualsLiteral("unload")) { if (eventType.LowerCaseEqualsLiteral("PageHide")) {
// Only get cached accessible for unload -- so that we don't create it // Only get cached accessible for pagehide -- so that we don't create it
// just to destroy it. // just to destroy it.
nsCOMPtr<nsIWeakReference> weakShell(do_GetWeakReference(eventShell)); nsCOMPtr<nsIWeakReference> weakShell(do_GetWeakReference(eventShell));
nsCOMPtr<nsIAccessibleDocument> accessibleDoc = nsCOMPtr<nsIAccessibleDocument> accessibleDoc =
@ -668,7 +667,7 @@ NS_IMETHODIMP nsRootAccessible::HandleEvent(nsIDOMEvent* aEvent)
} }
#else #else
AtkStateChange stateData; AtkStateChange stateData;
if (eventType.EqualsIgnoreCase("load")) { if (eventType.EqualsIgnoreCase("PageShow")) {
nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(targetNode)); nsCOMPtr<nsIHTMLDocument> htmlDoc(do_QueryInterface(targetNode));
if (htmlDoc) { if (htmlDoc) {
privAcc->FireToolkitEvent(nsIAccessibleEvent::EVENT_REORDER, privAcc->FireToolkitEvent(nsIAccessibleEvent::EVENT_REORDER,

View File

@ -112,7 +112,7 @@ var gAutoHideTabbarPrefListener = null;
* one listener that calls all real handlers. * one listener that calls all real handlers.
*/ */
function loadEventHandlers(event) function pageShowEventHandlers(event)
{ {
// Filter out events that are not about the document load we are interested in // Filter out events that are not about the document load we are interested in
if (event.originalTarget == content.document) { if (event.originalTarget == content.document) {
@ -727,7 +727,7 @@ function delayedStartup()
// loads the services // loads the services
initServices(); initServices();
initBMService(); initBMService();
gBrowser.addEventListener("load", function(evt) { setTimeout(loadEventHandlers, 0, evt); }, true); gBrowser.addEventListener("PageShow", function(evt) { setTimeout(pageShowEventHandlers, 0, evt); }, true);
window.addEventListener("keypress", ctrlNumberTabSelection, false); window.addEventListener("keypress", ctrlNumberTabSelection, false);

View File

@ -90,8 +90,8 @@ class nsILayoutHistoryState;
// IID for the nsIDocument interface // IID for the nsIDocument interface
#define NS_IDOCUMENT_IID \ #define NS_IDOCUMENT_IID \
{ 0x97e4f20e, 0x73de, 0x41fd, \ { 0x9339ff1e, 0xdab0, 0x4264, \
{ 0x85, 0x20, 0x41, 0x45, 0xc8, 0x74, 0xf5, 0x85 } } { 0x8a, 0x8c, 0xcb, 0x84, 0xeb, 0x4e, 0x6b, 0x92 } }
// The base value for the content ID counter. // The base value for the content ID counter.
// This counter is used by the document to // This counter is used by the document to
@ -731,6 +731,26 @@ public:
virtual void BlockOnload() = 0; virtual void BlockOnload() = 0;
virtual void UnblockOnload() = 0; virtual void UnblockOnload() = 0;
/**
* Notification that the page has been shown, for documents which are loaded
* into a DOM window. This corresponds to the completion of document load,
* or to the page's presentation being restored into an existing DOM window.
* This notification fires applicable DOM events to the content window. See
* nsIDOMPageTransitionEvent.idl for a description of the |aPersisted|
* parameter.
*/
virtual void OnPageShow(PRBool aPersisted) = 0;
/**
* Notification that the page has been hidden, for documents which are loaded
* into a DOM window. This corresponds to the unloading of the document, or
* to the document's presentation being saved but removed from an existing
* DOM window. This notification fires applicable DOM events to the content
* window. See nsIDOMPageTransitionEvent.idl for a description of the
* |aPersisted| parameter.
*/
virtual void OnPageHide(PRBool aPersisted) = 0;
protected: protected:
~nsIDocument() ~nsIDocument()
{ {

View File

@ -128,6 +128,7 @@ static NS_DEFINE_CID(kDOMEventGroupCID, NS_DOMEVENTGROUP_CID);
#include "nsBindingManager.h" #include "nsBindingManager.h"
#include "nsIDOMHTMLFormElement.h" #include "nsIDOMHTMLFormElement.h"
#include "nsIRequest.h" #include "nsIRequest.h"
#include "nsILink.h"
#include "nsICharsetAlias.h" #include "nsICharsetAlias.h"
static NS_DEFINE_CID(kCharsetAliasCID, NS_CHARSETALIAS_CID); static NS_DEFINE_CID(kCharsetAliasCID, NS_CHARSETALIAS_CID);
@ -4909,3 +4910,73 @@ nsDocument::UnblockOnload()
} }
} }
} }
void
nsDocument::OnPageShow(PRBool aPersisted)
{
if (aPersisted) {
// Send out notifications that our <link> elements are attached.
nsRefPtr<nsContentList> links = NS_GetContentList(this,
nsHTMLAtoms::link,
kNameSpaceID_Unknown,
mRootContent);
if (links) {
PRUint32 linkCount = links->Length(PR_TRUE);
for (PRUint32 i = 0; i < linkCount; ++i) {
nsCOMPtr<nsILink> link = do_QueryInterface(links->Item(i, PR_FALSE));
if (link) {
link->LinkAdded();
}
}
}
}
nsIPresShell *shell = NS_STATIC_CAST(nsIPresShell*, mPresShells[0]);
if (shell && mScriptGlobalObject) {
nsPresContext *pc = shell->GetPresContext();
if (pc) {
nsPageTransitionEvent event(PR_TRUE, NS_PAGE_SHOW, aPersisted);
nsEventStatus status = nsEventStatus_eIgnore;
mScriptGlobalObject->HandleDOMEvent(pc, &event, nsnull,
NS_EVENT_FLAG_INIT, &status);
}
}
}
void
nsDocument::OnPageHide(PRBool aPersisted)
{
// Send out notifications that our <link> elements are detached,
// but only if this is not a full unload.
if (aPersisted) {
nsRefPtr<nsContentList> links = NS_GetContentList(this,
nsHTMLAtoms::link,
kNameSpaceID_Unknown,
mRootContent);
if (links) {
PRUint32 linkCount = links->Length(PR_TRUE);
for (PRUint32 i = 0; i < linkCount; ++i) {
nsCOMPtr<nsILink> link = do_QueryInterface(links->Item(i, PR_FALSE));
if (link) {
link->LinkRemoved();
}
}
}
}
// Now send out a PageHide event.
nsIPresShell *shell = NS_STATIC_CAST(nsIPresShell*, mPresShells[0]);
if (shell && mScriptGlobalObject) {
nsPresContext *pc = shell->GetPresContext();
if (pc) {
nsPageTransitionEvent event(PR_TRUE, NS_PAGE_HIDE, aPersisted);
nsEventStatus status = nsEventStatus_eIgnore;
mScriptGlobalObject->HandleDOMEvent(pc, &event, nsnull,
NS_EVENT_FLAG_INIT, &status);
}
}
}

View File

@ -440,6 +440,9 @@ public:
PRUint32 aFlags, PRUint32 aFlags,
nsEventStatus* aEventStatus); nsEventStatus* aEventStatus);
virtual void OnPageShow(PRBool aPersisted);
virtual void OnPageHide(PRBool aPersisted);
// nsIRadioGroupContainer // nsIRadioGroupContainer
NS_IMETHOD WalkRadioGroup(const nsAString& aName, NS_IMETHOD WalkRadioGroup(const nsAString& aName,
nsIRadioVisitor* aVisitor); nsIRadioVisitor* aVisitor);

View File

@ -120,7 +120,6 @@ public:
NS_IMETHOD Unload(nsIDOMEvent* aEvent); NS_IMETHOD Unload(nsIDOMEvent* aEvent);
NS_IMETHOD Abort(nsIDOMEvent* aEvent); NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent); NS_IMETHOD Error(nsIDOMEvent* aEvent);
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent);
NS_DECL_NSICHANNELEVENTSINK NS_DECL_NSICHANNELEVENTSINK
@ -162,7 +161,6 @@ public:
NS_IMETHOD Unload(nsIDOMEvent* aEvent); NS_IMETHOD Unload(nsIDOMEvent* aEvent);
NS_IMETHOD Abort(nsIDOMEvent* aEvent); NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent); NS_IMETHOD Error(nsIDOMEvent* aEvent);
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent);
protected: protected:
nsWeakPtr mParent; nsWeakPtr mParent;
@ -251,18 +249,6 @@ txLoadListenerProxy::Error(nsIDOMEvent* aEvent)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
txLoadListenerProxy::PageRestore(nsIDOMEvent* aEvent)
{
nsCOMPtr<nsIDOMLoadListener> listener = do_QueryReferent(mParent);
if (listener) {
return listener->PageRestore(aEvent);
}
return NS_OK;
}
class nsForceXMLListener : public nsIStreamListener class nsForceXMLListener : public nsIStreamListener
{ {
public: public:
@ -526,12 +512,6 @@ nsSyncLoader::Error(nsIDOMEvent* aEvent)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsSyncLoader::PageRestore(nsIDOMEvent* aEvent)
{
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
nsSyncLoader::OnChannelRedirect(nsIChannel *aOldChannel, nsSyncLoader::OnChannelRedirect(nsIChannel *aOldChannel,
nsIChannel *aNewChannel, nsIChannel *aNewChannel,

View File

@ -85,5 +85,7 @@ nsresult
NS_NewDOMTextEvent(nsIDOMEvent** aResult, nsPresContext* aPresContext, class nsTextEvent* aEvent); NS_NewDOMTextEvent(nsIDOMEvent** aResult, nsPresContext* aPresContext, class nsTextEvent* aEvent);
nsresult nsresult
NS_NewDOMBeforeUnloadEvent(nsIDOMEvent** aResult, nsPresContext* aPresContext, class nsBeforePageUnloadEvent* aEvent); NS_NewDOMBeforeUnloadEvent(nsIDOMEvent** aResult, nsPresContext* aPresContext, class nsBeforePageUnloadEvent* aEvent);
nsresult
NS_NewDOMPageTransitionEvent(nsIDOMEvent** aResult, nsPresContext* aPresContext, class nsPageTransitionEvent* aEvent);
#endif // nsIPrivateDOMEvent_h__ #endif // nsIPrivateDOMEvent_h__

View File

@ -75,6 +75,7 @@ CPPSRCS = \
nsDOMMutationEvent.cpp \ nsDOMMutationEvent.cpp \
nsDOMPopupBlockedEvent.cpp \ nsDOMPopupBlockedEvent.cpp \
nsDOMBeforeUnloadEvent.cpp \ nsDOMBeforeUnloadEvent.cpp \
nsDOMPageTransitionEvent.cpp \
nsPrivateTextRange.cpp \ nsPrivateTextRange.cpp \
nsDOMEventGroup.cpp \ nsDOMEventGroup.cpp \
nsXMLEventsManager.cpp \ nsXMLEventsManager.cpp \

View File

@ -58,15 +58,16 @@ static const char* const sEventNames[] = {
"mousedown", "mouseup", "click", "dblclick", "mouseover", "mousedown", "mouseup", "click", "dblclick", "mouseover",
"mouseout", "mousemove", "contextmenu", "keydown", "keyup", "keypress", "mouseout", "mousemove", "contextmenu", "keydown", "keyup", "keypress",
"focus", "blur", "load", "beforeunload", "unload", "abort", "error", "focus", "blur", "load", "beforeunload", "unload", "abort", "error",
"DOMPageRestore", "submit", "reset", "change", "select", "input", "paint", "submit", "reset", "change", "select", "input", "paint" ,"text",
"text", "compositionstart", "compositionend", "popupshowing", "popupshown", "compositionstart", "compositionend", "popupshowing", "popupshown",
"popuphiding", "popuphidden", "close", "command", "broadcast", "commandupdate", "popuphiding", "popuphidden", "close", "command", "broadcast", "commandupdate",
"dragenter", "dragover", "dragexit", "dragdrop", "draggesture", "resize", "dragenter", "dragover", "dragexit", "dragdrop", "draggesture", "resize",
"scroll","overflow", "underflow", "overflowchanged", "scroll","overflow", "underflow", "overflowchanged",
"DOMSubtreeModified", "DOMNodeInserted", "DOMNodeRemoved", "DOMSubtreeModified", "DOMNodeInserted", "DOMNodeRemoved",
"DOMNodeRemovedFromDocument", "DOMNodeInsertedIntoDocument", "DOMNodeRemovedFromDocument", "DOMNodeInsertedIntoDocument",
"DOMAttrModified", "DOMCharacterDataModified", "DOMAttrModified", "DOMCharacterDataModified",
"popupBlocked", "DOMActivate", "DOMFocusIn", "DOMFocusOut" "popupBlocked", "DOMActivate", "DOMFocusIn", "DOMFocusOut",
"PageShow", "PageHide"
}; };
static char *sPopupAllowedEvents; static char *sPopupAllowedEvents;
@ -434,8 +435,6 @@ nsDOMEvent::SetEventType(const nsAString& aEventTypeArg)
mEvent->message = NS_IMAGE_ABORT; mEvent->message = NS_IMAGE_ABORT;
else if (atom == nsLayoutAtoms::onerror) else if (atom == nsLayoutAtoms::onerror)
mEvent->message = NS_IMAGE_ERROR; mEvent->message = NS_IMAGE_ERROR;
else if (atom == nsLayoutAtoms::onDOMPageRestore)
mEvent->message = NS_PAGE_RESTORE;
} else if (mEvent->eventStructType == NS_MUTATION_EVENT) { } else if (mEvent->eventStructType == NS_MUTATION_EVENT) {
if (atom == nsLayoutAtoms::onDOMAttrModified) if (atom == nsLayoutAtoms::onDOMAttrModified)
mEvent->message = NS_MUTATION_ATTRMODIFIED; mEvent->message = NS_MUTATION_ATTRMODIFIED;
@ -458,6 +457,11 @@ nsDOMEvent::SetEventType(const nsAString& aEventTypeArg)
mEvent->message = NS_UI_FOCUSIN; mEvent->message = NS_UI_FOCUSIN;
else if (atom == nsLayoutAtoms::onDOMFocusOut) else if (atom == nsLayoutAtoms::onDOMFocusOut)
mEvent->message = NS_UI_FOCUSOUT; mEvent->message = NS_UI_FOCUSOUT;
} else if (mEvent->eventStructType == NS_PAGETRANSITION_EVENT) {
if (atom == nsLayoutAtoms::onPageShow)
mEvent->message = NS_PAGE_SHOW;
else if (atom == nsLayoutAtoms::onPageHide)
mEvent->message = NS_PAGE_HIDE;
} }
if (mEvent->message == NS_USER_DEFINED_EVENT) if (mEvent->message == NS_USER_DEFINED_EVENT)
@ -796,8 +800,6 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType)
case NS_IMAGE_ERROR: case NS_IMAGE_ERROR:
case NS_SCRIPT_ERROR: case NS_SCRIPT_ERROR:
return sEventNames[eDOMEvents_error]; return sEventNames[eDOMEvents_error];
case NS_PAGE_RESTORE:
return sEventNames[eDOMEvents_DOMPageRestore];
case NS_FORM_SUBMIT: case NS_FORM_SUBMIT:
return sEventNames[eDOMEvents_submit]; return sEventNames[eDOMEvents_submit];
case NS_FORM_RESET: case NS_FORM_RESET:
@ -869,6 +871,10 @@ const char* nsDOMEvent::GetEventName(PRUint32 aEventType)
return sEventNames[eDOMEvents_DOMFocusIn]; return sEventNames[eDOMEvents_DOMFocusIn];
case NS_UI_FOCUSOUT: case NS_UI_FOCUSOUT:
return sEventNames[eDOMEvents_DOMFocusOut]; return sEventNames[eDOMEvents_DOMFocusOut];
case NS_PAGE_SHOW:
return sEventNames[eDOMEvents_PageShow];
case NS_PAGE_HIDE:
return sEventNames[eDOMEvents_PageHide];
default: default:
break; break;
} }

View File

@ -85,7 +85,6 @@ public:
eDOMEvents_unload, eDOMEvents_unload,
eDOMEvents_abort, eDOMEvents_abort,
eDOMEvents_error, eDOMEvents_error,
eDOMEvents_DOMPageRestore,
eDOMEvents_submit, eDOMEvents_submit,
eDOMEvents_reset, eDOMEvents_reset,
eDOMEvents_change, eDOMEvents_change,
@ -123,7 +122,9 @@ public:
eDOMEvents_popupBlocked, eDOMEvents_popupBlocked,
eDOMEvents_DOMActivate, eDOMEvents_DOMActivate,
eDOMEvents_DOMFocusIn, eDOMEvents_DOMFocusIn,
eDOMEvents_DOMFocusOut eDOMEvents_DOMFocusOut,
eDOMEvents_PageShow,
eDOMEvents_PageHide
}; };
nsDOMEvent(nsPresContext* aPresContext, nsEvent* aEvent); nsDOMEvent(nsPresContext* aPresContext, nsEvent* aEvent);

View File

@ -0,0 +1,96 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@brianryner.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsDOMPageTransitionEvent.h"
#include "nsContentUtils.h"
nsDOMPageTransitionEvent::nsDOMPageTransitionEvent(nsPresContext* aPresContext,
nsPageTransitionEvent* aEvent)
: nsDOMEvent(aPresContext, aEvent ? aEvent :
new nsPageTransitionEvent(PR_FALSE, 0, PR_FALSE))
{
if ( aEvent ) {
mEventIsInternal = PR_FALSE;
}
else
{
mEventIsInternal = PR_TRUE;
mEvent->time = PR_Now();
}
}
NS_INTERFACE_MAP_BEGIN(nsDOMPageTransitionEvent)
NS_INTERFACE_MAP_ENTRY(nsIDOMPageTransitionEvent)
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(PageTransitionEvent)
NS_INTERFACE_MAP_END_INHERITING(nsDOMEvent)
NS_IMPL_ADDREF_INHERITED(nsDOMPageTransitionEvent, nsDOMEvent)
NS_IMPL_RELEASE_INHERITED(nsDOMPageTransitionEvent, nsDOMEvent)
NS_IMETHODIMP
nsDOMPageTransitionEvent::GetPersisted(PRBool* aPersisted)
{
*aPersisted = NS_STATIC_CAST(nsPageTransitionEvent*, mEvent)->persisted;
return NS_OK;
}
NS_IMETHODIMP
nsDOMPageTransitionEvent::InitPageTransitionEvent(const nsAString &aTypeArg,
PRBool aCanBubbleArg,
PRBool aCancelableArg,
PRBool aPersisted)
{
nsresult rv = nsDOMEvent::InitEvent(aTypeArg, aCanBubbleArg, aCancelableArg);
NS_ENSURE_SUCCESS(rv, rv);
NS_STATIC_CAST(nsPageTransitionEvent*, mEvent)->persisted = aPersisted;
return NS_OK;
}
nsresult NS_NewDOMPageTransitionEvent(nsIDOMEvent** aInstancePtrResult,
nsPresContext* aPresContext,
nsPageTransitionEvent *aEvent)
{
nsDOMPageTransitionEvent* it =
new nsDOMPageTransitionEvent(aPresContext, aEvent);
if (nsnull == it) {
return NS_ERROR_OUT_OF_MEMORY;
}
return CallQueryInterface(it, aInstancePtrResult);
}

View File

@ -0,0 +1,60 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@brianryner.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsDOMPageTransitionEvent_h__
#define nsDOMPageTransitionEvent_h__
#include "nsIDOMPageTransitionEvent.h"
#include "nsDOMEvent.h"
class nsDOMPageTransitionEvent : public nsIDOMPageTransitionEvent,
public nsDOMEvent
{
public:
nsDOMPageTransitionEvent(nsPresContext* aPresContext,
nsPageTransitionEvent* aEvent);
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSIDOMPAGETRANSITIONEVENT
// Forward to base class
NS_FORWARD_TO_NSDOMEVENT
};
#endif // nsDOMPageTransitionEvent_h__

View File

@ -56,6 +56,7 @@
#include "nsIDOMScrollListener.h" #include "nsIDOMScrollListener.h"
#include "nsIDOMMutationListener.h" #include "nsIDOMMutationListener.h"
#include "nsIDOMUIListener.h" #include "nsIDOMUIListener.h"
#include "nsIDOMPageTransitionListener.h"
#include "nsIEventStateManager.h" #include "nsIEventStateManager.h"
#include "nsPIDOMWindow.h" #include "nsPIDOMWindow.h"
#include "nsIPrivateDOMEvent.h" #include "nsIPrivateDOMEvent.h"
@ -242,7 +243,6 @@ static const EventDispatchData sLoadEvents[] = {
{NS_IMAGE_ERROR, HANDLER(&nsIDOMLoadListener::Error), NS_EVENT_BITS_LOAD_ERROR}, {NS_IMAGE_ERROR, HANDLER(&nsIDOMLoadListener::Error), NS_EVENT_BITS_LOAD_ERROR},
{NS_SCRIPT_ERROR,HANDLER(&nsIDOMLoadListener::Error), NS_EVENT_BITS_LOAD_ERROR}, {NS_SCRIPT_ERROR,HANDLER(&nsIDOMLoadListener::Error), NS_EVENT_BITS_LOAD_ERROR},
{NS_BEFORE_PAGE_UNLOAD,HANDLER(&nsIDOMLoadListener::BeforeUnload), NS_EVENT_BITS_LOAD_BEFORE_UNLOAD}, {NS_BEFORE_PAGE_UNLOAD,HANDLER(&nsIDOMLoadListener::BeforeUnload), NS_EVENT_BITS_LOAD_BEFORE_UNLOAD},
{NS_PAGE_RESTORE,HANDLER(&nsIDOMLoadListener::PageRestore), NS_EVENT_BITS_LOAD_PAGE_RESTORE}
}; };
static const EventDispatchData sPaintEvents[] = { static const EventDispatchData sPaintEvents[] = {
@ -320,6 +320,13 @@ static const EventDispatchData sUIEvents[] = {
NS_EVENT_BITS_UI_FOCUSOUT } NS_EVENT_BITS_UI_FOCUSOUT }
}; };
static const EventDispatchData sPageTransitionEvents[] = {
{ NS_PAGE_SHOW, HANDLER(&nsIDOMPageTransitionListener::PageShow),
NS_EVENT_BITS_PAGETRANSITION_SHOW },
{ NS_PAGE_HIDE, HANDLER(&nsIDOMPageTransitionListener::PageHide),
NS_EVENT_BITS_PAGETRANSITION_HIDE }
};
#define IMPL_EVENTTYPEDATA(type) \ #define IMPL_EVENTTYPEDATA(type) \
{ \ { \
s##type##Events, \ s##type##Events, \
@ -344,7 +351,8 @@ static const EventTypeData sEventTypes[] = {
IMPL_EVENTTYPEDATA(XUL), IMPL_EVENTTYPEDATA(XUL),
IMPL_EVENTTYPEDATA(Scroll), IMPL_EVENTTYPEDATA(Scroll),
IMPL_EVENTTYPEDATA(Mutation), IMPL_EVENTTYPEDATA(Mutation),
IMPL_EVENTTYPEDATA(UI) IMPL_EVENTTYPEDATA(UI),
IMPL_EVENTTYPEDATA(PageTransition)
}; };
// Strong references to event groups // Strong references to event groups
@ -892,10 +900,6 @@ nsEventListenerManager::GetIdentifiersForType(nsIAtom* aType,
*aArrayType = eEventArrayType_Load; *aArrayType = eEventArrayType_Load;
*aFlags = NS_EVENT_BITS_LOAD_ERROR; *aFlags = NS_EVENT_BITS_LOAD_ERROR;
} }
else if (aType == nsLayoutAtoms::onDOMPageRestore) {
*aArrayType = eEventArrayType_Load;
*aFlags = NS_EVENT_BITS_LOAD_PAGE_RESTORE;
}
else if (aType == nsLayoutAtoms::onpaint) { else if (aType == nsLayoutAtoms::onpaint) {
*aArrayType = eEventArrayType_Paint; *aArrayType = eEventArrayType_Paint;
*aFlags = NS_EVENT_BITS_PAINT_PAINT; *aFlags = NS_EVENT_BITS_PAINT_PAINT;
@ -1020,6 +1024,14 @@ nsEventListenerManager::GetIdentifiersForType(nsIAtom* aType,
*aArrayType = eEventArrayType_Composition; *aArrayType = eEventArrayType_Composition;
*aFlags = NS_EVENT_BITS_COMPOSITION_END; *aFlags = NS_EVENT_BITS_COMPOSITION_END;
} }
else if (aType == nsLayoutAtoms::onPageShow) {
*aArrayType = eEventArrayType_PageTransition;
*aFlags = NS_EVENT_BITS_PAGETRANSITION_SHOW;
}
else if (aType == nsLayoutAtoms::onPageHide) {
*aArrayType = eEventArrayType_PageTransition;
*aFlags = NS_EVENT_BITS_PAGETRANSITION_HIDE;
}
else { else {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -1723,6 +1735,10 @@ nsEventListenerManager::CreateEvent(nsPresContext* aPresContext,
NS_NewDOMBeforeUnloadEvent(aDOMEvent, aPresContext, NS_NewDOMBeforeUnloadEvent(aDOMEvent, aPresContext,
NS_STATIC_CAST(nsBeforePageUnloadEvent*, NS_STATIC_CAST(nsBeforePageUnloadEvent*,
aEvent)); aEvent));
case NS_PAGETRANSITION_EVENT:
return NS_NewDOMPageTransitionEvent(aDOMEvent, aPresContext,
NS_STATIC_CAST(nsPageTransitionEvent*,
aEvent));
} }
// For all other types of events, create a vanilla event object. // For all other types of events, create a vanilla event object.

View File

@ -84,6 +84,7 @@ enum EventArrayType {
eEventArrayType_Scroll = 12, eEventArrayType_Scroll = 12,
eEventArrayType_Mutation = 13, eEventArrayType_Mutation = 13,
eEventArrayType_DOMUI = 14, eEventArrayType_DOMUI = 14,
eEventArrayType_PageTransition = 15,
eEventArrayType_Hash, eEventArrayType_Hash,
eEventArrayType_None eEventArrayType_None
}; };
@ -303,7 +304,6 @@ protected:
#define NS_EVENT_BITS_LOAD_ABORT 0x04 #define NS_EVENT_BITS_LOAD_ABORT 0x04
#define NS_EVENT_BITS_LOAD_ERROR 0x08 #define NS_EVENT_BITS_LOAD_ERROR 0x08
#define NS_EVENT_BITS_LOAD_BEFORE_UNLOAD 0x10 #define NS_EVENT_BITS_LOAD_BEFORE_UNLOAD 0x10
#define NS_EVENT_BITS_LOAD_PAGE_RESTORE 0x20
//nsIDOMXULListener //nsIDOMXULListener
#define NS_EVENT_BITS_XUL_NONE 0x00 #define NS_EVENT_BITS_XUL_NONE 0x00
@ -349,4 +349,9 @@ protected:
#define NS_EVENT_BITS_UI_FOCUSIN 0x02 #define NS_EVENT_BITS_UI_FOCUSIN 0x02
#define NS_EVENT_BITS_UI_FOCUSOUT 0x04 #define NS_EVENT_BITS_UI_FOCUSOUT 0x04
// nsIDOMPageTransitionListener
#define NS_EVENT_BITS_PAGETRANSITION_NONE 0x00
#define NS_EVENT_BITS_PAGETRANSITION_SHOW 0x01
#define NS_EVENT_BITS_PAGETRANSITION_HIDE 0x02
#endif // nsEventListenerManager_h__ #endif // nsEventListenerManager_h__

View File

@ -45,8 +45,8 @@ class nsIURI;
// IID for the nsILink interface // IID for the nsILink interface
#define NS_ILINK_IID \ #define NS_ILINK_IID \
{ 0xa904ac22, 0x28fa, 0x4812, \ { 0x0c212bc4, 0xfcd7, 0x479d, \
{ 0xbe, 0xf3, 0x2, 0x2f, 0xf3, 0x3b, 0x8e, 0xf5 } } { 0x8c, 0x3f, 0x3b, 0xe8, 0xe6, 0x78, 0x74, 0x50 } }
/** /**
* This interface allows SelectorMatches to get the canonical * This interface allows SelectorMatches to get the canonical
@ -86,6 +86,20 @@ public:
*/ */
NS_IMETHOD GetHrefURI(nsIURI** aURI) = 0; NS_IMETHOD GetHrefURI(nsIURI** aURI) = 0;
/**
* Dispatch a LinkAdded event to the nsIChromeEventHandler for this document.
* This is used to notify the chrome listeners when restoring a page
* presentation. Currently, this only applies to HTML <link> elements.
*/
NS_IMETHOD LinkAdded() = 0;
/**
* Dispatch a LinkRemoved event to the nsIChromeEventHandler for this
* document. This is used to notify the chrome listeners when saving a page
* presentation (since the document is not torn down). Currently, this only
* applies to HTML <link> elements.
*/
NS_IMETHOD LinkRemoved() = 0;
}; };
#endif /* nsILink_h___ */ #endif /* nsILink_h___ */

View File

@ -97,6 +97,8 @@ public:
NS_IMETHOD GetLinkState(nsLinkState &aState); NS_IMETHOD GetLinkState(nsLinkState &aState);
NS_IMETHOD SetLinkState(nsLinkState aState); NS_IMETHOD SetLinkState(nsLinkState aState);
NS_IMETHOD GetHrefURI(nsIURI** aURI); NS_IMETHOD GetHrefURI(nsIURI** aURI);
NS_IMETHOD LinkAdded() { return NS_OK; }
NS_IMETHOD LinkRemoved() { return NS_OK; }
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent, virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent, nsIContent* aBindingParent,

View File

@ -81,6 +81,8 @@ public:
NS_IMETHOD GetLinkState(nsLinkState &aState); NS_IMETHOD GetLinkState(nsLinkState &aState);
NS_IMETHOD SetLinkState(nsLinkState aState); NS_IMETHOD SetLinkState(nsLinkState aState);
NS_IMETHOD GetHrefURI(nsIURI** aURI); NS_IMETHOD GetHrefURI(nsIURI** aURI);
NS_IMETHOD LinkAdded() { return NS_OK; }
NS_IMETHOD LinkRemoved() { return NS_OK; }
virtual nsresult HandleDOMEvent(nsPresContext* aPresContext, virtual nsresult HandleDOMEvent(nsPresContext* aPresContext,
nsEvent* aEvent, nsIDOMEvent** aDOMEvent, nsEvent* aEvent, nsIDOMEvent** aDOMEvent,

View File

@ -56,6 +56,8 @@
#include "nsIDOMDocumentEvent.h" #include "nsIDOMDocumentEvent.h"
#include "nsIDOMEventTarget.h" #include "nsIDOMEventTarget.h"
#include "nsParserUtils.h" #include "nsParserUtils.h"
#include "nsPIDOMWindow.h"
#include "nsIScriptGlobalObject.h"
class nsHTMLLinkElement : public nsGenericHTMLElement, class nsHTMLLinkElement : public nsGenericHTMLElement,
public nsIDOMHTMLLinkElement, public nsIDOMHTMLLinkElement,
@ -85,6 +87,8 @@ public:
NS_IMETHOD GetLinkState(nsLinkState &aState); NS_IMETHOD GetLinkState(nsLinkState &aState);
NS_IMETHOD SetLinkState(nsLinkState aState); NS_IMETHOD SetLinkState(nsLinkState aState);
NS_IMETHOD GetHrefURI(nsIURI** aURI); NS_IMETHOD GetHrefURI(nsIURI** aURI);
NS_IMETHOD LinkAdded();
NS_IMETHOD LinkRemoved();
virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent, virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
nsIContent* aBindingParent, nsIContent* aBindingParent,
@ -211,6 +215,20 @@ nsHTMLLinkElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent,
return rv; return rv;
} }
NS_IMETHODIMP
nsHTMLLinkElement::LinkAdded()
{
CreateAndDispatchEvent(GetOwnerDoc(), NS_LITERAL_STRING("DOMLinkAdded"));
return NS_OK;
}
NS_IMETHODIMP
nsHTMLLinkElement::LinkRemoved()
{
CreateAndDispatchEvent(GetOwnerDoc(), NS_LITERAL_STRING("DOMLinkRemoved"));
return NS_OK;
}
void void
nsHTMLLinkElement::UnbindFromTree(PRBool aDeep, PRBool aNullParent) nsHTMLLinkElement::UnbindFromTree(PRBool aDeep, PRBool aNullParent)
{ {

View File

@ -234,7 +234,6 @@ public:
NS_IMETHOD Unload(nsIDOMEvent* aEvent) { return NS_OK; } NS_IMETHOD Unload(nsIDOMEvent* aEvent) { return NS_OK; }
NS_IMETHOD Abort(nsIDOMEvent* aEvent) { return NS_OK; } NS_IMETHOD Abort(nsIDOMEvent* aEvent) { return NS_OK; }
NS_IMETHOD Error(nsIDOMEvent* aEvent) { return NS_OK; } NS_IMETHOD Error(nsIDOMEvent* aEvent) { return NS_OK; }
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent) { return NS_OK; }
NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent) { return NS_OK; } NS_IMETHOD HandleEvent(nsIDOMEvent* aEvent) { return NS_OK; }
#ifdef MOZ_XUL #ifdef MOZ_XUL

View File

@ -171,7 +171,6 @@ static NS_DEFINE_CID(kDOMScriptObjectFactoryCID,
#include "plevent.h" #include "plevent.h"
#include "nsGUIEvent.h" #include "nsGUIEvent.h"
#include "nsIPrivateDOMEvent.h"
#include "nsEventQueueUtils.h" #include "nsEventQueueUtils.h"
// Number of documents currently loading // Number of documents currently loading
@ -862,18 +861,18 @@ nsDocShell::PrepareForNewContentModel()
NS_IMETHODIMP NS_IMETHODIMP
nsDocShell::FireUnloadNotification() nsDocShell::FirePageHideNotification(PRBool aIsUnload)
{ {
if (mContentViewer && !mFiredUnloadEvent) { if (mContentViewer && !mFiredUnloadEvent) {
mFiredUnloadEvent = PR_TRUE; mFiredUnloadEvent = PR_TRUE;
mContentViewer->Unload(); mContentViewer->PageHide(aIsUnload);
PRInt32 i, n = mChildList.Count(); PRInt32 i, n = mChildList.Count();
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
nsCOMPtr<nsIDocShell> shell(do_QueryInterface(ChildAt(i))); nsCOMPtr<nsIDocShell> shell(do_QueryInterface(ChildAt(i)));
if (shell) { if (shell) {
shell->FireUnloadNotification(); shell->FirePageHideNotification(aIsUnload);
} }
} }
} }
@ -3145,6 +3144,13 @@ NS_IMETHODIMP
nsDocShell::Stop(PRUint32 aStopFlags) nsDocShell::Stop(PRUint32 aStopFlags)
{ {
if (nsIWebNavigation::STOP_CONTENT & aStopFlags) { if (nsIWebNavigation::STOP_CONTENT & aStopFlags) {
// Revoke any pending plevents related to content viewer restoration
nsCOMPtr<nsIEventQueue> uiThreadQueue;
NS_GetMainEventQ(getter_AddRefs(uiThreadQueue));
if (uiThreadQueue)
uiThreadQueue->RevokeEvents(this);
// Stop the document loading
if (mContentViewer) if (mContentViewer)
mContentViewer->Stop(); mContentViewer->Stop();
} }
@ -3375,7 +3381,7 @@ nsDocShell::Destroy()
mIsBeingDestroyed = PR_TRUE; mIsBeingDestroyed = PR_TRUE;
//Fire unload event before we blow anything away. //Fire unload event before we blow anything away.
(void) FireUnloadNotification(); (void) FirePageHideNotification(PR_TRUE);
// Stop any URLs that are currently being loaded... // Stop any URLs that are currently being loaded...
Stop(nsIWebNavigation::STOP_ALL); Stop(nsIWebNavigation::STOP_ALL);
@ -4622,7 +4628,7 @@ nsDocShell::EndPageLoad(nsIWebProgress * aProgress,
// This will cause any OnLoad(...) handlers to fire, if it is a HTML // This will cause any OnLoad(...) handlers to fire, if it is a HTML
// document... // document...
// //
if (!mEODForCurrentDocument && mContentViewer) { if ((mIsRestoringDocument || !mEODForCurrentDocument) && mContentViewer) {
mIsExecutingOnLoadHandler = PR_TRUE; mIsExecutingOnLoadHandler = PR_TRUE;
mContentViewer->LoadComplete(aStatus); mContentViewer->LoadComplete(aStatus);
mIsExecutingOnLoadHandler = PR_FALSE; mIsExecutingOnLoadHandler = PR_FALSE;
@ -4747,7 +4753,7 @@ nsDocShell::CreateAboutBlankContentViewer()
// is changed within the DocShell - otherwise, javascript will get the // is changed within the DocShell - otherwise, javascript will get the
// wrong information :-( // wrong information :-(
// //
(void) FireUnloadNotification(); (void) FirePageHideNotification(PR_TRUE);
} }
// one helper factory, please // one helper factory, please
@ -4889,93 +4895,138 @@ nsDocShell::CaptureState()
mOSHE->AddChildShell(childShell); mOSHE->AddChildShell(childShell);
} }
// Capture the security state. return NS_OK;
nsCOMPtr<nsISupports> securityState; }
if (mSecurityUI)
mSecurityUI->CaptureState(getter_AddRefs(securityState));
return mOSHE->SetSecurityState(securityState); class RestorePresentationEvent : public PLEvent
{
public:
RestorePresentationEvent(nsDocShell *aShell);
nsRefPtr<nsDocShell> mDocShell;
};
PR_STATIC_CALLBACK(void*)
HandleRestorePresentationEvent(PLEvent *aEvent)
{
NS_STATIC_CAST(RestorePresentationEvent*, aEvent)->mDocShell->FinishRestore();
return nsnull;
}
PR_STATIC_CALLBACK(void)
DestroyRestorePresentationEvent(PLEvent *aEvent)
{
delete NS_STATIC_CAST(RestorePresentationEvent*, aEvent);
}
RestorePresentationEvent::RestorePresentationEvent(nsDocShell *aShell)
: mDocShell(aShell)
{
PL_InitEvent(this, mDocShell, ::HandleRestorePresentationEvent,
::DestroyRestorePresentationEvent);
} }
NS_IMETHODIMP NS_IMETHODIMP
nsDocShell::FireRestoreEvents() nsDocShell::BeginRestore(PRBool aTop)
{ {
// These events fire bottom-up, so call this on our children first. // Dispatch events for restoring the presentation. We try to simulate
PRInt32 n = mChildList.Count(); // the progress notifications loading the document would cause, so we add
for (PRInt32 i = 0; i < n; ++i) { // the document's channel to the loadgroup to initiate stateChange
nsCOMPtr<nsIDocShell> child = do_QueryInterface(ChildAt(i)); // notifications.
if (child) {
child->FireRestoreEvents();
}
}
// Dispatch events. This is a little messy. We need to avoid firing
// onload so that it is visible from the content DOM window, but we _do_
// want the chrome to see it for chrome/extensions that look for page load.
// In addition, we need to fire DOMPageRestore on the content window.
nsresult rv = EnsureContentViewer(); nsresult rv = EnsureContentViewer();
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDocumentViewer> docViewer = do_QueryInterface(mContentViewer); nsCOMPtr<nsIDOMDocument> domDoc;
NS_ENSURE_TRUE(docViewer, NS_ERROR_UNEXPECTED); mContentViewer->GetDOMDocument(getter_AddRefs(domDoc));
nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
nsCOMPtr<nsIPresShell> shell; if (doc) {
docViewer->GetPresShell(getter_AddRefs(shell)); nsIChannel *channel = doc->GetChannel();
NS_ENSURE_TRUE(shell, NS_ERROR_UNEXPECTED); if (channel) {
mIsRestoringDocument = PR_TRUE;
nsEvent event(PR_TRUE, NS_PAGE_LOAD); mLoadGroup->AddRequest(channel, nsnull);
nsEventStatus status = nsEventStatus_eIgnore; mIsRestoringDocument = PR_FALSE;
nsCOMPtr<nsPIDOMWindow> privWin = do_QueryInterface(mScriptGlobal);
NS_ENSURE_TRUE(privWin, NS_ERROR_UNEXPECTED);
nsCOMPtr<nsIChromeEventHandler> handler = privWin->GetChromeEventHandler();
PRUint32 flags = NS_EVENT_FLAG_INIT;
event.flags |= flags;
flags &= ~(NS_EVENT_FLAG_CANT_BUBBLE | NS_EVENT_FLAG_CANT_CANCEL);
flags |= NS_EVENT_FLAG_BUBBLE | NS_EVENT_FLAG_CAPTURE;
nsIDOMEvent *domEvt = nsnull;
nsPresContext *pc = shell->GetPresContext();
rv = handler->HandleChromeEvent(pc, &event, &domEvt,
flags & NS_EVENT_CAPTURE_MASK, &status);
NS_ENSURE_SUCCESS(rv, rv);
if (domEvt) {
nsrefcnt rc;
NS_RELEASE2(domEvt, rc);
if (0 != rc) {
// Okay, so someone in the DOM loop (a listener, JS object)
// still has a ref to the DOM Event but the internal data
// hasn't been malloc'd. Force a copy of the data here so the
// DOM Event is still valid.
nsCOMPtr<nsIPrivateDOMEvent> privateEvent =
do_QueryInterface(domEvt);
if (privateEvent) {
privateEvent->DuplicatePrivateData();
}
} }
} }
status = nsEventStatus_eIgnore; // These events start from the top-down and finish from the bottom-up.
nsEvent restoreEvent(PR_TRUE, NS_PAGE_RESTORE); // So, next we tell all of our children to call AddRequest, then post
// a PLEvent, which will cause us to call finishRestore() on our children.
return mScriptGlobal->HandleDOMEvent(pc, &restoreEvent, nsnull, PRInt32 n = mChildList.Count();
NS_EVENT_FLAG_INIT, &status); for (PRInt32 i = 0; i < n; ++i) {
nsCOMPtr<nsIDocShell> child = do_QueryInterface(ChildAt(i));
if (child) {
rv = child->BeginRestore(PR_FALSE);
NS_ENSURE_SUCCESS(rv, rv);
}
}
if (aTop) {
// We finish up the restore processing on a PLEvent to mimic the way
// RemoveRequest is called by nsIChannel implementations.
nsCOMPtr<nsIEventQueue> uiThreadQueue;
NS_GetMainEventQ(getter_AddRefs(uiThreadQueue));
NS_ENSURE_TRUE(uiThreadQueue, NS_ERROR_UNEXPECTED);
PLEvent *evt = new RestorePresentationEvent(this);
NS_ENSURE_TRUE(evt, NS_ERROR_OUT_OF_MEMORY);
rv = uiThreadQueue->PostEvent(evt);
if (NS_FAILED(rv)) {
PL_DestroyEvent(evt);
}
}
return rv;
}
NS_IMETHODIMP
nsDocShell::FinishRestore()
{
// First we call finishRestore() on our children. In the simulated load,
// all of the child frames finish loading before the main document.
PRInt32 n = mChildList.Count();
for (PRInt32 i = 0; i < n; ++i) {
nsCOMPtr<nsIDocShell> child = do_QueryInterface(ChildAt(i));
if (child) {
child->FinishRestore();
}
}
nsCOMPtr<nsIDOMDocument> domDoc;
mContentViewer->GetDOMDocument(getter_AddRefs(domDoc));
nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDoc);
if (doc) {
// Finally, we remove the request from the loadgroup. This will cause
// onStateChange(STATE_STOP) to fire, which will fire the PageShow
// event to the chrome.
nsIChannel *channel = doc->GetChannel();
if (channel) {
mIsRestoringDocument = PR_TRUE;
mLoadGroup->RemoveRequest(channel, nsnull, NS_OK);
mIsRestoringDocument = PR_FALSE;
}
}
return NS_OK;
}
NS_IMETHODIMP
nsDocShell::GetRestoringDocument(PRBool *aRestoring)
{
*aRestoring = mIsRestoringDocument;
return NS_OK;
} }
class ContentViewerDestroyEvent : public PLEvent class ContentViewerDestroyEvent : public PLEvent
{ {
public: public:
ContentViewerDestroyEvent(nsIContentViewer *aViewer) ContentViewerDestroyEvent(nsIContentViewer *aViewer, nsDocShell *aShell);
: mViewer(aViewer)
{
}
nsCOMPtr<nsIContentViewer> mViewer; nsCOMPtr<nsIContentViewer> mViewer;
}; };
@ -4993,6 +5044,14 @@ DestroyContentViewerDestroyEvent(PLEvent *aEvent)
delete NS_STATIC_CAST(ContentViewerDestroyEvent*, aEvent); delete NS_STATIC_CAST(ContentViewerDestroyEvent*, aEvent);
} }
ContentViewerDestroyEvent::ContentViewerDestroyEvent(nsIContentViewer *aViewer,
nsDocShell *aShell)
: mViewer(aViewer)
{
PL_InitEvent(this, aShell, ::HandleContentViewerDestroyEvent,
::DestroyContentViewerDestroyEvent);
}
nsresult nsresult
nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, PRBool aSavePresentation, nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, PRBool aSavePresentation,
PRBool *aRestored) PRBool *aRestored)
@ -5043,6 +5102,10 @@ nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, PRBool aSavePresentation,
printf("restoring presentation from session history: %s\n", spec.get()); printf("restoring presentation from session history: %s\n", spec.get());
#endif #endif
// Notify the old content viewer that it's being hidden.
FirePageHideNotification(!aSavePresentation);
mFiredUnloadEvent = PR_FALSE;
// Save off the root view's parent and sibling so that we can insert the // Save off the root view's parent and sibling so that we can insert the
// new content viewer's root view at the same position. Also save the // new content viewer's root view at the same position. Also save the
// bounds of the root view's widget. // bounds of the root view's widget.
@ -5075,13 +5138,17 @@ nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, PRBool aSavePresentation,
// content viewer, we prevent the viewer from being torn down after // content viewer, we prevent the viewer from being torn down after
// Destroy() is called. // Destroy() is called.
if (!aSavePresentation)
FireUnloadNotification();
mFiredUnloadEvent = PR_FALSE;
nsresult rv; nsresult rv;
if (mContentViewer) { if (mContentViewer) {
if (aSavePresentation) {
rv = CaptureState();
if (NS_FAILED(rv) && mOSHE) {
mOSHE->SyncPresentationState();
aSavePresentation = PR_FALSE;
}
}
mContentViewer->Close(aSavePresentation ? mOSHE.get() : nsnull); mContentViewer->Close(aSavePresentation ? mOSHE.get() : nsnull);
// It's unsafe to actually destroy the content viewer here. // It's unsafe to actually destroy the content viewer here.
@ -5093,12 +5160,9 @@ nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, PRBool aSavePresentation,
NS_GetMainEventQ(getter_AddRefs(uiThreadQueue)); NS_GetMainEventQ(getter_AddRefs(uiThreadQueue));
NS_ENSURE_TRUE(uiThreadQueue, NS_ERROR_UNEXPECTED); NS_ENSURE_TRUE(uiThreadQueue, NS_ERROR_UNEXPECTED);
PLEvent *evt = new ContentViewerDestroyEvent(mContentViewer); PLEvent *evt = new ContentViewerDestroyEvent(mContentViewer, this);
NS_ENSURE_TRUE(evt, NS_ERROR_OUT_OF_MEMORY); NS_ENSURE_TRUE(evt, NS_ERROR_OUT_OF_MEMORY);
PL_InitEvent(evt, this, ::HandleContentViewerDestroyEvent,
::DestroyContentViewerDestroyEvent);
rv = uiThreadQueue->PostEvent(evt); rv = uiThreadQueue->PostEvent(evt);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
PL_DestroyEvent(evt); PL_DestroyEvent(evt);
@ -5191,15 +5255,6 @@ nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, PRBool aSavePresentation,
// aSHEntry is now our currently-loaded document. // aSHEntry is now our currently-loaded document.
mOSHE = aSHEntry; mOSHE = aSHEntry;
// Clear the mLSHE reference to indicate document loading is done one
// way or another.
mLSHE = nsnull;
// mEODForCurrentDocument is true here, so EndPageLoad will not fire
// onload (we fire that below, in a special way so that the content window
// does not see it).
EndPageLoad(nsnull, nsnull, NS_OK);
// Meta-refresh timers have been restarted for this shell, but not // Meta-refresh timers have been restarted for this shell, but not
// for our children. Walk the child shells and restart their timers. // for our children. Walk the child shells and restart their timers.
PRInt32 n = mChildList.Count(); PRInt32 n = mChildList.Count();
@ -5242,18 +5297,10 @@ nsDocShell::RestorePresentation(nsISHEntry *aSHEntry, PRBool aSavePresentation,
} }
} }
// Reset the security state
if (mSecurityUI) {
nsCOMPtr<nsISupports> securityState;
aSHEntry->GetSecurityState(getter_AddRefs(securityState));
if (securityState)
mSecurityUI->TransitionToState(securityState);
}
SetCurrentURI(uri); SetCurrentURI(uri);
// Dispatch onload and DOMPageRestore. // Dispatch onload and DOMPageRestore.
rv = FireRestoreEvents(); rv = BeginRestore(PR_TRUE);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
rv = mContentViewer->Show(); rv = mContentViewer->Show();
@ -5304,8 +5351,7 @@ nsDocShell::CreateContentViewer(const char *aContentType,
// //
PRBool savePresentation = CanSavePresentation(request); PRBool savePresentation = CanSavePresentation(request);
if (!savePresentation) FirePageHideNotification(!savePresentation);
FireUnloadNotification();
// Set mFiredUnloadEvent = PR_FALSE so that the unload handler for the // Set mFiredUnloadEvent = PR_FALSE so that the unload handler for the
// *new* document will fire. // *new* document will fire.
@ -5320,17 +5366,7 @@ nsDocShell::CreateContentViewer(const char *aContentType,
PRBool onLocationChangeNeeded = OnLoadingSite(aOpenedChannel, PR_FALSE); PRBool onLocationChangeNeeded = OnLoadingSite(aOpenedChannel, PR_FALSE);
if (savePresentation) { mSavingOldViewer = savePresentation;
// The old content viewer will be saved during the call to Embed().
rv = CaptureState();
if (NS_SUCCEEDED(rv)) {
mSavingOldViewer = PR_TRUE;
} else {
if (mOSHE) {
mOSHE->SyncPresentationState();
}
}
}
// let's try resetting the load group if we need to... // let's try resetting the load group if we need to...
nsCOMPtr<nsILoadGroup> currentLoadGroup; nsCOMPtr<nsILoadGroup> currentLoadGroup;
@ -5623,7 +5659,16 @@ nsDocShell::SetupNewViewer(nsIContentViewer * aNewViewer)
// Tell the old content viewer to hibernate in session history when // Tell the old content viewer to hibernate in session history when
// it is destroyed. // it is destroyed.
mContentViewer->Close(mSavingOldViewer ? mOSHE.get() : nsnull);
PRBool savePresentation = mSavingOldViewer;
if (savePresentation && NS_FAILED(CaptureState())) {
if (mOSHE) {
mOSHE->SyncPresentationState();
}
savePresentation = PR_FALSE;
}
mContentViewer->Close(savePresentation ? mOSHE.get() : nsnull);
aNewViewer->SetPreviousViewer(mContentViewer); aNewViewer->SetPreviousViewer(mContentViewer);
mContentViewer = nsnull; mContentViewer = nsnull;
@ -6229,12 +6274,6 @@ nsDocShell::InternalLoad(nsIURI * aURI,
// If we have a saved content viewer in history, restore and show it now. // If we have a saved content viewer in history, restore and show it now.
if (aSHEntry) { if (aSHEntry) {
if (savePresentation) {
rv = CaptureState();
if (NS_FAILED(rv) && mOSHE)
mOSHE->SyncPresentationState();
}
nsCOMPtr<nsISHEntry> oldEntry = mOSHE; nsCOMPtr<nsISHEntry> oldEntry = mOSHE;
PRBool restored; PRBool restored;
rv = RestorePresentation(aSHEntry, savePresentation && rv = RestorePresentation(aSHEntry, savePresentation &&

View File

@ -14,7 +14,7 @@ struct nsRect;
[ptr] native nsIDeviceContextPtr(nsIDeviceContext); [ptr] native nsIDeviceContextPtr(nsIDeviceContext);
[ref] native nsRectRef(nsRect); [ref] native nsRectRef(nsRect);
[scriptable, uuid(456651af-14ca-4f8d-91a3-c7cdd7e7eef6)] [scriptable, uuid(62d0e866-e608-4b1a-9ab0-467142b3e3bd)]
interface nsIContentViewer : nsISupports interface nsIContentViewer : nsISupports
{ {
@ -27,7 +27,7 @@ interface nsIContentViewer : nsISupports
void loadStart(in nsISupports aDoc); void loadStart(in nsISupports aDoc);
void loadComplete(in unsigned long aStatus); void loadComplete(in unsigned long aStatus);
boolean permitUnload(); boolean permitUnload();
void unload(); void pageHide(in boolean isUnload);
/** /**
* All users of a content viewer are responsible for calling both * All users of a content viewer are responsible for calling both

View File

@ -66,7 +66,7 @@ interface nsISHEntry;
interface nsILayoutHistoryState; interface nsILayoutHistoryState;
interface nsISecureBrowserUI; interface nsISecureBrowserUI;
[scriptable, uuid(b0228925-9242-467b-842f-dc739a6e478f)] [scriptable, uuid(5d1529b3-f825-45af-a2ee-1ae4bc2b2b2a)]
interface nsIDocShell : nsISupports interface nsIDocShell : nsISupports
{ {
/** /**
@ -175,9 +175,10 @@ interface nsIDocShell : nsISupports
/** /**
* Notify the associated content viewer and all child docshells that they are * Notify the associated content viewer and all child docshells that they are
* about to be unloaded. * about to be hidden. If |isUnload| is true, then the document is being
* unloaded as well.
*/ */
[noscript] void fireUnloadNotification(); [noscript] void firePageHideNotification(in boolean isUnload);
/** /**
* Presentation context for the currently loaded document. This may be null. * Presentation context for the currently loaded document. This may be null.
@ -364,12 +365,22 @@ interface nsIDocShell : nsISupports
void resumeRefreshURIs(); void resumeRefreshURIs();
/** /**
* Fire the onload and DOMPageRestore events as part of restoring a * Begin firing WebProgressListener notifications and DOM events for
* presentation from sessino history. The onload event is fired starting * restoring a page presentation. |top| should be true for the toplevel
* at the chrome event handler; the DOMPageRestore event is fired starting * docshell that is being restored; it will be set to false when this method
* at the window object. This first recurses into child docshells so that * is called for child docshells. This method will post an event to call
* events fire in a bottom-up order. * finishRestore() after returning to the event loop.
*/ */
void fireRestoreEvents(); void beginRestore(in boolean top);
/**
* Finish firing WebProgressListener notifications and DOM events for
* restoring a page presentation. This should only be called via
* beginRestore().
*/
void finishRestore();
/* Track whether we're currently restoring a document presentation. */
readonly attribute boolean restoringDocument;
}; };

View File

@ -61,6 +61,7 @@ EXPORTS = \
nsIDOMScrollListener.h \ nsIDOMScrollListener.h \
nsIDOMContextMenuListener.h \ nsIDOMContextMenuListener.h \
nsIDOMUIListener.h \ nsIDOMUIListener.h \
nsIDOMPageTransitionListener.h \
$(NULL) $(NULL)
include $(topsrcdir)/config/rules.mk include $(topsrcdir)/config/rules.mk

View File

@ -47,8 +47,9 @@
* *
*/ */
#define NS_IDOMLOADLISTENER_IID \ #define NS_IDOMLOADLISTENER_IID \
{0x0f7fa587, 0xaac5, 0x11d9, \ { /* d1810238-14f8-4cab-9b96-96bedb9de7be */ \
{0xba, 0x4e, 0x00, 0x11, 0x24, 0x78, 0xd6, 0x26} } 0xd1810238, 0x14f8, 0x4cab, \
{0x9b, 0x96, 0x96, 0xbe, 0xdb, 0x9d, 0xe7, 0xbe} }
class nsIDOMLoadListener : public nsIDOMEventListener { class nsIDOMLoadListener : public nsIDOMEventListener {
@ -90,13 +91,6 @@ public:
*/ */
NS_IMETHOD Error(nsIDOMEvent* aEvent) = 0; NS_IMETHOD Error(nsIDOMEvent* aEvent) = 0;
/**
* Processes a DOMPageRestore event. This is dispatched when a page's
* presentation is restored from session history (onload does not fire
* in this case).
* @param aEvent The event object
*/
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent) = 0;
}; };
#endif // nsIDOMLoadListener_h__ #endif // nsIDOMLoadListener_h__

View File

@ -0,0 +1,58 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@brianryner.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef nsIDOMPageTransitionListener_h__
#define nsIDOMPageTransitionListener_h__
#include "nsIDOMEventListener.h"
class nsIDOMEvent;
/*
* Page transition event listener interface.
*/
#define NS_IDOMPAGETRANSITIONLISTENER_IID \
{ 0x24f4d69f, 0x6b0c, 0x48a8, { 0xba, 0xb7, 0x12, 0x50, 0xcb, 0x5e, 0x48, 0x79 } }
class nsIDOMPageTransitionListener : public nsIDOMEventListener {
public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IDOMPAGETRANSITIONLISTENER_IID)
NS_IMETHOD PageShow(nsIDOMEvent* aEvent) = 0;
NS_IMETHOD PageHide(nsIDOMEvent* aEvent) = 0;
};
#endif // nsIDOMPageTransitionListener_h__

View File

@ -68,6 +68,7 @@ XPIDLSRCS = \
nsIDOMBeforeUnloadEvent.idl \ nsIDOMBeforeUnloadEvent.idl \
nsIDOMNSEventTarget.idl \ nsIDOMNSEventTarget.idl \
nsIDOMSmartCardEvent.idl \ nsIDOMSmartCardEvent.idl \
nsIDOMPageTransitionEvent.idl \
$(NULL) $(NULL)
include $(topsrcdir)/config/rules.mk include $(topsrcdir)/config/rules.mk

View File

@ -0,0 +1,62 @@
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Google Inc.
* Portions created by the Initial Developer are Copyright (C) 2005
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Brian Ryner <bryner@brianryner.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "nsIDOMEvent.idl"
/**
* The nsIDOMPageTransitionEvent interface is used for the PageShow and
* PageHide events, which are generic events that apply to both page
* load/unload and saving/restoring a document from session history.
*/
[scriptable, uuid(b712418b-376f-4f75-b156-5d9ad99fe51f)]
interface nsIDOMPageTransitionEvent : nsIDOMEvent
{
/**
* Set to true if the document has been or will be persisted across
* firing of the event. For example, if a document is being cached in
* session history, |persisted| is true for the PageHide event.
*/
readonly attribute boolean persisted;
/* Initialize a new PageShow or PageHide event. */
void initPageTransitionEvent(in DOMString typeArg,
in boolean canBubbleArg,
in boolean canCancelArg,
in boolean persisted);
};

View File

@ -335,6 +335,9 @@ enum nsDOMClassInfoID {
// SmartCard Events // SmartCard Events
eDOMClassInfo_SmartCardEvent_id, eDOMClassInfo_SmartCardEvent_id,
// PageTransition Events
eDOMClassInfo_PageTransitionEvent_id,
// This one better be the last one in this list // This one better be the last one in this list
eDOMClassInfoIDCount eDOMClassInfoIDCount
}; };

View File

@ -208,6 +208,7 @@
#include "nsIDOMBeforeUnloadEvent.h" #include "nsIDOMBeforeUnloadEvent.h"
#include "nsIDOMMutationEvent.h" #include "nsIDOMMutationEvent.h"
#include "nsIDOMSmartCardEvent.h" #include "nsIDOMSmartCardEvent.h"
#include "nsIDOMPageTransitionEvent.h"
#include "nsIDOMNSDocumentStyle.h" #include "nsIDOMNSDocumentStyle.h"
#include "nsIDOMDocumentRange.h" #include "nsIDOMDocumentRange.h"
#include "nsIDOMDocumentTraversal.h" #include "nsIDOMDocumentTraversal.h"
@ -1005,6 +1006,8 @@ static nsDOMClassInfoData sClassInfoData[] = {
NS_DEFINE_CLASSINFO_DATA(SmartCardEvent, nsDOMGenericSH, NS_DEFINE_CLASSINFO_DATA(SmartCardEvent, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS) DOM_DEFAULT_SCRIPTABLE_FLAGS)
NS_DEFINE_CLASSINFO_DATA(PageTransitionEvent, nsDOMGenericSH,
DOM_DEFAULT_SCRIPTABLE_FLAGS)
}; };
nsIXPConnect *nsDOMClassInfo::sXPConnect = nsnull; nsIXPConnect *nsDOMClassInfo::sXPConnect = nsnull;
@ -1736,6 +1739,11 @@ nsDOMClassInfo::Init()
DOM_CLASSINFO_MAP_ENTRY(nsIDOMSmartCardEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMSmartCardEvent)
DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(PageTransitionEvent, nsIDOMPageTransitionEvent)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMPageTransitionEvent)
DOM_CLASSINFO_EVENT_MAP_ENTRIES
DOM_CLASSINFO_MAP_END
DOM_CLASSINFO_MAP_BEGIN(MutationEvent, nsIDOMMutationEvent) DOM_CLASSINFO_MAP_BEGIN(MutationEvent, nsIDOMMutationEvent)
DOM_CLASSINFO_MAP_ENTRY(nsIDOMMutationEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMMutationEvent)
DOM_CLASSINFO_EVENT_MAP_ENTRIES DOM_CLASSINFO_EVENT_MAP_ENTRIES

View File

@ -5815,6 +5815,9 @@ public:
// Get the listener manager, which holds all event handlers for the window. // Get the listener manager, which holds all event handlers for the window.
nsIEventListenerManager* GetListenerManager() { return mListenerManager; } nsIEventListenerManager* GetListenerManager() { return mListenerManager; }
// Get the saved value of the mMutationBits field.
PRUint32 GetMutationBits() { return mMutationBits; }
// Get the contents of focus memory when the state was saved // Get the contents of focus memory when the state was saved
// (if the focus was inside of this window). // (if the focus was inside of this window).
nsIDOMElement* GetFocusedElement() { return mFocusedElement; } nsIDOMElement* GetFocusedElement() { return mFocusedElement; }
@ -5835,6 +5838,7 @@ private:
nsCOMPtr<nsIDOMWindowInternal> mFocusedWindow; nsCOMPtr<nsIDOMWindowInternal> mFocusedWindow;
nsTimeout *mSavedTimeouts; nsTimeout *mSavedTimeouts;
nsTimeout **mTimeoutInsertionPoint; nsTimeout **mTimeoutInsertionPoint;
PRUint32 mMutationBits;
}; };
WindowStateHolder::WindowStateHolder(JSContext *cx, JSObject *aObject, WindowStateHolder::WindowStateHolder(JSContext *cx, JSObject *aObject,
@ -5844,6 +5848,11 @@ WindowStateHolder::WindowStateHolder(JSContext *cx, JSObject *aObject,
NS_ASSERTION(aWindow, "null window"); NS_ASSERTION(aWindow, "null window");
aWindow->GetListenerManager(getter_AddRefs(mListenerManager)); aWindow->GetListenerManager(getter_AddRefs(mListenerManager));
mMutationBits = aWindow->mMutationBits;
// Clear the window's EventListenerManager pointer so that it can't have
// listeners removed from it later.
aWindow->mListenerManager = nsnull;
nsIFocusController *fc = aWindow->GetRootFocusController(); nsIFocusController *fc = aWindow->GetRootFocusController();
NS_ASSERTION(fc, "null focus controller"); NS_ASSERTION(fc, "null focus controller");
@ -6042,6 +6051,7 @@ nsGlobalWindow::RestoreWindowState(nsISupports *aState)
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
mListenerManager = holder->GetListenerManager(); mListenerManager = holder->GetListenerManager();
mMutationBits = holder->GetMutationBits();
nsIDOMElement *focusedElement = holder->GetFocusedElement(); nsIDOMElement *focusedElement = holder->GetFocusedElement();
nsIDOMWindowInternal *focusedWindow = holder->GetFocusedWindow(); nsIDOMWindowInternal *focusedWindow = holder->GetFocusedWindow();

View File

@ -110,7 +110,7 @@ InspectorApp.prototype =
//this.initSearch(); //this.initSearch();
var el = document.getElementById("bxBrowser"); var el = document.getElementById("bxBrowser");
el.addEventListener("load", BrowserLoadListener, true); el.addEventListener("PageShow", BrowserPageShowListener, true);
this.setBrowser(false, true); this.setBrowser(false, true);
//this.setSearch(false, true); //this.setSearch(false, true);
@ -576,9 +576,9 @@ InspectorApp.prototype =
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
//// event listeners //// event listeners
function BrowserLoadListener(aEvent) function BrowserPageShowListener(aEvent)
{ {
// since we will also get load events for frame documents, // since we will also get PageShow events for frame documents,
// make sure we respond to the top-level document load // make sure we respond to the top-level document load
if (aEvent.target.defaultView == _content) if (aEvent.target.defaultView == _content)
inspector.documentLoaded(); inspector.documentLoaded();

View File

@ -68,7 +68,7 @@ function inSearchService()
// the xmlextras facility for loading xml, but it's broken, so // the xmlextras facility for loading xml, but it's broken, so
// we use a browser for onw // we use a browser for onw
var browser = document.getElementById("inSearchServiceLoader"); var browser = document.getElementById("inSearchServiceLoader");
browser.addEventListener("load", inSearchService_LoadListener, true); browser.addEventListener("PageShow", inSearchService_LoadListener, true);
this.mWebNav = browser.webNavigation; this.mWebNav = browser.webNavigation;
} }

View File

@ -333,12 +333,6 @@ nsDOMParser::Error(nsIDOMEvent* aEvent)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsDOMParser::PageRestore(nsIDOMEvent* aEvent)
{
return NS_OK;
}
nsDOMParser::nsDOMParser() nsDOMParser::nsDOMParser()
: mLoopingForSyncLoad(PR_FALSE) : mLoopingForSyncLoad(PR_FALSE)
{ {

View File

@ -67,7 +67,6 @@ public:
NS_IMETHOD Unload(nsIDOMEvent* aEvent); NS_IMETHOD Unload(nsIDOMEvent* aEvent);
NS_IMETHOD Abort(nsIDOMEvent* aEvent); NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent); NS_IMETHOD Error(nsIDOMEvent* aEvent);
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent);
private: private:
nsCOMPtr<nsIURI> mBaseURI; nsCOMPtr<nsIURI> mBaseURI;

View File

@ -121,15 +121,3 @@ nsLoadListenerProxy::Error(nsIDOMEvent* aEvent)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsLoadListenerProxy::PageRestore(nsIDOMEvent* aEvent)
{
nsCOMPtr<nsIDOMLoadListener> listener(do_QueryReferent(mParent));
if (listener) {
return listener->PageRestore(aEvent);
}
return NS_OK;
}

View File

@ -69,7 +69,6 @@ public:
NS_IMETHOD Unload(nsIDOMEvent* aEvent); NS_IMETHOD Unload(nsIDOMEvent* aEvent);
NS_IMETHOD Abort(nsIDOMEvent* aEvent); NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent); NS_IMETHOD Error(nsIDOMEvent* aEvent);
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent);
protected: protected:
nsWeakPtr mParent; nsWeakPtr mParent;

View File

@ -1747,12 +1747,6 @@ nsXMLHttpRequest::Error(nsIDOMEvent* aEvent)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsXMLHttpRequest::PageRestore(nsIDOMEvent* aEvent)
{
return NS_OK;
}
nsresult nsresult
nsXMLHttpRequest::ChangeState(PRUint32 aState, PRBool aBroadcast, nsXMLHttpRequest::ChangeState(PRUint32 aState, PRBool aBroadcast,
PRBool aClearEventListeners) PRBool aClearEventListeners)

View File

@ -97,7 +97,6 @@ public:
NS_IMETHOD Unload(nsIDOMEvent* aEvent); NS_IMETHOD Unload(nsIDOMEvent* aEvent);
NS_IMETHOD Abort(nsIDOMEvent* aEvent); NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent); NS_IMETHOD Error(nsIDOMEvent* aEvent);
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent);
// nsIStreamListener // nsIStreamListener
NS_DECL_NSISTREAMLISTENER NS_DECL_NSISTREAMLISTENER

View File

@ -78,7 +78,6 @@ public:
virtual nsresult Unload(nsIDOMEvent* aEvent) {printf("Unload\n"); return NS_OK;} virtual nsresult Unload(nsIDOMEvent* aEvent) {printf("Unload\n"); return NS_OK;}
virtual nsresult Abort(nsIDOMEvent* aEvent) {printf("Abort\n"); return NS_OK;} virtual nsresult Abort(nsIDOMEvent* aEvent) {printf("Abort\n"); return NS_OK;}
virtual nsresult Error(nsIDOMEvent* aEvent) {printf("Error\n"); return NS_OK;} virtual nsresult Error(nsIDOMEvent* aEvent) {printf("Error\n"); return NS_OK;}
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent) {printf("PageRestore\n"); return NS_OK;}
}; };
NS_IMPL_ADDREF(nsMyListener) NS_IMPL_ADDREF(nsMyListener)

View File

@ -986,17 +986,26 @@ DocumentViewerImpl::LoadComplete(nsresult aStatus)
nsCOMPtr<nsIDocumentViewer> kungFuDeathGrip(this); nsCOMPtr<nsIDocumentViewer> kungFuDeathGrip(this);
// Now, fire either an OnLoad or OnError event to the document... // Now, fire either an OnLoad or OnError event to the document...
PRBool restoring = PR_FALSE;
if(NS_SUCCEEDED(aStatus)) { if(NS_SUCCEEDED(aStatus)) {
nsEventStatus status = nsEventStatus_eIgnore; nsEventStatus status = nsEventStatus_eIgnore;
nsEvent event(PR_TRUE, NS_PAGE_LOAD); nsEvent event(PR_TRUE, NS_PAGE_LOAD);
rv = global->HandleDOMEvent(mPresContext, &event, nsnull, // If the document presentation is being restored, we don't want to fire
NS_EVENT_FLAG_INIT, &status); // onload to the document content since that would likely confuse scripts
#ifdef MOZ_TIMELINE // on the page.
// if navigator.xul's load is complete, the main nav window is visible
// mark that point. nsIDocShell *docShell = global->GetDocShell();
NS_ENSURE_TRUE(docShell, NS_ERROR_UNEXPECTED);
docShell->GetRestoringDocument(&restoring);
if (!restoring) {
rv = global->HandleDOMEvent(mPresContext, &event, nsnull,
NS_EVENT_FLAG_INIT, &status);
#ifdef MOZ_TIMELINE
// if navigator.xul's load is complete, the main nav window is visible
// mark that point.
if (mDocument) {
//printf("DEBUG: getting uri from document (%p)\n", mDocument.get()); //printf("DEBUG: getting uri from document (%p)\n", mDocument.get());
nsIURI *uri = mDocument->GetDocumentURI(); nsIURI *uri = mDocument->GetDocumentURI();
@ -1009,12 +1018,16 @@ DocumentViewerImpl::LoadComplete(nsresult aStatus)
NS_TIMELINE_MARK("Navigator Window visible now"); NS_TIMELINE_MARK("Navigator Window visible now");
} }
} }
}
#endif /* MOZ_TIMELINE */ #endif /* MOZ_TIMELINE */
}
} else { } else {
// XXX: Should fire error event to the document... // XXX: Should fire error event to the document...
} }
// Notify the document that it has been shown (regardless of whether
// it was just loaded).
mDocument->OnPageShow(restoring);
// Now that the document has loaded, we can tell the presshell // Now that the document has loaded, we can tell the presshell
// to unsuppress painting. // to unsuppress painting.
if (mPresShell && !mStopped) { if (mPresShell && !mStopped) {
@ -1148,7 +1161,7 @@ DocumentViewerImpl::PermitUnload(PRBool *aPermitUnload)
} }
NS_IMETHODIMP NS_IMETHODIMP
DocumentViewerImpl::Unload() DocumentViewerImpl::PageHide(PRBool aIsUnload)
{ {
mEnableRendering = PR_FALSE; mEnableRendering = PR_FALSE;
@ -1156,6 +1169,10 @@ DocumentViewerImpl::Unload()
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
} }
mDocument->OnPageHide(!aIsUnload);
if (!aIsUnload)
return NS_OK;
// First, get the script global object from the document... // First, get the script global object from the document...
nsIScriptGlobalObject *global = mDocument->GetScriptGlobalObject(); nsIScriptGlobalObject *global = mDocument->GetScriptGlobalObject();
@ -1202,6 +1219,7 @@ DocumentViewerImpl::Open()
// XXX re-enable image animations once that works correctly // XXX re-enable image animations once that works correctly
mEnableRendering = PR_TRUE;
return NS_OK; return NS_OK;
} }

View File

@ -45,7 +45,7 @@ class nsIPresShell;
class nsIStyleSheet; class nsIStyleSheet;
#define NS_IDOCUMENT_VIEWER_IID \ #define NS_IDOCUMENT_VIEWER_IID \
{ 0x7e7a579e, 0xfa46, 0x4daf,{0xb7, 0xc6, 0x45, 0x69, 0xd3, 0xb5, 0x30, 0x05}} { 0xbd4fde0c, 0x71fd, 0x4d77,{0xab, 0x66, 0x26, 0xce, 0x43, 0x93, 0x2e, 0x4e}}
/** /**
* A document viewer is a kind of content viewer that uses NGLayout * A document viewer is a kind of content viewer that uses NGLayout

View File

@ -165,7 +165,6 @@ LAYOUT_ATOM(oncontextmenu, "oncontextmenu")
LAYOUT_ATOM(onDOMActivate, "onDOMActivate") LAYOUT_ATOM(onDOMActivate, "onDOMActivate")
LAYOUT_ATOM(onDOMFocusIn, "onDOMFocusIn") LAYOUT_ATOM(onDOMFocusIn, "onDOMFocusIn")
LAYOUT_ATOM(onDOMFocusOut, "onDOMFocusOut") LAYOUT_ATOM(onDOMFocusOut, "onDOMFocusOut")
LAYOUT_ATOM(onDOMPageRestore, "onDOMPageRestore")
LAYOUT_ATOM(ondblclick, "ondblclick") LAYOUT_ATOM(ondblclick, "ondblclick")
LAYOUT_ATOM(ondragdrop, "ondragdrop") LAYOUT_ATOM(ondragdrop, "ondragdrop")
LAYOUT_ATOM(ondragenter, "ondragenter") LAYOUT_ATOM(ondragenter, "ondragenter")
@ -212,6 +211,10 @@ LAYOUT_ATOM(onDOMNodeInsertedIntoDocument, "onDOMNodeInsertedIntoDocument")
LAYOUT_ATOM(onDOMAttrModified, "onDOMAttrModified") LAYOUT_ATOM(onDOMAttrModified, "onDOMAttrModified")
LAYOUT_ATOM(onDOMCharacterDataModified, "onDOMCharacterDataModified") LAYOUT_ATOM(onDOMCharacterDataModified, "onDOMCharacterDataModified")
// pagetransition events
LAYOUT_ATOM(onPageShow, "onPageShow")
LAYOUT_ATOM(onPageHide, "onPageHide")
// Alphabetical list of languages for lang-specific transforms // Alphabetical list of languages for lang-specific transforms
LAYOUT_ATOM(Japanese, "ja") LAYOUT_ATOM(Japanese, "ja")
LAYOUT_ATOM(Chinese, "zh-CN") LAYOUT_ATOM(Chinese, "zh-CN")

View File

@ -41,23 +41,15 @@
#include "nsISupports.idl" #include "nsISupports.idl"
interface nsIDOMWindow; interface nsIDOMWindow;
interface nsIDOMElement;
[scriptable, uuid(c5ca429c-b5c2-11d9-8547-00112478d626)] [scriptable, uuid(081e31e0-a144-11d3-8c7c-00609792278c)]
interface nsISecureBrowserUI : nsISupports interface nsISecureBrowserUI : nsISupports
{ {
void init(in nsIDOMWindow window); void init(in nsIDOMWindow window);
readonly attribute unsigned long state; readonly attribute unsigned long state;
readonly attribute AString tooltipText; readonly attribute AString tooltipText;
/* Returns an object that encapsulates the current security state. */
nsISupports captureState();
/**
* Restore the state captured by captureState(), firing transition
* notifications as necessary.
*/
void transitionToState(in nsISupports state);
}; };
%{C++ %{C++

View File

@ -990,19 +990,12 @@ nsresult nsSecureBrowserUIImpl::UpdateSecurityState(nsIRequest* aRequest)
newSecurityState = lis_no_security; newSecurityState = lis_no_security;
} }
return UpdateSecurityState(newSecurityState, aRequest);
}
nsresult
nsSecureBrowserUIImpl::UpdateSecurityState(lockIconState aNewState,
nsIRequest *aRequest)
{
PR_LOG(gSecureDocLog, PR_LOG_DEBUG, PR_LOG(gSecureDocLog, PR_LOG_DEBUG,
("SecureUI:%p: UpdateSecurityState: old-new %d - %d\n", this, ("SecureUI:%p: UpdateSecurityState: old-new %d - %d\n", this,
mPreviousSecurityState, aNewState mPreviousSecurityState, newSecurityState
)); ));
if (mPreviousSecurityState != aNewState) if (mPreviousSecurityState != newSecurityState)
{ {
// must show alert // must show alert
@ -1047,7 +1040,7 @@ nsSecureBrowserUIImpl::UpdateSecurityState(lockIconState aNewState,
{ {
case lis_no_security: case lis_no_security:
case lis_broken_security: case lis_broken_security:
switch (aNewState) switch (newSecurityState)
{ {
case lis_no_security: case lis_no_security:
case lis_broken_security: case lis_broken_security:
@ -1064,7 +1057,7 @@ nsSecureBrowserUIImpl::UpdateSecurityState(lockIconState aNewState,
if (showWarning) if (showWarning)
{ {
switch (aNewState) switch (newSecurityState)
{ {
case lis_no_security: case lis_no_security:
case lis_broken_security: case lis_broken_security:
@ -1085,9 +1078,9 @@ nsSecureBrowserUIImpl::UpdateSecurityState(lockIconState aNewState,
} }
} }
mPreviousSecurityState = aNewState; mPreviousSecurityState = newSecurityState;
if (lis_no_security == aNewState) if (lis_no_security == newSecurityState)
{ {
mSSLStatus = nsnull; mSSLStatus = nsnull;
mInfoTooltip.Truncate(); mInfoTooltip.Truncate();
@ -1098,7 +1091,7 @@ nsSecureBrowserUIImpl::UpdateSecurityState(lockIconState aNewState,
{ {
PRUint32 newState = STATE_IS_INSECURE; PRUint32 newState = STATE_IS_INSECURE;
switch (aNewState) switch (newSecurityState)
{ {
case lis_broken_security: case lis_broken_security:
newState = STATE_IS_BROKEN; newState = STATE_IS_BROKEN;
@ -1498,50 +1491,3 @@ ConfirmPostToInsecureFromSecure()
return result; return result;
} }
#define NS_SECUREBROWSERUISTATE_IID \
{0x086c5daf, 0xbb0a, 0x45cb, {0x98, 0x2b, 0xf1, 0x62, 0x49, 0xd5, 0x0e, 0x28}}
class nsSecureBrowserUIImpl::State : public nsISupports
{
public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_SECUREBROWSERUISTATE_IID)
NS_DECL_ISUPPORTS
State(lockIconState aState, nsISupports *aSSLStatus);
lockIconState GetState() const { return mState; }
nsISupports* GetSSLStatus() { return mSSLStatus; }
private:
lockIconState mState;
nsCOMPtr<nsISupports> mSSLStatus;
};
NS_IMPL_ISUPPORTS1(nsSecureBrowserUIImpl::State, nsSecureBrowserUIImpl::State)
nsSecureBrowserUIImpl::State::State(lockIconState aState,
nsISupports *aSSLStatus)
: mState(aState), mSSLStatus(aSSLStatus)
{
}
NS_IMETHODIMP
nsSecureBrowserUIImpl::CaptureState(nsISupports **aState)
{
*aState = new State(mPreviousSecurityState, mSSLStatus);
NS_ENSURE_TRUE(aState, NS_ERROR_OUT_OF_MEMORY);
NS_ADDREF(*aState);
return NS_OK;
}
NS_IMETHODIMP
nsSecureBrowserUIImpl::TransitionToState(nsISupports *aState)
{
nsCOMPtr<nsSecureBrowserUIImpl::State> state = do_QueryInterface(aState);
NS_ENSURE_TRUE(state, NS_ERROR_NULL_POINTER);
mSSLStatus = state->GetSSLStatus();
return UpdateSecurityState(state->GetState(), nsnull);
}

View File

@ -121,7 +121,6 @@ protected:
PRInt32 mSubRequestsNoSecurity; PRInt32 mSubRequestsNoSecurity;
nsresult UpdateSecurityState(nsIRequest* aRequest); nsresult UpdateSecurityState(nsIRequest* aRequest);
nsresult UpdateSecurityState(lockIconState aNewState, nsIRequest *aRequest);
nsresult EvaluateAndUpdateSecurityState(nsIRequest *aRequest); nsresult EvaluateAndUpdateSecurityState(nsIRequest *aRequest);
void UpdateSubrequestMembers(nsIRequest *aRequest); void UpdateSubrequestMembers(nsIRequest *aRequest);
@ -145,7 +144,6 @@ protected:
nsresult GetNSSDialogs(nsISecurityWarningDialogs **); nsresult GetNSSDialogs(nsISecurityWarningDialogs **);
PLDHashTable mTransferringRequests; PLDHashTable mTransferringRequests;
class State;
}; };

View File

@ -71,9 +71,6 @@
#include "nsIAutoCompleteResult.h" #include "nsIAutoCompleteResult.h"
#include "nsIPK11TokenDB.h" #include "nsIPK11TokenDB.h"
#include "nsIPK11Token.h" #include "nsIPK11Token.h"
#include "nsIScriptGlobalObject.h"
#include "nsIWindowWatcher.h"
#include "nsIDOMNSEvent.h"
static const char kPMPropertiesURL[] = "chrome://passwordmgr/locale/passwordmgr.properties"; static const char kPMPropertiesURL[] = "chrome://passwordmgr/locale/passwordmgr.properties";
static PRBool sRememberPasswords = PR_FALSE; static PRBool sRememberPasswords = PR_FALSE;
@ -266,37 +263,6 @@ nsPasswordManager::Init()
progress->AddProgressListener(this, nsIWebProgress::NOTIFY_STATE_DOCUMENT); progress->AddProgressListener(this, nsIWebProgress::NOTIFY_STATE_DOCUMENT);
// Listen for "domwindowopened", this will let us attach our DOMPageRestore
// event listener.
obsService->AddObserver(this, "domwindowopened", PR_FALSE);
obsService->AddObserver(this, "domwindowclosed", PR_FALSE);
// Also register on any open windows that already exist, since we don't
// get notifications for those.
nsCOMPtr<nsIWindowWatcher> watcher =
do_GetService(NS_WINDOWWATCHER_CONTRACTID);
if (watcher) {
nsCOMPtr<nsISimpleEnumerator> enumerator;
watcher->GetWindowEnumerator(getter_AddRefs(enumerator));
if (enumerator) {
PRBool hasMore;
while (NS_SUCCEEDED(enumerator->HasMoreElements(&hasMore)) && hasMore) {
nsCOMPtr<nsISupports> item;
enumerator->GetNext(getter_AddRefs(item));
nsCOMPtr<nsIDOMEventTarget> targ = do_QueryInterface(item);
if (targ) {
targ->AddEventListener(NS_LITERAL_STRING("DOMPageRestore"),
NS_STATIC_CAST(nsIDOMLoadListener*, this),
PR_FALSE);
}
}
}
}
// Now read in the signon file // Now read in the signon file
nsXPIDLCString signonFile; nsXPIDLCString signonFile;
mPrefBranch->GetCharPref("SignonFileName", getter_Copies(signonFile)); mPrefBranch->GetCharPref("SignonFileName", getter_Copies(signonFile));
@ -781,20 +747,6 @@ nsPasswordManager::Observe(nsISupports* aSubject,
NS_ASSERTION(branch == mPrefBranch, "unexpected pref change notification"); NS_ASSERTION(branch == mPrefBranch, "unexpected pref change notification");
branch->GetBoolPref("rememberSignons", &sRememberPasswords); branch->GetBoolPref("rememberSignons", &sRememberPasswords);
} else if (!strcmp(aTopic, "domwindowopened")) {
nsCOMPtr<nsIDOMEventTarget> targ = do_QueryInterface(aSubject);
if (targ) {
targ->AddEventListener(NS_LITERAL_STRING("DOMPageRestore"),
NS_STATIC_CAST(nsIDOMLoadListener*, this),
PR_FALSE);
}
} else if (!strcmp(aTopic, "domwindowclosed")) {
nsCOMPtr<nsIDOMEventTarget> targ = do_QueryInterface(aSubject);
if (targ) {
targ->RemoveEventListener(NS_LITERAL_STRING("DOMPageRestore"),
NS_STATIC_CAST(nsIDOMLoadListener*, this),
PR_FALSE);
}
} }
return NS_OK; return NS_OK;
@ -813,22 +765,16 @@ nsPasswordManager::OnStateChange(nsIWebProgress* aWebProgress,
!(aStateFlags & nsIWebProgressListener::STATE_STOP)) !(aStateFlags & nsIWebProgressListener::STATE_STOP))
return NS_OK; return NS_OK;
nsCOMPtr<nsIDOMWindow> domWin;
nsresult rv = aWebProgress->GetDOMWindow(getter_AddRefs(domWin));
NS_ENSURE_SUCCESS(rv, rv);
return DoPrefill(domWin);
}
nsresult
nsPasswordManager::DoPrefill(nsIDOMWindow *aDOMWindow)
{
// Don't do anything if the global signon pref is disabled // Don't do anything if the global signon pref is disabled
if (!SingleSignonEnabled()) if (!SingleSignonEnabled())
return NS_OK; return NS_OK;
nsCOMPtr<nsIDOMWindow> domWin;
nsresult rv = aWebProgress->GetDOMWindow(getter_AddRefs(domWin));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDOMDocument> domDoc; nsCOMPtr<nsIDOMDocument> domDoc;
aDOMWindow->GetDocument(getter_AddRefs(domDoc)); domWin->GetDocument(getter_AddRefs(domDoc));
NS_ASSERTION(domDoc, "DOM window should always have a document!"); NS_ASSERTION(domDoc, "DOM window should always have a document!");
// For now, only prefill forms in HTML documents. // For now, only prefill forms in HTML documents.
@ -1622,32 +1568,6 @@ nsPasswordManager::Error(nsIDOMEvent* aEvent)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsPasswordManager::PageRestore(nsIDOMEvent* aEvent)
{
// Only autofill for trusted events.
nsCOMPtr<nsIDOMNSEvent> nsevent = do_QueryInterface(aEvent);
PRBool trusted = PR_FALSE;
if (nsevent)
nsevent->GetIsTrusted(&trusted);
if (!trusted)
return NS_OK;
nsCOMPtr<nsIDOMEventTarget> target;
aEvent->GetTarget(getter_AddRefs(target));
nsCOMPtr<nsIDocument> doc = do_QueryInterface(target);
if (doc) {
nsCOMPtr<nsIDOMWindow> win =
do_QueryInterface(doc->GetScriptGlobalObject());
if (win) {
return DoPrefill(win);
}
}
return NS_OK;
}
// internal methods // internal methods

View File

@ -136,7 +136,6 @@ public:
NS_IMETHOD BeforeUnload(nsIDOMEvent* aEvent); NS_IMETHOD BeforeUnload(nsIDOMEvent* aEvent);
NS_IMETHOD Abort(nsIDOMEvent* aEvent); NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent); NS_IMETHOD Error(nsIDOMEvent* aEvent);
NS_IMETHOD PageRestore(nsIDOMEvent* aEvent);
// Autocomplete // Autocomplete
PRBool AutoCompleteSearch(const nsAString& aSearchString, PRBool AutoCompleteSearch(const nsAString& aSearchString,
@ -158,7 +157,6 @@ protected:
nsresult FillPassword(nsIDOMEvent* aEvent); nsresult FillPassword(nsIDOMEvent* aEvent);
void AttachToInput(nsIDOMHTMLInputElement* aElement); void AttachToInput(nsIDOMHTMLInputElement* aElement);
PRBool GetPasswordRealm(nsIURI* aURI, nsACString& aRealm); PRBool GetPasswordRealm(nsIURI* aURI, nsACString& aRealm);
nsresult DoPrefill(nsIDOMWindow *aDOMWindw);
static PLDHashOperator PR_CALLBACK FindEntryEnumerator(const nsACString& aKey, static PLDHashOperator PR_CALLBACK FindEntryEnumerator(const nsACString& aKey,
SignonHashEntry* aEntry, SignonHashEntry* aEntry,

View File

@ -880,12 +880,6 @@ nsFormFillController::Error(nsIDOMEvent *aLoadEvent)
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsFormFillController::PageRestore(nsIDOMEvent *aLoadEvent)
{
return NS_OK;
}
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//// nsFormFillController //// nsFormFillController

View File

@ -112,7 +112,6 @@ public:
NS_IMETHOD Unload(nsIDOMEvent *aLoadEvent); NS_IMETHOD Unload(nsIDOMEvent *aLoadEvent);
NS_IMETHOD Abort(nsIDOMEvent *aLoadEvent); NS_IMETHOD Abort(nsIDOMEvent *aLoadEvent);
NS_IMETHOD Error(nsIDOMEvent *aLoadEvent); NS_IMETHOD Error(nsIDOMEvent *aLoadEvent);
NS_IMETHOD PageRestore(nsIDOMEvent* aLoadEvent);
nsFormFillController(); nsFormFillController();
virtual ~nsFormFillController(); virtual ~nsFormFillController();

View File

@ -260,7 +260,7 @@ if (window && (wintype == "navigator:browser"))
{ {
var contentArea = window.document.getElementById("appcontent"); var contentArea = window.document.getElementById("appcontent");
if (contentArea) if (contentArea)
contentArea.addEventListener("load", charsetLoadListener, true); contentArea.addEventListener("PageShow", charsetLoadListener, true);
} }
else else
{ {
@ -269,14 +269,14 @@ else
{ {
var messageContent = window.document.getElementById("messagepane"); var messageContent = window.document.getElementById("messagepane");
if (messageContent) if (messageContent)
messageContent.addEventListener("load", mailCharsetLoadListener, true); messageContent.addEventListener("PageShow", mailCharsetLoadListener, true);
} }
else else
if (window && arrayOfStrings[0] == "composer") if (window && arrayOfStrings[0] == "composer")
{ {
contentArea = window.document.getElementById("appcontent"); contentArea = window.document.getElementById("appcontent");
if (contentArea) if (contentArea)
contentArea.addEventListener("load", composercharsetLoadListener, true); contentArea.addEventListener("PageShow", composercharsetLoadListener, true);
} }
} }

View File

@ -410,7 +410,7 @@
</body> </body>
</method> </method>
<method name="onLoad"> <method name="onPageShow">
<parameter name="aEvent"/> <parameter name="aEvent"/>
<body> <body>
<![CDATA[ <![CDATA[
@ -433,7 +433,7 @@
</body> </body>
</method> </method>
<method name="onUnload"> <method name="onPageHide">
<parameter name="aEvent"/> <parameter name="aEvent"/>
<body> <body>
<![CDATA[ <![CDATA[
@ -566,8 +566,8 @@
} }
// Listen for first load for lazy attachment to form fill controller // Listen for first load for lazy attachment to form fill controller
this.addEventListener("load", this.onLoad, true); this.addEventListener("PageShow", this.onPageShow, true);
this.addEventListener("unload", this.onUnload, true); this.addEventListener("PageHide", this.onPageHide, true);
this.addEventListener("DOMPopupBlocked", this.onPopupBlocked, false); this.addEventListener("DOMPopupBlocked", this.onPopupBlocked, false);
]]> ]]>
</constructor> </constructor>
@ -606,8 +606,8 @@
this._fastFind = null; this._fastFind = null;
this._webBrowserFind = null; this._webBrowserFind = null;
this.removeEventListener("load", this.onLoad, true); this.removeEventListener("PageShow", this.onPageShow, true);
this.removeEventListener("unload", this.onUnload, true); this.removeEventListener("PageHide", this.onPageHide, true);
this.removeEventListener("DOMPopupBlocked", this.onPopupBlocked, true); this.removeEventListener("DOMPopupBlocked", this.onPopupBlocked, true);
]]> ]]>
</body> </body>

View File

@ -142,6 +142,7 @@ nsDocLoader::nsDocLoader()
mParent = nsnull; mParent = nsnull;
mIsLoadingDocument = PR_FALSE; mIsLoadingDocument = PR_FALSE;
mIsRestoringDocument = PR_FALSE;
static PLDHashTableOps hash_table_ops = static PLDHashTableOps hash_table_ops =
{ {
@ -1155,6 +1156,10 @@ void nsDocLoader::FireOnStateChange(nsIWebProgress *aProgress,
aStateFlags &= ~nsIWebProgressListener::STATE_IS_NETWORK; aStateFlags &= ~nsIWebProgressListener::STATE_IS_NETWORK;
} }
// Add the STATE_RESTORING bit if necessary.
if (mIsRestoringDocument)
aStateFlags |= nsIWebProgressListener::STATE_RESTORING;
#if defined(DEBUG) #if defined(DEBUG)
nsCAutoString buffer; nsCAutoString buffer;

View File

@ -210,6 +210,9 @@ protected:
PLDHashTable mRequestInfoHash; PLDHashTable mRequestInfoHash;
/* Flag to indicate that we're in the process of restoring a document. */
PRBool mIsRestoringDocument;
private: private:
nsListenerInfo *GetListenerInfo(nsIWebProgressListener* aListener); nsListenerInfo *GetListenerInfo(nsIWebProgressListener* aListener);

View File

@ -165,6 +165,22 @@ interface nsIWebProgressListener : nsISupports
const unsigned long STATE_IS_WINDOW = 0x00080000; const unsigned long STATE_IS_WINDOW = 0x00080000;
/**
* State Modifier Flags
*
* These flags further describe the transition which is occuring. These
* flags are NOT mutually exclusive (i.e., an onStateChange event may
* indicate some combination of these flags).
*
* STATE_RESTORING
* This flag indicates that the state transition corresponds to the start
* or stop of activity for restoring a previously-rendered presentation.
* As such, there is no actual network activity associated with this
* request, and any modifications made to the document or presentation
* when it was originally loaded will still be present.
*/
const unsigned long STATE_RESTORING = 0x01000000;
/** /**
* State Security Flags * State Security Flags
* *

View File

@ -92,6 +92,7 @@ class nsIURI;
#define NS_BEFORE_PAGE_UNLOAD_EVENT 26 #define NS_BEFORE_PAGE_UNLOAD_EVENT 26
#define NS_UI_EVENT 27 #define NS_UI_EVENT 27
#define NS_QUERYCARETRECT_EVENT 28 #define NS_QUERYCARETRECT_EVENT 28
#define NS_PAGETRANSITION_EVENT 29
#define NS_EVENT_FLAG_NONE 0x0000 #define NS_EVENT_FLAG_NONE 0x0000
#define NS_EVENT_FLAG_INIT 0x0001 #define NS_EVENT_FLAG_INIT 0x0001
@ -324,6 +325,11 @@ class nsIURI;
#define NS_QUERYCARETRECT_START 2600 #define NS_QUERYCARETRECT_START 2600
#define NS_QUERYCARETRECT (NS_QUERYCARETRECT_START) #define NS_QUERYCARETRECT (NS_QUERYCARETRECT_START)
// pagetransition events
#define NS_PAGETRANSITION_START 2700
#define NS_PAGE_SHOW (NS_PAGETRANSITION_START + 1)
#define NS_PAGE_HIDE (NS_PAGETRANSITION_START + 2)
/** /**
* Return status for event processors, nsEventStatus, is defined in * Return status for event processors, nsEventStatus, is defined in
* nsEvent.h. * nsEvent.h.
@ -884,6 +890,21 @@ public:
PRInt32 detail; PRInt32 detail;
}; };
/**
* PageTransition event
*/
class nsPageTransitionEvent : public nsEvent
{
public:
nsPageTransitionEvent(PRBool isTrusted, PRUint32 msg, PRBool p)
: nsEvent(isTrusted, msg, NS_PAGETRANSITION_EVENT),
persisted(p)
{
}
PRBool persisted;
};
/** /**
* Event status for D&D Event * Event status for D&D Event
*/ */

View File

@ -131,8 +131,8 @@ function()
linkToolbarUI.toolbarActive = true; linkToolbarUI.toolbarActive = true;
document.getElementById("linktoolbar").setAttribute("hasitems", "true"); document.getElementById("linktoolbar").setAttribute("hasitems", "true");
var contentArea = document.getElementById("appcontent"); var contentArea = document.getElementById("appcontent");
contentArea.addEventListener("unload", linkToolbarUI.clear, true); contentArea.addEventListener("PageHide", linkToolbarUI.clear, true);
contentArea.addEventListener("load", linkToolbarUI.deactivate, true); contentArea.addEventListener("PageShow", linkToolbarUI.deactivate, true);
contentArea.addEventListener("DOMHeadLoaded", linkToolbarUI.deactivate, contentArea.addEventListener("DOMHeadLoaded", linkToolbarUI.deactivate,
true); true);
} }
@ -150,8 +150,8 @@ function()
linkToolbarUI.toolbarActive = false; linkToolbarUI.toolbarActive = false;
document.getElementById("linktoolbar").setAttribute("hasitems", "false"); document.getElementById("linktoolbar").setAttribute("hasitems", "false");
var contentArea = document.getElementById("appcontent"); var contentArea = document.getElementById("appcontent");
contentArea.removeEventListener("unload", linkToolbarUI.clear, true); contentArea.removeEventListener("PageHide", linkToolbarUI.clear, true);
contentArea.removeEventListener("load", linkToolbarUI.deactivate, true); contentArea.removeEventListener("PageShow", linkToolbarUI.deactivate, true);
contentArea.removeEventListener("DOMHeadLoaded", linkToolbarUI.deactivate, contentArea.removeEventListener("DOMHeadLoaded", linkToolbarUI.deactivate,
true); true);
} }
@ -249,7 +249,7 @@ function()
if (!linkToolbarUI.initialized) if (!linkToolbarUI.initialized)
{ {
linkToolbarUI.initialized = true; linkToolbarUI.initialized = true;
document.removeEventListener("load", linkToolbarUI.initHandlers, true); document.removeEventListener("PageShow", linkToolbarUI.initHandlers, true);
} }
} }

View File

@ -56,7 +56,7 @@
<script type="application/x-javascript"> <script type="application/x-javascript">
<![CDATA[ <![CDATA[
document.addEventListener("load", linkToolbarUI.initHandlers, true); document.addEventListener("PageShow", linkToolbarUI.initHandlers, true);
]]> ]]>
</script> </script>

View File

@ -248,7 +248,7 @@ function removePopupPermListener(observer)
* one listener that calls all real handlers. * one listener that calls all real handlers.
*/ */
function loadEventHandlers(event) function pageShowEventHandlers(event)
{ {
// Filter out events that are not about the document load we are interested in // Filter out events that are not about the document load we are interested in
if (event.originalTarget == content.document) { if (event.originalTarget == content.document) {
@ -554,7 +554,7 @@ function Startup()
// (rjc note: not the entire window, otherwise we'll get sidebar pane loads too!) // (rjc note: not the entire window, otherwise we'll get sidebar pane loads too!)
// so we'll be notified when onloads complete. // so we'll be notified when onloads complete.
var contentArea = document.getElementById("appcontent"); var contentArea = document.getElementById("appcontent");
contentArea.addEventListener("load", loadEventHandlers, true); contentArea.addEventListener("PageShow", pageShowEventHandlers, true);
contentArea.addEventListener("focus", contentAreaFrameFocus, true); contentArea.addEventListener("focus", contentAreaFrameFocus, true);
var turboMode = false; var turboMode = false;

View File

@ -55,7 +55,7 @@ struct nsRect;
%} %}
[ref] native nsRect(nsRect); [ref] native nsRect(nsRect);
[scriptable, uuid(e47bf412-3bc2-4306-a82f-ea2bdf950432)] [scriptable, uuid(a19c4489-4a71-42e1-b150-61366547030d)]
interface nsISHEntry : nsIHistoryEntry interface nsISHEntry : nsIHistoryEntry
{ {
/** URI for the document */ /** URI for the document */
@ -102,9 +102,6 @@ interface nsISHEntry : nsIHistoryEntry
*/ */
void clearChildShells(); void clearChildShells();
/** Saved security state for the content viewer */
attribute nsISupports securityState;
/** Saved refresh URI list for the content viewer */ /** Saved refresh URI list for the content viewer */
attribute nsISupportsArray refreshURIList; attribute nsISupportsArray refreshURIList;

View File

@ -500,20 +500,6 @@ nsSHEntry::ClearChildShells()
return NS_OK; return NS_OK;
} }
NS_IMETHODIMP
nsSHEntry::GetSecurityState(nsISupports **aState)
{
NS_IF_ADDREF(*aState = mSecurityState);
return NS_OK;
}
NS_IMETHODIMP
nsSHEntry::SetSecurityState(nsISupports *aState)
{
mSecurityState = aState;
return NS_OK;
}
NS_IMETHODIMP NS_IMETHODIMP
nsSHEntry::GetRefreshURIList(nsISupportsArray **aList) nsSHEntry::GetRefreshURIList(nsISupportsArray **aList)
{ {
@ -545,7 +531,6 @@ nsSHEntry::SyncPresentationState()
mWindowState = nsnull; mWindowState = nsnull;
mViewerBounds.SetRect(0, 0, 0, 0); mViewerBounds.SetRect(0, 0, 0, 0);
mChildShells.Clear(); mChildShells.Clear();
mSecurityState = nsnull;
mRefreshURIList = nsnull; mRefreshURIList = nsnull;
return NS_OK; return NS_OK;
} }

View File

@ -95,7 +95,6 @@ private:
nsCOMPtr<nsISupports> mWindowState; nsCOMPtr<nsISupports> mWindowState;
nsRect mViewerBounds; nsRect mViewerBounds;
nsVoidArray mChildShells; nsVoidArray mChildShells;
nsCOMPtr<nsISupports> mSecurityState;
nsCOMPtr<nsISupportsArray> mRefreshURIList; nsCOMPtr<nsISupportsArray> mRefreshURIList;
}; };

View File

@ -283,7 +283,7 @@ if (window && (wintype == "navigator:browser"))
{ {
var contentArea = window.document.getElementById("appcontent"); var contentArea = window.document.getElementById("appcontent");
if (contentArea) if (contentArea)
contentArea.addEventListener("load", charsetLoadListener, true); contentArea.addEventListener("PageShow", charsetLoadListener, true);
} }
else else
{ {
@ -292,14 +292,14 @@ else
{ {
var messageContent = window.document.getElementById("messagepane"); var messageContent = window.document.getElementById("messagepane");
if (messageContent) if (messageContent)
messageContent.addEventListener("load", mailCharsetLoadListener, true); messageContent.addEventListener("PageShow", mailCharsetLoadListener, true);
} }
else else
if (window && arrayOfStrings[0] == "composer") if (window && arrayOfStrings[0] == "composer")
{ {
contentArea = window.document.getElementById("appcontent"); contentArea = window.document.getElementById("appcontent");
if (contentArea) if (contentArea)
contentArea.addEventListener("load", composercharsetLoadListener, true); contentArea.addEventListener("PageShow", composercharsetLoadListener, true);
} }
} }