From d1d245f0910dbd40324c586915e2eb409cb51f6b Mon Sep 17 00:00:00 2001 From: "pinkerton%aol.net" Date: Mon, 5 Jan 2004 23:28:37 +0000 Subject: [PATCH] don't reload the page when asking for view-source. use the cached version if we have one (bug 153884) --- camino/src/browser/BrowserWindowController.mm | 87 ++++++++++++++----- camino/src/embedding/CHBrowserView.h | 7 ++ camino/src/embedding/CHBrowserView.mm | 24 +++++ 3 files changed, 95 insertions(+), 23 deletions(-) diff --git a/camino/src/browser/BrowserWindowController.mm b/camino/src/browser/BrowserWindowController.mm index 385979e6e20b..470119dad354 100644 --- a/camino/src/browser/BrowserWindowController.mm +++ b/camino/src/browser/BrowserWindowController.mm @@ -84,6 +84,7 @@ #include "nsIURIFixup.h" #include "nsIBrowserHistory.h" #include "nsIPermissionManager.h" +#include "nsIWebPageDescriptor.h" #include @@ -231,11 +232,18 @@ static NSArray* sToolbarDefaults = nil; #pragma mark - @interface BrowserWindowController(Private) + // open a new window or tab, but doesn't load anything into them. Must be matched + // with a call to do that. +- (BrowserWindowController*)openNewWindow:(BOOL)aLoadInBG; +- (BrowserTabViewItem*)openNewTab:(BOOL)aLoadInBG; + - (void)setupToolbar; - (void)setupSidebarTabs; - (NSString*)getContextMenuNodeDocumentURL; - (void)loadSourceOfURL:(NSString*)urlStr; - (void) transformFormatString:(NSMutableString*)inFormat domain:(NSString*)inDomain search:(NSString*)inSearch; +-(void)openNewWindowWithDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType loadInBackground:(BOOL)aLoadInBG; +-(void)openNewTabWithDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType loadInBackground:(BOOL)aLoadInBG; @end @implementation BrowserWindowController @@ -1216,16 +1224,26 @@ static NSArray* sToolbarDefaults = nil; - (void)loadSourceOfURL:(NSString*)urlStr { - NSString* viewSource = [@"view-source:" stringByAppendingString: urlStr]; - + // first attempt to get the source that's already loaded PRBool loadInBackground; nsCOMPtr pref(do_GetService("@mozilla.org/preferences-service;1")); pref->GetBoolPref("browser.tabs.loadInBackground", &loadInBackground); - if (![self newTabsAllowed]) - [self openNewWindowWithURL: viewSource referrer:nil loadInBackground: loadInBackground]; - else + nsCOMPtr desc = [[mBrowserView getBrowserView] getPageDescriptor]; + if (desc) { + if ([self newTabsAllowed]) + [self openNewTabWithDescriptor:desc displayType:nsIWebPageDescriptor::DISPLAY_AS_SOURCE loadInBackground:loadInBackground]; + else + [self openNewWindowWithDescriptor:desc displayType:nsIWebPageDescriptor::DISPLAY_AS_SOURCE loadInBackground:loadInBackground]; + return; + } + + //otherwise reload it from the server + NSString* viewSource = [@"view-source:" stringByAppendingString: urlStr]; + if ([self newTabsAllowed]) [self openNewTabWithURL: viewSource referrer:nil loadInBackground: loadInBackground]; + else + [self openNewWindowWithURL: viewSource referrer:nil loadInBackground: loadInBackground]; } - (IBAction)viewSource:(id)aSender @@ -1905,29 +1923,27 @@ static NSArray* sToolbarDefaults = nil; -(void)openNewWindowWithURL: (NSString*)aURLSpec referrer: (NSString*)aReferrer loadInBackground: (BOOL)aLoadInBG { - // Autosave our dimensions before we open a new window. That ensures the size ends up matching. - [self autosaveWindowFrame]; - - BrowserWindowController* browser = [[BrowserWindowController alloc] initWithWindowNibName: @"BrowserWindow"]; + BrowserWindowController* browser = [self openNewWindow:aLoadInBG]; [browser loadURL: aURLSpec referrer:aReferrer activate:!aLoadInBG]; - - if (aLoadInBG) - { - BrowserWindow* browserWin = [browser window]; - [browserWin setSuppressMakeKeyFront:YES]; // prevent gecko focus bringing the window to the front - [browserWin orderWindow: NSWindowBelow relativeTo: [[self window] windowNumber]]; - [browserWin setSuppressMakeKeyFront:NO]; - } - else - [browser showWindow:self]; } - (void)openNewWindowWithGroupURLs: (NSArray *)urlArray loadInBackground: (BOOL)aLoadInBG +{ + BrowserWindowController* browser = [self openNewWindow:aLoadInBG]; + [browser openTabGroup:urlArray replaceExistingTabs:YES]; +} + +// +// -openNewWindow: +// +// open a new window, but doesn't load anything into it. Must be matched +// with a call to do that. +// +- (BrowserWindowController*)openNewWindow:(BOOL)aLoadInBG { // Autosave our dimensions before we open a new window. That ensures the size ends up matching. [self autosaveWindowFrame]; - // Tell the Tab Browser in the newly created window to load the group BrowserWindowController* browser = [[BrowserWindowController alloc] initWithWindowNibName: @"BrowserWindow"]; if (aLoadInBG) { @@ -1938,13 +1954,25 @@ static NSArray* sToolbarDefaults = nil; } else [browser showWindow:self]; - [browser openTabGroup:urlArray replaceExistingTabs:YES]; + + return browser; } -(void)openNewTabWithURL: (NSString*)aURLSpec referrer:(NSString*)aReferrer loadInBackground: (BOOL)aLoadInBG +{ + BrowserTabViewItem* newTab = [self openNewTab:aLoadInBG]; + [[newTab view] loadURI:aURLSpec referrer:aReferrer flags:NSLoadFlagsNone activate:!aLoadInBG]; +} + +// +// -openNewTab: +// +// open a new tab, but doesn't load anything into it. Must be matched +// with a call to do that. +// +- (BrowserTabViewItem*)openNewTab:(BOOL)aLoadInBG; { BrowserTabViewItem* newTab = [self createNewTabItem]; - BrowserWrapper* newView = [newTab view]; [self ensureBrowserVisible:self]; @@ -1968,9 +1996,22 @@ static NSArray* sToolbarDefaults = nil; if (!aLoadInBG) [mTabBrowser selectTabViewItem: newTab]; - [newView loadURI:aURLSpec referrer:aReferrer flags:NSLoadFlagsNone activate:!aLoadInBG]; + return newTab; } +-(void)openNewWindowWithDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType loadInBackground:(BOOL)aLoadInBG; +{ + BrowserWindowController* browser = [self openNewWindow:aLoadInBG]; + [[[browser getBrowserWrapper] getBrowserView] setPageDescriptor:aDesc displayType:aDisplayType]; +} + +-(void)openNewTabWithDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType loadInBackground:(BOOL)aLoadInBG; +{ + BrowserTabViewItem* newTab = [self openNewTab:aLoadInBG]; + [[[newTab view] getBrowserView] setPageDescriptor:aDesc displayType:aDisplayType]; +} + + - (void)openTabGroup:(NSArray*)urlArray replaceExistingTabs:(BOOL)replaceExisting { int curNumTabs = [mTabBrowser numberOfTabViewItems]; diff --git a/camino/src/embedding/CHBrowserView.h b/camino/src/embedding/CHBrowserView.h index 1591dca131c6..85b257d6f272 100644 --- a/camino/src/embedding/CHBrowserView.h +++ b/camino/src/embedding/CHBrowserView.h @@ -41,6 +41,9 @@ #undef DARWIN #import +#include "prtypes.h" +#include "nsCOMPtr.h" + @class CHBrowserView; class CHBrowserListener; class nsIDOMWindow; @@ -52,6 +55,7 @@ class nsIEventSink; class nsIDragHelperService; class nsIPrintSettings; class nsIURI; +class nsISupports; // Protocol implemented by anyone interested in progress @@ -223,6 +227,9 @@ enum { - (IBAction)reloadWithNewCharset:(NSString*)charset; - (NSString*)currentCharset; +- (already_AddRefed)getPageDescriptor; +- (void)setPageDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType; + @end #endif // __nsCocoaBrowserView_h__ diff --git a/camino/src/embedding/CHBrowserView.mm b/camino/src/embedding/CHBrowserView.mm index f0b8c5b005a5..0b9158fe0ec2 100644 --- a/camino/src/embedding/CHBrowserView.mm +++ b/camino/src/embedding/CHBrowserView.mm @@ -79,6 +79,7 @@ #include "nsIWebBrowserFind.h" #include "nsNetUtil.h" #include "SaveHeaderSniffer.h" +#include "nsIWebPageDescriptor.h" #import "CHBrowserView.h" @@ -99,6 +100,7 @@ typedef unsigned int DragReference; #include "nsICommandParams.h" + const char kPersistContractID[] = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1"; const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1"; @@ -1245,4 +1247,26 @@ const char kDirServiceContractID[] = "@mozilla.org/file/directory_service;1"; return nil; } +- (already_AddRefed)getPageDescriptor +{ + nsCOMPtr docShell = dont_AddRef([self getDocShell]); + nsCOMPtr wpd = do_QueryInterface(docShell); + if(!wpd) + return NULL; + + nsISupports *desc = NULL; + wpd->GetCurrentDescriptor(&desc); // addrefs + return desc; +} + +- (void)setPageDescriptor:(nsISupports*)aDesc displayType:(PRUint32)aDisplayType +{ + nsCOMPtr docShell = dont_AddRef([self getDocShell]); + nsCOMPtr wpd = do_QueryInterface(docShell); + if(!wpd) + return; + + wpd->LoadPage(aDesc, aDisplayType); +} + @end