bug 882079 - merge nsIDocShellHistory into nsIDocShell r=smaug
This commit is contained in:
@@ -900,7 +900,6 @@ NS_INTERFACE_MAP_BEGIN(nsDocShell)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDocShell)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeItem)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeNode)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIDocShellHistory)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIWebNavigation)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIBaseWindow)
|
||||
NS_INTERFACE_MAP_ENTRY(nsIScrollable)
|
||||
@@ -1317,82 +1316,75 @@ nsDocShell::LoadURI(nsIURI * aURI,
|
||||
// Get the parent's load type
|
||||
parentDS->GetLoadType(&parentLoadType);
|
||||
|
||||
nsCOMPtr<nsIDocShellHistory> parent(do_QueryInterface(parentAsItem));
|
||||
if (parent) {
|
||||
// Get the ShEntry for the child from the parent
|
||||
nsCOMPtr<nsISHEntry> currentSH;
|
||||
bool oshe = false;
|
||||
parent->GetCurrentSHEntry(getter_AddRefs(currentSH), &oshe);
|
||||
bool dynamicallyAddedChild = mDynamicallyCreated;
|
||||
if (!dynamicallyAddedChild && !oshe && currentSH) {
|
||||
currentSH->HasDynamicallyAddedChild(&dynamicallyAddedChild);
|
||||
}
|
||||
if (!dynamicallyAddedChild) {
|
||||
// Only use the old SHEntry, if we're sure enough that
|
||||
// it wasn't originally for some other frame.
|
||||
parent->GetChildSHEntry(mChildOffset, getter_AddRefs(shEntry));
|
||||
}
|
||||
// Get the ShEntry for the child from the parent
|
||||
nsCOMPtr<nsISHEntry> currentSH;
|
||||
bool oshe = false;
|
||||
parentDS->GetCurrentSHEntry(getter_AddRefs(currentSH), &oshe);
|
||||
bool dynamicallyAddedChild = mDynamicallyCreated;
|
||||
if (!dynamicallyAddedChild && !oshe && currentSH) {
|
||||
currentSH->HasDynamicallyAddedChild(&dynamicallyAddedChild);
|
||||
}
|
||||
if (!dynamicallyAddedChild) {
|
||||
// Only use the old SHEntry, if we're sure enough that
|
||||
// it wasn't originally for some other frame.
|
||||
parentDS->GetChildSHEntry(mChildOffset, getter_AddRefs(shEntry));
|
||||
}
|
||||
|
||||
// Make some decisions on the child frame's loadType based on the
|
||||
// parent's loadType.
|
||||
if (mCurrentURI == nullptr) {
|
||||
// This is a newly created frame. Check for exception cases first.
|
||||
// By default the subframe will inherit the parent's loadType.
|
||||
if (shEntry && (parentLoadType == LOAD_NORMAL ||
|
||||
parentLoadType == LOAD_LINK ||
|
||||
parentLoadType == LOAD_NORMAL_EXTERNAL)) {
|
||||
// The parent was loaded normally. In this case, this *brand new* child really shouldn't
|
||||
// have a SHEntry. If it does, it could be because the parent is replacing an
|
||||
// existing frame with a new frame, in the onLoadHandler. We don't want this
|
||||
// url to get into session history. Clear off shEntry, and set load type to
|
||||
// LOAD_BYPASS_HISTORY.
|
||||
bool inOnLoadHandler=false;
|
||||
parentDS->GetIsExecutingOnLoadHandler(&inOnLoadHandler);
|
||||
if (inOnLoadHandler) {
|
||||
loadType = LOAD_NORMAL_REPLACE;
|
||||
shEntry = nullptr;
|
||||
}
|
||||
}
|
||||
else if (parentLoadType == LOAD_REFRESH) {
|
||||
// Clear shEntry. For refresh loads, we have to load
|
||||
// what comes thro' the pipe, not what's in history.
|
||||
// Make some decisions on the child frame's loadType based on the
|
||||
// parent's loadType.
|
||||
if (mCurrentURI == nullptr) {
|
||||
// This is a newly created frame. Check for exception cases first.
|
||||
// By default the subframe will inherit the parent's loadType.
|
||||
if (shEntry && (parentLoadType == LOAD_NORMAL ||
|
||||
parentLoadType == LOAD_LINK ||
|
||||
parentLoadType == LOAD_NORMAL_EXTERNAL)) {
|
||||
// The parent was loaded normally. In this case, this *brand new* child really shouldn't
|
||||
// have a SHEntry. If it does, it could be because the parent is replacing an
|
||||
// existing frame with a new frame, in the onLoadHandler. We don't want this
|
||||
// url to get into session history. Clear off shEntry, and set load type to
|
||||
// LOAD_BYPASS_HISTORY.
|
||||
bool inOnLoadHandler=false;
|
||||
parentDS->GetIsExecutingOnLoadHandler(&inOnLoadHandler);
|
||||
if (inOnLoadHandler) {
|
||||
loadType = LOAD_NORMAL_REPLACE;
|
||||
shEntry = nullptr;
|
||||
}
|
||||
else if ((parentLoadType == LOAD_BYPASS_HISTORY) ||
|
||||
(shEntry &&
|
||||
((parentLoadType & LOAD_CMD_HISTORY) ||
|
||||
(parentLoadType == LOAD_RELOAD_NORMAL) ||
|
||||
(parentLoadType == LOAD_RELOAD_CHARSET_CHANGE)))) {
|
||||
// If the parent url, bypassed history or was loaded from
|
||||
// history, pass on the parent's loadType to the new child
|
||||
// frame too, so that the child frame will also
|
||||
// avoid getting into history.
|
||||
loadType = parentLoadType;
|
||||
}
|
||||
else if (parentLoadType == LOAD_ERROR_PAGE) {
|
||||
// If the parent document is an error page, we don't
|
||||
// want to update global/session history. However,
|
||||
// this child frame is not an error page.
|
||||
loadType = LOAD_BYPASS_HISTORY;
|
||||
}
|
||||
} else if (parentLoadType == LOAD_REFRESH) {
|
||||
// Clear shEntry. For refresh loads, we have to load
|
||||
// what comes thro' the pipe, not what's in history.
|
||||
shEntry = nullptr;
|
||||
} else if ((parentLoadType == LOAD_BYPASS_HISTORY) ||
|
||||
(shEntry &&
|
||||
((parentLoadType & LOAD_CMD_HISTORY) ||
|
||||
(parentLoadType == LOAD_RELOAD_NORMAL) ||
|
||||
(parentLoadType == LOAD_RELOAD_CHARSET_CHANGE)))) {
|
||||
// If the parent url, bypassed history or was loaded from
|
||||
// history, pass on the parent's loadType to the new child
|
||||
// frame too, so that the child frame will also
|
||||
// avoid getting into history.
|
||||
loadType = parentLoadType;
|
||||
} else if (parentLoadType == LOAD_ERROR_PAGE) {
|
||||
// If the parent document is an error page, we don't
|
||||
// want to update global/session history. However,
|
||||
// this child frame is not an error page.
|
||||
loadType = LOAD_BYPASS_HISTORY;
|
||||
}
|
||||
else {
|
||||
// This is a pre-existing subframe. If the load was not originally initiated
|
||||
// by session history, (if (!shEntry) condition succeeded) and mCurrentURI is not null,
|
||||
// it is possible that a parent's onLoadHandler or even self's onLoadHandler is loading
|
||||
// a new page in this child. Check parent's and self's busy flag and if it is set,
|
||||
// we don't want this onLoadHandler load to get in to session history.
|
||||
uint32_t parentBusy = BUSY_FLAGS_NONE;
|
||||
uint32_t selfBusy = BUSY_FLAGS_NONE;
|
||||
parentDS->GetBusyFlags(&parentBusy);
|
||||
GetBusyFlags(&selfBusy);
|
||||
if (parentBusy & BUSY_FLAGS_BUSY ||
|
||||
} else {
|
||||
// This is a pre-existing subframe. If the load was not originally initiated
|
||||
// by session history, (if (!shEntry) condition succeeded) and mCurrentURI is not null,
|
||||
// it is possible that a parent's onLoadHandler or even self's onLoadHandler is loading
|
||||
// a new page in this child. Check parent's and self's busy flag and if it is set,
|
||||
// we don't want this onLoadHandler load to get in to session history.
|
||||
uint32_t parentBusy = BUSY_FLAGS_NONE;
|
||||
uint32_t selfBusy = BUSY_FLAGS_NONE;
|
||||
parentDS->GetBusyFlags(&parentBusy);
|
||||
GetBusyFlags(&selfBusy);
|
||||
if (parentBusy & BUSY_FLAGS_BUSY ||
|
||||
selfBusy & BUSY_FLAGS_BUSY) {
|
||||
loadType = LOAD_NORMAL_REPLACE;
|
||||
shEntry = nullptr;
|
||||
}
|
||||
loadType = LOAD_NORMAL_REPLACE;
|
||||
shEntry = nullptr;
|
||||
}
|
||||
} // parent
|
||||
}
|
||||
} //parentDS
|
||||
else {
|
||||
// This is the root docshell. If we got here while
|
||||
@@ -3461,9 +3453,9 @@ nsDocShell::AddChild(nsIDocShellTreeItem * aChild)
|
||||
NS_ASSERTION(!mChildList.IsEmpty(),
|
||||
"child list must not be empty after a successful add");
|
||||
|
||||
nsCOMPtr<nsIDocShellHistory> docshellhistory = do_QueryInterface(aChild);
|
||||
nsCOMPtr<nsIDocShell> childDocShell = do_QueryInterface(aChild);
|
||||
bool dynamic = false;
|
||||
docshellhistory->GetCreatedDynamically(&dynamic);
|
||||
childDocShell->GetCreatedDynamically(&dynamic);
|
||||
if (!dynamic) {
|
||||
nsCOMPtr<nsISHEntry> currentSH;
|
||||
bool oshe = false;
|
||||
@@ -3472,15 +3464,11 @@ nsDocShell::AddChild(nsIDocShellTreeItem * aChild)
|
||||
currentSH->HasDynamicallyAddedChild(&dynamic);
|
||||
}
|
||||
}
|
||||
nsCOMPtr<nsIDocShell> childDocShell = do_QueryInterface(aChild);
|
||||
childDocShell->SetChildOffset(dynamic ? -1 : mChildList.Length() - 1);
|
||||
|
||||
/* Set the child's global history if the parent has one */
|
||||
if (mUseGlobalHistory) {
|
||||
nsCOMPtr<nsIDocShellHistory>
|
||||
dsHistoryChild(do_QueryInterface(aChild));
|
||||
if (dsHistoryChild)
|
||||
dsHistoryChild->SetUseGlobalHistory(true);
|
||||
childDocShell->SetUseGlobalHistory(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -3643,9 +3631,6 @@ nsDocShell::FindChildWithName(const PRUnichar * aName,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
//*****************************************************************************
|
||||
// nsDocShell::nsIDocShellHistory
|
||||
//*****************************************************************************
|
||||
NS_IMETHODIMP
|
||||
nsDocShell::GetChildSHEntry(int32_t aChildOffset, nsISHEntry ** aResult)
|
||||
{
|
||||
@@ -3759,7 +3744,7 @@ nsDocShell::AddChildSHEntry(nsISHEntry * aCloneRef, nsISHEntry * aNewEntry,
|
||||
}
|
||||
else {
|
||||
/* Just pass this along */
|
||||
nsCOMPtr<nsIDocShellHistory> parent =
|
||||
nsCOMPtr<nsIDocShell> parent =
|
||||
do_QueryInterface(GetAsSupports(mParent), &rv);
|
||||
if (parent) {
|
||||
rv = parent->AddChildSHEntry(aCloneRef, aNewEntry, aChildOffset,
|
||||
@@ -3789,7 +3774,7 @@ nsDocShell::DoAddChildSHEntry(nsISHEntry* aNewEntry, int32_t aChildOffset,
|
||||
}
|
||||
|
||||
nsresult rv;
|
||||
nsCOMPtr<nsIDocShellHistory> parent =
|
||||
nsCOMPtr<nsIDocShell> parent =
|
||||
do_QueryInterface(GetAsSupports(mParent), &rv);
|
||||
if (parent) {
|
||||
rv = parent->AddChildSHEntry(mOSHE, aNewEntry, aChildOffset, mLoadType,
|
||||
@@ -6388,7 +6373,7 @@ nsDocShell::OnStateChange(nsIWebProgress * aProgress, nsIRequest * aRequest,
|
||||
// Need to clear the session history for all child
|
||||
// docshells so that we can handle them like they would
|
||||
// all be added dynamically.
|
||||
nsCOMPtr<nsIDocShellHistory> parent =
|
||||
nsCOMPtr<nsIDocShell> parent =
|
||||
do_QueryInterface(parentAsItem);
|
||||
if (parent) {
|
||||
bool oshe = false;
|
||||
|
||||
Reference in New Issue
Block a user