From eeb7be1cbf8069cc1304dac4136e7c2090d49e89 Mon Sep 17 00:00:00 2001 From: Michael Drake Date: Mon, 23 Jul 2018 11:08:15 +0100 Subject: [PATCH] Browser: Add function to get bw URL with any fragment. This returns a ref to the URL. --- desktop/browser.c | 30 ++++++++++++++++++++++++++++++ include/netsurf/browser_window.h | 13 +++++++++++++ 2 files changed, 43 insertions(+) diff --git a/desktop/browser.c b/desktop/browser.c index 84f6681c8..1c8aa95fa 100644 --- a/desktop/browser.c +++ b/desktop/browser.c @@ -2267,6 +2267,36 @@ nsurl* browser_window_access_url(struct browser_window *bw) return corestring_nsurl_about_blank; } +/* Exported interface, documented in include/netsurf/browser_window.h */ +nserror browser_window_get_url( + struct browser_window *bw, + bool fragment, + nsurl** url_out) +{ + nserror err; + nsurl *url; + + assert(bw != NULL); + + if (!fragment || bw->frag_id == NULL || bw->loading_content != NULL) { + /* If there's a loading content, then the bw->frag_id will have + * been trampled, possibly with a new frag_id, but we will + * still be returning the current URL, so in this edge case + * we just drop any fragment. */ + url = nsurl_ref(browser_window_access_url(bw)); + + } else { + err = nsurl_refragment(browser_window_access_url(bw), + bw->frag_id, &url); + if (err != NSERROR_OK) { + return err; + } + } + + *url_out = url; + return NSERROR_OK; +} + /* Exported interface, documented in browser.h */ const char* browser_window_get_title(struct browser_window *bw) { diff --git a/include/netsurf/browser_window.h b/include/netsurf/browser_window.h index c3ff7997e..439b0785d 100644 --- a/include/netsurf/browser_window.h +++ b/include/netsurf/browser_window.h @@ -209,6 +209,19 @@ nserror browser_window_navigate_up(struct browser_window *bw, bool new_window); */ struct nsurl* browser_window_access_url(struct browser_window *bw); +/** + * Access a browser window's URL. + * + * \param[in] bw browser window + * \param[in] fragment Whether to include any URL fragment. + * \param[out] url_out Returns a ref to the URL on success. + * \return NSERROR_OK, or appropriate error otherwise. + */ +nserror browser_window_get_url( + struct browser_window *bw, + bool fragment, + struct nsurl** url_out); + /** * Get the title of a browser_window. *