add the ability to interrupt a uri load

This commit is contained in:
blizzard%redhat.com 2000-05-17 06:44:59 +00:00
Родитель 5d9b6efc32
Коммит 38db325e85
6 изменённых файлов: 76 добавлений и 1 удалений

Просмотреть файл

@ -71,6 +71,8 @@ GtkMozEmbedChrome::GtkMozEmbedChrome()
mProgressCBData = nsnull;
mNetCB = nsnull;
mNetCBData = nsnull;
mOpenCB = nsnull;
mOpenCBData = nsnull;
mBounds.x = 0;
mBounds.y = 0;
mBounds.width = 0;
@ -193,6 +195,14 @@ NS_IMETHODIMP GtkMozEmbedChrome::SetNetCallback (GtkMozEmbedNetCB *aCallback, vo
return NS_OK;
}
NS_IMETHODIMP GtkMozEmbedChrome::SetStartOpenCallback (GtkMozEmbedStartOpenCB *aCallback, void *aData)
{
PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::SetStartOpenCallback\n"));
mOpenCB = aCallback;
mOpenCBData = aData;
return NS_OK;
}
NS_IMETHODIMP GtkMozEmbedChrome::GetLinkMessage (char **retval)
{
PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::GetLinkMessage\n"));
@ -515,7 +525,25 @@ NS_IMETHODIMP GtkMozEmbedChrome::ShowAsModal(void)
NS_IMETHODIMP GtkMozEmbedChrome::OnStartURIOpen(nsIURI *aURI, const char *aWindowTarget, PRBool *aAbortOpen)
{
PR_LOG(mozEmbedLm, PR_LOG_DEBUG, ("GtkMozEmbedChrome::OnStartURIOpen\n"));
return NS_ERROR_NOT_IMPLEMENTED;
NS_ENSURE_ARG_POINTER(aAbortOpen);
NS_ENSURE_ARG_POINTER(aURI);
char *specString = NULL;
nsCAutoString autoString;
nsresult rv;
rv = aURI->GetSpec(&specString);
if (NS_FAILED(rv))
return rv;
autoString = specString;
if (mOpenCB)
{
*aAbortOpen = mOpenCB(autoString, mOpenCBData);
return NS_OK;
}
else
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP GtkMozEmbedChrome::GetProtocolHandler(nsIURI *aURI, nsIProtocolHandler **aProtocolHandler)

Просмотреть файл

@ -71,6 +71,7 @@ public:
NS_IMETHOD SetTitleChangeCallback (GtkMozEmbedTitleCB *aCallback, void *aData);
NS_IMETHOD SetProgressCallback (GtkMozEmbedProgressCB *aCallback, void *aData);
NS_IMETHOD SetNetCallback (GtkMozEmbedNetCB *aCallback, void *aData);
NS_IMETHOD SetStartOpenCallback (GtkMozEmbedStartOpenCB *aCallback, void *aData);
NS_IMETHOD GetLinkMessage (char **retval);
NS_IMETHOD GetJSStatus (char **retval);
NS_IMETHOD GetLocation (char **retval);
@ -112,6 +113,8 @@ private:
void *mProgressCBData;
GtkMozEmbedNetCB *mNetCB;
void *mNetCBData;
GtkMozEmbedStartOpenCB *mOpenCB;
void *mOpenCBData;
nsRect mBounds;
PRBool mVisibility;
nsXPIDLCString mLinkMessage;

Просмотреть файл

@ -59,6 +59,7 @@ enum {
NEW_WINDOW,
VISIBILITY,
DESTROY_BROWSER,
OPEN_URI,
LAST_SIGNAL
};
@ -128,6 +129,9 @@ gtk_moz_embed_handle_visibility(PRBool aVisibility, void *aData);
static void
gtk_moz_embed_handle_destroy(void *aData);
static PRBool
gtk_moz_embed_handle_open_uri(const char *aURI, void *aData);
static GtkBinClass *parent_class;
static PRBool NS_SetupRegistryCalled = PR_FALSE;
@ -295,6 +299,13 @@ gtk_moz_embed_class_init(GtkMozEmbedClass *klass)
GTK_SIGNAL_OFFSET(GtkMozEmbedClass, destroy_brsr),
gtk_marshal_NONE__NONE,
GTK_TYPE_NONE, 0);
moz_embed_signals[OPEN_URI] =
gtk_signal_new("open_uri",
GTK_RUN_LAST,
object_class->type,
GTK_SIGNAL_OFFSET(GtkMozEmbedClass, open_uri),
gtk_marshal_BOOL__POINTER,
GTK_TYPE_BOOL, 1, GTK_TYPE_POINTER);
gtk_object_class_add_signals(object_class, moz_embed_signals, LAST_SIGNAL);
@ -346,6 +357,7 @@ gtk_moz_embed_init(GtkMozEmbed *embed)
embed_private->embed->SetNewBrowserCallback(gtk_moz_embed_handle_new_window, embed);
embed_private->embed->SetVisibilityCallback(gtk_moz_embed_handle_visibility, embed);
embed_private->embed->SetDestroyCallback(gtk_moz_embed_handle_destroy, embed);
embed_private->embed->SetStartOpenCallback(gtk_moz_embed_handle_open_uri, embed);
// get our hands on a copy of the nsIWebNavigation interface for later
embed_private->navigation = do_QueryInterface(embed_private->webBrowser);
g_return_if_fail(embed_private->navigation);
@ -894,3 +906,13 @@ gtk_moz_embed_handle_destroy(void *aData)
g_return_if_fail(GTK_IS_MOZ_EMBED(embed));
gtk_signal_emit(GTK_OBJECT(embed), moz_embed_signals[DESTROY_BROWSER]);
}
static PRBool
gtk_moz_embed_handle_open_uri(const char *aURI, void *aData)
{
GtkMozEmbed *embed = (GtkMozEmbed *)aData;
gint return_val = PR_FALSE;
g_return_val_if_fail(GTK_IS_MOZ_EMBED(embed), PR_FALSE);
gtk_signal_emit(GTK_OBJECT(embed), moz_embed_signals[OPEN_URI], aURI, &return_val);
return return_val;
}

