Index: embed/mozilla/EphyBrowser.cpp =================================================================== RCS file: /cvs/gnome/epiphany/embed/mozilla/EphyBrowser.cpp,v retrieving revision 1.110 diff -p -u -b -r1.110 EphyBrowser.cpp --- embed/mozilla/EphyBrowser.cpp 13 Sep 2006 11:34:14 -0000 1.110 +++ embed/mozilla/EphyBrowser.cpp 5 Oct 2006 20:08:13 -0000 @@ -1524,3 +1524,55 @@ EphyBrowser::Close () return domWin->Close(); } + +nsresult +EphyBrowser::GetPIDOMWindow(nsPIDOMWindow **aPIWin) +{ + *aPIWin = nsnull; + + // get the private DOM window + nsCOMPtr domWindowPrivate = do_QueryInterface(mDOMWindow); + + // and the root window for that DOM window + *aPIWin = domWindowPrivate->GetPrivateRoot(); + + if (*aPIWin) + { + NS_ADDREF(*aPIWin); + return NS_OK; + } + + return NS_ERROR_FAILURE; + +} + +nsresult +EphyBrowser::LoadURI(const char *aURI, + PRUint32 aLoadFlags, + nsIURI *aReferrer) +{ + nsString uURI; + nsresult rv = NS_OK; + + NS_CStringToUTF16 (nsCString (aURI), NS_CSTRING_ENCODING_UTF8, uURI); + + if (uURI.Length() == 0) return NS_OK; + + nsCOMPtr contentNav = do_QueryInterface (mWebBrowser); + NS_ENSURE_TRUE (contentNav, NS_ERROR_FAILURE); + + nsCOMPtr piWin; + rv = GetPIDOMWindow(getter_AddRefs(piWin)); + NS_ENSURE_SUCCESS (rv, rv); + + nsAutoPopupStatePusher popupStatePusher(piWin, openAllowed); + + rv = contentNav->LoadURI(uURI.get(), // URI string + aLoadFlags, // Load flags + aReferrer, // Referring URI + nsnull, // Post data + nsnull); // extra headers + + return rv; +} + Index: embed/mozilla/EphyBrowser.h =================================================================== RCS file: /cvs/gnome/epiphany/embed/mozilla/EphyBrowser.h,v retrieving revision 1.54 diff -p -u -b -r1.54 EphyBrowser.h --- embed/mozilla/EphyBrowser.h 13 Sep 2006 11:34:14 -0000 1.54 +++ embed/mozilla/EphyBrowser.h 5 Oct 2006 20:08:13 -0000 @@ -36,6 +36,7 @@ #include #include #include +#include #ifdef ALLOW_PRIVATE_API #include @@ -172,6 +173,7 @@ public: nsresult GetDocumentURI (nsIURI **aURI); nsresult GetTargetDocumentURI (nsIURI **aURI); nsresult GetDOMWindow (nsIDOMWindow **window); + nsresult GetPIDOMWindow(nsPIDOMWindow **aPIWin); nsresult GetHasModifiedForms (PRBool *modified); @@ -182,6 +184,10 @@ public: PRBool copy_forward, PRBool copy_current); nsresult Close (); + + nsresult LoadURI(const char *aURI, + PRUint32 aLoadFlags = nsIWebNavigation::LOAD_FLAGS_NONE, + nsIURI *aURI = nsnull); EphyEmbedDocumentType GetDocumentType (); Index: embed/mozilla/mozilla-embed.cpp =================================================================== RCS file: /cvs/gnome/epiphany/embed/mozilla/mozilla-embed.cpp,v retrieving revision 1.129 diff -p -u -b -r1.129 mozilla-embed.cpp --- embed/mozilla/mozilla-embed.cpp 13 Sep 2006 11:34:15 -0000 1.129 +++ embed/mozilla/mozilla-embed.cpp 5 Oct 2006 20:08:15 -0000 @@ -324,6 +324,42 @@ impl_load_url (EphyEmbed *embed, gtk_moz_embed_load_url (GTK_MOZ_EMBED(embed), url); } +static char * impl_get_location (EphyEmbed *embed, gboolean toplevel); + +static void +impl_load (EphyEmbed *embed, + const char *url, + EphyEmbedLoadFlags flags, + EphyEmbed *preview_embed) +{ + EphyBrowser *browser; + + browser = MOZILLA_EMBED(embed)->priv->browser; + g_return_if_fail (browser != NULL); + + nsCOMPtr uri; + if (preview_embed != NULL) + { + EphyBrowser *pbrowser; + nsresult rv; + + pbrowser = MOZILLA_EMBED(preview_embed)->priv->browser; + if (pbrowser != NULL) + { + pbrowser->GetDocumentURI (getter_AddRefs (uri)); + } + } + + if (flags & EPHY_EMBED_LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP) + { + browser->LoadURI (url, nsIWebNavigation::LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP, uri); + } + else + { + browser->LoadURI (url, nsIWebNavigation::LOAD_FLAGS_NONE, uri); + } +} + static void impl_stop_load (EphyEmbed *embed) { @@ -1114,6 +1150,7 @@ static void ephy_embed_iface_init (EphyEmbedIface *iface) { iface->load_url = impl_load_url; + iface->load = impl_load; iface->stop_load = impl_stop_load; iface->can_go_back = impl_can_go_back; iface->can_go_forward =impl_can_go_forward; Index: embed/ephy-embed.h =================================================================== RCS file: /cvs/gnome/epiphany/embed/ephy-embed.h,v retrieving revision 1.64 diff -p -u -b -r1.64 ephy-embed.h --- embed/ephy-embed.h 13 Sep 2006 11:34:13 -0000 1.64 +++ embed/ephy-embed.h 5 Oct 2006 20:08:16 -0000 @@ -63,6 +63,12 @@ typedef enum EPHY_EMBED_CHROME_BOOKMARKSBAR = 1 << 3 } EphyEmbedChrome; +typedef enum +{ + EPHY_EMBED_LOAD_FLAGS_NONE = 1 << 0, + EPHY_EMBED_LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP = 1 << 1, +} EphyEmbedLoadFlags; + #define EPHY_EMBED_CHROME_ALL (EPHY_EMBED_CHROME_MENUBAR | \ EPHY_EMBED_CHROME_TOOLBAR | \ EPHY_EMBED_CHROME_STATUSBAR | \ @@ -157,6 +163,10 @@ struct _EphyEmbedIface /* Methods */ void (* load_url) (EphyEmbed *embed, const char *url); + void (* load) (EphyEmbed *embed, + const char *url, + EphyEmbedLoadFlags flags, + EphyEmbed *referring_embed); void (* stop_load) (EphyEmbed *embed); void (* reload) (EphyEmbed *embed, gboolean force); @@ -232,6 +242,10 @@ GType ephy_embed_get_type (void); /* Base */ void ephy_embed_load_url (EphyEmbed *embed, const char *url); +void ephy_embed_load (EphyEmbed *embed, + const char *url, + EphyEmbedLoadFlags flags, + EphyEmbed *referring_embed); void ephy_embed_stop_load (EphyEmbed *embed); Index: embed/ephy-embed.c =================================================================== RCS file: /cvs/gnome/epiphany/embed/ephy-embed.c,v retrieving revision 1.73 diff -p -u -b -r1.73 ephy-embed.c --- embed/ephy-embed.c 13 Sep 2006 11:34:13 -0000 1.73 +++ embed/ephy-embed.c 5 Oct 2006 20:08:17 -0000 @@ -423,6 +423,25 @@ ephy_embed_load_url (EphyEmbed *embed, } /** + * ephy_embed_load: + * @embed: an #EphyEmbed + * @url: an URL + * @flags: flags modifying load behaviour + * @previous_embed: the referrer embed or %NULL + * + * Loads a new web page in @embed. + **/ +void +ephy_embed_load (EphyEmbed *embed, + const char *url, + EphyEmbedLoadFlags flags, + EphyEmbed *referring_embed) +{ + EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed); + iface->load (embed, url, flags, referring_embed); +} + +/** * ephy_embed_stop_load: * @embed: an #EphyEmbed * Index: src/ephy-link.h =================================================================== RCS file: /cvs/gnome/epiphany/src/ephy-link.h,v retrieving revision 1.4 diff -p -u -b -r1.4 ephy-link.h --- src/ephy-link.h 13 Sep 2006 11:34:22 -0000 1.4 +++ src/ephy-link.h 5 Oct 2006 20:08:21 -0000 @@ -41,7 +41,8 @@ typedef enum { EPHY_LINK_NEW_WINDOW = 1 << 0, EPHY_LINK_NEW_TAB = 1 << 1, - EPHY_LINK_JUMP_TO = 1 << 2 + EPHY_LINK_JUMP_TO = 1 << 2, + EPHY_LINK_ALLOW_FIXUP = 1 << 3 } EphyLinkFlags; struct _EphyLinkIface Index: src/ephy-location-action.c =================================================================== RCS file: /cvs/gnome/epiphany/src/ephy-location-action.c,v retrieving revision 1.47 diff -p -u -b -r1.47 ephy-location-action.c --- src/ephy-location-action.c 13 Sep 2006 11:34:22 -0000 1.47 +++ src/ephy-location-action.c 5 Oct 2006 20:08:21 -0000 @@ -139,7 +139,7 @@ action_activated_cb (GtkEntryCompletion if (url == NULL) return; ephy_link_open (EPHY_LINK (action), url, NULL, - ephy_link_flags_from_current_event ()); + ephy_link_flags_from_current_event () | EPHY_LINK_ALLOW_FIXUP); g_free (url); } @@ -162,7 +162,7 @@ entry_activate_cb (GtkEntry *entry, g_return_if_fail (address != NULL); ephy_link_open (EPHY_LINK (action), address, NULL, - ephy_link_flags_from_current_event ()); + ephy_link_flags_from_current_event () | EPHY_LINK_ALLOW_FIXUP); g_free (address); } Index: src/ephy-window.c =================================================================== RCS file: /cvs/gnome/epiphany/src/ephy-window.c,v retrieving revision 1.360 diff -p -u -b -r1.360 ephy-window.c --- src/ephy-window.c 24 Sep 2006 19:59:37 -0000 1.360 +++ src/ephy-window.c 5 Oct 2006 20:08:25 -0000 @@ -2970,7 +2970,9 @@ ephy_window_open_link (EphyLink *link, tab = ephy_window_get_active_tab (window); } - if (flags != 0) + if (flags & (EPHY_LINK_JUMP_TO | + EPHY_LINK_NEW_TAB | + EPHY_LINK_NEW_WINDOW)) { EphyNewTabFlags ntflags = EPHY_NEW_TAB_OPEN_PAGE; @@ -2987,6 +2989,10 @@ ephy_window_open_link (EphyLink *link, { ntflags |= EPHY_NEW_TAB_IN_EXISTING_WINDOW; } + if (flags & EPHY_LINK_ALLOW_FIXUP) + { + ntflags |= EPHY_NEW_TAB_ALLOW_FIXUP; + } new_tab = ephy_shell_new_tab (ephy_shell, @@ -2999,7 +3005,17 @@ ephy_window_open_link (EphyLink *link, embed = ephy_tab_get_embed (tab); + if (flags & EPHY_LINK_ALLOW_FIXUP) + { + ephy_embed_load (embed, + address, + EPHY_EMBED_LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP, + NULL); + } + else + { ephy_embed_load_url (embed, address); + } if (address == NULL || address[0] == '\0' || strcmp (address, "about:blank") == 0) { Index: src/ephy-shell.c =================================================================== RCS file: /cvs/gnome/epiphany/src/ephy-shell.c,v retrieving revision 1.146 diff -p -u -b -r1.146 ephy-shell.c --- src/ephy-shell.c 13 Sep 2006 11:34:23 -0000 1.146 +++ src/ephy-shell.c 5 Oct 2006 20:08:26 -0000 @@ -530,8 +530,20 @@ ephy_shell_new_tab_full (EphyShell *shel } else if (flags & EPHY_NEW_TAB_OPEN_PAGE) { + EphyEmbedLoadFlags load_flags = 0; + g_assert (url != NULL); - ephy_embed_load_url (embed, url); + + if (flags & EPHY_NEW_TAB_ALLOW_FIXUP) + { + load_flags = EPHY_EMBED_LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP; + } + else + { + load_flags = EPHY_EMBED_LOAD_FLAGS_NONE; + } + ephy_embed_load (embed, url, load_flags, previous_embed); + is_empty = url_is_empty (url); } Index: src/ephy-shell.h =================================================================== RCS file: /cvs/gnome/epiphany/src/ephy-shell.h,v retrieving revision 1.39 diff -p -u -b -r1.39 ephy-shell.h --- src/ephy-shell.h 13 Sep 2006 11:34:23 -0000 1.39 +++ src/ephy-shell.h 5 Oct 2006 20:08:26 -0000 @@ -62,6 +62,10 @@ typedef enum EPHY_NEW_TAB_JUMP = 1 << 9, EPHY_NEW_TAB_IN_NEW_WINDOW = 1 << 10, EPHY_NEW_TAB_IN_EXISTING_WINDOW = 1 << 11, + + /* The way to load */ + EPHY_NEW_TAB_ALLOW_FIXUP = 1 << 12, + } EphyNewTabFlags; struct _EphyShell