diff -r 9d82957f8d6a src/html.cc
--- a/src/html.cc Thu Sep 03 18:42:54 2009 +0000
+++ b/src/html.cc Sun Sep 06 22:52:31 2009 +0000
@@ -197,13 +197,23 @@ static void Html_free(void *data)
}
/*
- * Used by the "Load images" page menuitem.
- */
-void a_Html_load_images(void *v_html, DilloUrl *pattern)
+ * Used by the "Load image" image menuitem.
+ */
+void a_Html_load_image(void *v_html, const DilloUrl *url)
{
DilloHtml *html = (DilloHtml*)v_html;
- html->loadImages(pattern);
+ html->loadImages(url, "same url");
+}
+
+/*
+ * Used by the "Autoload images" tools menu item
+ */
+void a_Html_load_images(void *v_html)
+{
+ DilloHtml *html = (DilloHtml*)v_html;
+
+ html->loadImages(html->page_url, prefs.load_images);
}
/*
@@ -662,18 +672,70 @@ bool_t DilloHtml::unloadedImages()
return FALSE;
}
+/* TODO: clean up, make understandable :) */
+static bool Html_domain_match(const DilloUrl *page, const DilloUrl *image)
+{
+ const char *page_str = URL_HOST(page),
+ *img_str = URL_HOST(image);
+ uint_t page_strlen = strlen(page_str);
+
+ MSG("Html_domain_match:\n%s\n%s\n", page_str, img_str);
+ if (isalpha(page_str[page_strlen - 1])) {
+ /* For IP addrs, match fully. For hostnames, let's say for now that
+ * if you have two dots, we will ignore what's before the first dot.
+ */
+ char *dot = strchr(page_str, '.');
+
+ if (dot && strchr(dot + 1, '.')) {
+ page_strlen -= dot + 1 - page_str;
+ page_str = dot + 1;
+ }
+ uint_t img_strlen = strlen(img_str);
+
+ if (img_strlen < page_strlen) {
+ MSG("FAIL\n");
+ return false;
+ } else {
+ if (img_strlen > page_strlen &&
+ img_str[img_strlen - page_strlen - 1] == '.') {
+ img_str += img_strlen - page_strlen;
+ }
+ }
+ }
+ bool ret = dStrcasecmp(page_str, img_str) == 0;
+ if (ret)
+ MSG("MATCH\n");
+ else
+ MSG("FAIL\n");
+ return ret;
+
+ /* I guess a dot suffix would foil this, but it's not worth worrying
+ * about for the moment
+ */
+}
+
/*
* Load images if they were disabled.
*/
-void DilloHtml::loadImages (const DilloUrl *pattern)
+void DilloHtml::loadImages (const DilloUrl *url, const char *strictness)
{
dReturn_if_fail (bw->nav_expecting == FALSE);
for (int i = 0; i < images->size(); i++) {
- if (images->get(i)->image) {
- if ((!pattern) || (!a_Url_cmp(images->get(i)->url, pattern))) {
- Html_load_image(bw, images->get(i)->url, images->get(i)->image);
- a_Image_unref (images->get(i)->image);
+ DilloImage *image;
+ DilloUrl *url2;
+
+ if ((image = images->get(i)->image)) {
+ url2 = images->get(i)->url;
+ if (!dStrcasecmp(strictness, "yes") ||
+ (!dStrcasecmp(strictness, "same url") &&
+ !a_Url_cmp(url, url2)) ||
+ (!dStrcasecmp(strictness, "same host") &&
+ !dStrcasecmp(URL_HOST(url), URL_HOST(url2))) ||
+ (!dStrcasecmp(strictness, "same domain") &&
+ Html_domain_match(url, url2))) {
+ Html_load_image(bw, url2, image);
+ a_Image_unref (image);
images->get(i)->image = NULL; // web owns it now
}
}
@@ -755,8 +817,7 @@ bool DilloHtml::HtmlLinkReceiver::click
// clicked an image that has not already been loaded
if (event->button == 1){
// load all instances of this image
- DilloUrl *pattern = html->images->get(img)->url;
- html->loadImages(pattern);
+ html->loadImages(html->images->get(img)->url, "same url");
return true;
}
}
@@ -1970,6 +2031,18 @@ static void Html_tag_open_address(DilloH
HT2TB(html)->addParbreak (9, html->styleEngine->wordStyle ());
}
+static bool Html_autoload_image(const DilloUrl *page_url,
+ const DilloUrl *image_url)
+{
+ if (dStrcasecmp(prefs.load_images, "yes") == 0)
+ return true;
+ if (dStrcasecmp(prefs.load_images, "same host") == 0)
+ return (dStrcasecmp(URL_HOST(page_url), URL_HOST(image_url)) == 0);
+ if (dStrcasecmp(prefs.load_images, "same domain") == 0)
+ return Html_domain_match(page_url, image_url);
+ return false;
+}
+
/*
* Read image-associated tag attributes and create new image.
*/
@@ -1989,8 +2062,11 @@ DilloImage *a_Html_image_new(DilloHtml *
// (attrbuf = a_Html_get_attr(html, tag, tagsize, "title")))
// style_attrs->x_tooltip = a_Dw_tooltip_new_no_ref(attrbuf);
+ load_now = Html_autoload_image(html->page_url, url) ||
+ (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached);
+
alt_ptr = a_Html_get_attr_wdef(html, tag, tagsize, "alt", NULL);
- if ((!alt_ptr || !*alt_ptr) && !prefs.load_images) {
+ if (!load_now && (!alt_ptr || !*alt_ptr)) {
dFree(alt_ptr);
alt_ptr = dStrdup("[IMG]"); // Place holder for img_off mode
}
@@ -2098,8 +2174,6 @@ DilloImage *a_Html_image_new(DilloHtml *
if (HT2TB(html)->getBgColor())
Image->bg_color = HT2TB(html)->getBgColor()->getColor();
- load_now = prefs.load_images ||
- (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached);
Html_add_new_linkimage(html, &url, load_now ? NULL : Image);
if (load_now)
Html_load_image(html->bw, url, Image);
diff -r 9d82957f8d6a src/html.hh
--- a/src/html.hh Thu Sep 03 18:42:54 2009 +0000
+++ b/src/html.hh Sun Sep 06 22:52:31 2009 +0000
@@ -10,7 +10,8 @@ extern "C" {
/*
* Exported functions
*/
-void a_Html_load_images(void *v_html, DilloUrl *pattern);
+void a_Html_load_image(void *v_html, const DilloUrl *url);
+void a_Html_load_images(void *v_html);
void a_Html_form_submit(void *v_html, void *v_form);
void a_Html_form_reset(void *v_html, void *v_form);
void a_Html_form_display_hiddens(void *v_html, void *v_form, bool_t display);
diff -r 9d82957f8d6a src/html_common.hh
--- a/src/html_common.hh Thu Sep 03 18:42:54 2009 +0000
+++ b/src/html_common.hh Sun Sep 06 22:52:31 2009 +0000
@@ -209,7 +209,7 @@ public:
DilloHtmlEnc enc, const char *charset);
DilloHtmlForm *getCurrentForm ();
bool_t unloadedImages();
- void loadImages (const DilloUrl *pattern);
+ void loadImages (const DilloUrl *url, const char *strictness);
void addCssUrl(const DilloUrl *url);
};
diff -r 9d82957f8d6a src/menu.cc
--- a/src/menu.cc Thu Sep 03 18:42:54 2009 +0000
+++ b/src/menu.cc Sun Sep 06 22:52:31 2009 +0000
@@ -192,15 +192,15 @@ static void Menu_view_page_bugs_cb(Widge
}
/*
- * Load images on current page that match URL pattern
- */
-static void Menu_load_images_cb(Widget*, void *user_data)
+ * Load image on current page that match URL pattern
+ */
+static void Menu_load_image_cb(Widget*, void *user_data)
{
DilloUrl *page_url = (DilloUrl *) user_data;
void *doc = a_Bw_get_url_doc(popup_bw, page_url);
if (doc)
- a_Html_load_images(doc, popup_url);
+ a_Html_load_image(doc, popup_url);
}
/*
@@ -473,7 +473,7 @@ void a_Menu_image_popup(BrowserWindow *b
i->callback(Menu_open_url_nt_cb);
new Divider();
i = load_img_menuitem = new Item("Load image");
- i->callback(Menu_load_images_cb);
+ i->callback(Menu_load_image_cb);
i = new Item("Bookmark this Image");
i->callback(Menu_add_bookmark_cb);
i = new Item("Copy Image location");
@@ -674,16 +674,23 @@ static void Menu_embedded_css_cb(Widget
}
/*
- * Toggle loading of images -- and load them if enabling.
- */
-static void Menu_imgload_toggle_cb(Widget *wid)
-{
- if ((prefs.load_images = wid->state() ? 1 : 0)) {
+ * Change setting for loading images -- and load them if enabled.
+ */
+static void Menu_imgload_cb(Widget *wid)
+{
+ char *parent_label = dStrconcat("Autoload images: ", wid->label(), NULL);
+
+ dFree((char *)wid->parent()->label());
+ wid->parent()->label(parent_label);
+
+ dFree(prefs.load_images);
+ prefs.load_images = dStrdup(wid->label());
+
+ if (dStrcasecmp(wid->label(), "no")) {
void *doc = a_Bw_get_current_doc(popup_bw);
if (doc) {
- DilloUrl *pattern = NULL;
- a_Html_load_images(doc, pattern);
+ a_Html_load_images(doc);
}
}
}
@@ -710,9 +717,21 @@ void a_Menu_tools_popup(BrowserWindow *b
it->callback(Menu_embedded_css_cb);
it->state(prefs.parse_embedded_css);
new Divider();
- it = new ToggleItem("Load images");
- it->callback(Menu_imgload_toggle_cb);
- it->state(prefs.load_images);
+
+ char *label = dStrconcat("Autoload images: ", prefs.load_images, NULL);
+ ItemGroup *ig = new ItemGroup(label);
+ it = new Item("yes");
+ it->callback(Menu_imgload_cb);
+ ig->add(it);
+ it = new Item("same domain");
+ it->callback(Menu_imgload_cb);
+ ig->add(it);
+ it = new Item("same host");
+ it->callback(Menu_imgload_cb);
+ ig->add(it);
+ it = new Item("no");
+ it->callback(Menu_imgload_cb);
+ ig->add(it);
pm->type(PopupMenu::POPUP13);
pm->end();
}
diff -r 9d82957f8d6a src/prefs.c
--- a/src/prefs.c Thu Sep 03 18:42:54 2009 +0000
+++ b/src/prefs.c Sun Sep 06 22:52:32 2009 +0000
@@ -22,6 +22,7 @@
#define PREFS_NO_PROXY "localhost 127.0.0.1"
#define PREFS_SAVE_DIR "/tmp/"
#define PREFS_HTTP_REFERER "host"
+#define PREFS_LOAD_IMAGES "yes"
/*-----------------------------------------------------------------------------
* Global Data
@@ -61,7 +62,7 @@ void a_Prefs_init(void)
prefs.http_proxyuser = NULL;
prefs.http_referer = dStrdup(PREFS_HTTP_REFERER);
prefs.limit_text_width = FALSE;
- prefs.load_images=TRUE;
+ prefs.load_images = dStrdup(PREFS_LOAD_IMAGES);
prefs.load_stylesheets=TRUE;
prefs.middle_click_drags_page = TRUE;
prefs.middle_click_opens_new_tab = TRUE;
@@ -107,6 +108,7 @@ void a_Prefs_freeall(void)
a_Url_free(prefs.http_proxy);
dFree(prefs.http_proxyuser);
dFree(prefs.http_referer);
+ dFree(prefs.load_images);
dFree(prefs.no_proxy);
dFree(prefs.save_dir);
dFree(prefs.search_url);
diff -r 9d82957f8d6a src/prefs.h
--- a/src/prefs.h Thu Sep 03 18:42:54 2009 +0000
+++ b/src/prefs.h Sun Sep 06 22:52:32 2009 +0000
@@ -65,7 +65,7 @@ struct _DilloPrefs {
bool_t show_search;
bool_t show_progress_box;
bool_t fullwindow_start;
- bool_t load_images;
+ char *load_images;
bool_t load_stylesheets;
bool_t parse_embedded_css;
int32_t buffered_drawing;
diff -r 9d82957f8d6a src/prefsparser.cc
--- a/src/prefsparser.cc Thu Sep 03 18:42:54 2009 +0000
+++ b/src/prefsparser.cc Sun Sep 06 22:52:32 2009 +0000
@@ -67,7 +67,7 @@ int PrefsParser::parseOption(char *name,
{ "http_proxyuser", &prefs.http_proxyuser, PREFS_STRING },
{ "http_referer", &prefs.http_referer, PREFS_STRING },
{ "limit_text_width", &prefs.limit_text_width, PREFS_BOOL },
- { "load_images", &prefs.load_images, PREFS_BOOL },
+ { "load_images", &prefs.load_images, PREFS_STRING },
{ "load_stylesheets", &prefs.load_stylesheets, PREFS_BOOL },
{ "middle_click_drags_page", &prefs.middle_click_drags_page,
PREFS_BOOL },