Просмотреть файл

@ -59,6 +59,7 @@ struct _GtkMozEmbedClass
void (* new_window) (GtkMozEmbed *embed, GtkMozEmbed **newEmbed, guint chromemask);
void (* visibility) (GtkMozEmbed *embed, gboolean visibility);
void (* destroy_brsr) (GtkMozEmbed *embed);
gint (* open_uri) (GtkMozEmbed *embed, const char *aURI);
};
extern GtkType gtk_moz_embed_get_type (void);

Просмотреть файл

@ -41,6 +41,7 @@ typedef void (GtkMozEmbedTitleCB) (void *aData);
typedef void (GtkMozEmbedProgressCB) (void *aData, PRInt32 aProgressTotal,
PRInt32 aProgressCurrent);
typedef void (GtkMozEmbedNetCB) (void *aData, PRInt32 aFlags);
typedef PRBool (GtkMozEmbedStartOpenCB) (const char *aURI, void *aData);
class nsIGtkEmbed : public nsISupports
{
@ -58,6 +59,7 @@ public:
NS_IMETHOD SetTitleChangeCallback (GtkMozEmbedTitleCB *aCallback, void *aData) = 0;
NS_IMETHOD SetProgressCallback (GtkMozEmbedProgressCB *aCallback, void *aData) = 0;
NS_IMETHOD SetNetCallback (GtkMozEmbedNetCB *aCallback, void *aData) = 0;
NS_IMETHOD SetStartOpenCallback (GtkMozEmbedStartOpenCB *aCallback, void *aData) = 0;
NS_IMETHOD GetLinkMessage (char **retval) = 0;
NS_IMETHOD GetJSStatus (char **retval) = 0;
NS_IMETHOD GetLocation (char **retval) = 0;

Просмотреть файл

@ -74,6 +74,7 @@ static void new_window_cb (GtkMozEmbed *embed, GtkMozEmbed **retval, guin
TestGtkBrowser *browser);
static void visibility_cb (GtkMozEmbed *embed, gboolean visibility, TestGtkBrowser *browser);
static void destroy_brsr_cb (GtkMozEmbed *embed, TestGtkBrowser *browser);
static gint open_uri_cb (GtkMozEmbed *embed, const char *uri, TestGtkBrowser *browser);
// some utility functions
static void update_status_bar_text (TestGtkBrowser *browser);
@ -245,8 +246,14 @@ new_gtk_browser(guint32 chromeMask)
// hookup to any requested visibility changes
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "visibility",
GTK_SIGNAL_FUNC(visibility_cb), browser);
// hookup to the signal that says that the browser requested to be
// destroyed
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "destroy_browser",
GTK_SIGNAL_FUNC(destroy_brsr_cb), browser);
// hookup to the signal that is called when someone clicks on a link
// to load a new uri
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "open_uri",
GTK_SIGNAL_FUNC(open_uri_cb), browser);
// hookup to when the window is destroyed
gtk_signal_connect(GTK_OBJECT(browser->mozEmbed), "destroy",
GTK_SIGNAL_FUNC(destroy_cb), browser);
@ -499,6 +506,18 @@ destroy_brsr_cb (GtkMozEmbed *embed, TestGtkBrowser *browser)
gtk_widget_destroy(browser->topLevelWindow);
}
gint
open_uri_cb (GtkMozEmbed *embed, const char *uri, TestGtkBrowser *browser)
{
g_print("open_uri_cb %s\n", uri);
// interrupt this test load
if (!strcmp(uri, "http://people.redhat.com/blizzard/monkeys.txt"))
return TRUE;
// don't interrupt anything
return FALSE;
}
// utility functions
void