зеркало из https://github.com/mozilla/pjs.git
add the ability to interrupt a uri load
This commit is contained in:
Родитель
5d9b6efc32
Коммит
38db325e85
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче