/** * Callback for defer scripts */ static nserror convert_script_defer_cb(hlcache_handle *script, const hlcache_event *event, void *pw) { html_content *parent = pw; unsigned int i; struct html_script *s; /* Find script */ for (i = 0, s = parent->scripts; i != parent->scripts_count; i++, s++) { if (s->type == HTML_SCRIPT_DEFER && s->data.handle == script) break; } assert(i != parent->scripts_count); switch (event->type) { case CONTENT_MSG_DONE: LOG(("script %d done '%s'", i, nsurl_access(hlcache_handle_get_url(script)))); parent->base.active--; LOG(("%d fetches active", parent->base.active)); break; case CONTENT_MSG_ERROR: LOG(("script %s failed: %s", nsurl_access(hlcache_handle_get_url(script)), event->data.error)); hlcache_handle_release(script); s->data.handle = NULL; parent->base.active--; LOG(("%d fetches active", parent->base.active)); content_add_error(&parent->base, "?", 0); break; default: break; } /* if there are no active fetches remaining begin post parse * conversion */ if (html_can_begin_conversion(parent)) { html_begin_conversion(parent); } return NSERROR_OK; }
static nserror html_convert_css_callback(hlcache_handle *css, const hlcache_event *event, void *pw) { html_content *parent = pw; unsigned int i; struct html_stylesheet *s; /* Find sheet */ for (i = 0, s = parent->stylesheets; i != parent->stylesheet_count; i++, s++) { if (s->sheet == css) break; } assert(i != parent->stylesheet_count); switch (event->type) { case CONTENT_MSG_DONE: LOG("done stylesheet slot %d '%s'", i, nsurl_access(hlcache_handle_get_url(css))); parent->base.active--; LOG("%d fetches active", parent->base.active); break; case CONTENT_MSG_ERROR: LOG("stylesheet %s failed: %s", nsurl_access(hlcache_handle_get_url(css)), event->data.error); hlcache_handle_release(css); s->sheet = NULL; parent->base.active--; LOG("%d fetches active", parent->base.active); content_add_error(&parent->base, "?", 0); break; case CONTENT_MSG_POINTER: /* Really don't want this to continue after the switch */ return NSERROR_OK; default: break; } if (html_can_begin_conversion(parent)) { html_begin_conversion(parent); } return NSERROR_OK; }
static void ami_menu_item_hotlist_add(struct Hook *hook, APTR window, struct IntuiMessage *msg) { struct browser_window *bw; struct gui_window_2 *gwin; GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin); bw = gwin->bw; if (bw == NULL || bw->current_content == NULL || nsurl_access(hlcache_handle_get_url(bw->current_content)) == NULL) return; hotlist_add_url(hlcache_handle_get_url(bw->current_content)); ami_gui_update_hotlist_button(gwin); }
static bool save_complete_inventory(save_complete_ctx *ctx) { FILE *fp; bool error; save_complete_entry *entry; char fullpath[PATH_MAX]; strncpy(fullpath, ctx->path, sizeof fullpath); error = path_add_part(fullpath, sizeof fullpath, "Inventory"); if (error == false) { warn_user("NoMemory", NULL); return false; } fp = fopen(fullpath, "w"); if (fp == NULL) { LOG(("fopen(): errno = %i", errno)); warn_user("SaveError", strerror(errno)); return false; } for (entry = ctx->list; entry != NULL; entry = entry->next) { fprintf(fp, "%p %s\n", entry->content, nsurl_access(hlcache_handle_get_url( entry->content))); } fclose(fp); return true; }
static bool save_complete_inventory(save_complete_ctx *ctx) { nserror ret; FILE *fp; char *fname = NULL; save_complete_entry *entry; ret = netsurf_mkpath(&fname, NULL, 2, ctx->path, "Inventory"); if (ret != NSERROR_OK) { return false; } fp = fopen(fname, "w"); free(fname); if (fp == NULL) { LOG("fopen(): errno = %i", errno); guit->misc->warning("SaveError", strerror(errno)); return false; } for (entry = ctx->list; entry != NULL; entry = entry->next) { fprintf(fp, "%p %s\n", entry->content, nsurl_access(hlcache_handle_get_url( entry->content))); } fclose(fp); return true; }
void gui_drag_save_object(gui_save_type save_type, hlcache_handle *c, struct gui_window *g) { wimp_pointer pointer; char icon_buf[20]; os_error *error; /* Close the save window because otherwise we need two contexts */ xwimp_create_menu(wimp_CLOSE_MENU, 0, 0); ro_gui_dialog_close(dialog_saveas); gui_save_sourcew = g->window; saving_from_dialog = false; error = xwimp_get_pointer_info(&pointer); if (error) { LOG(("xwimp_get_pointer_info: 0x%x: %s", error->errnum, error->errmess)); warn_user("WimpError", error->errmess); return; } ro_gui_save_set_state(c, save_type, nsurl_access(hlcache_handle_get_url(c)), save_leafname, LEAFNAME_MAX, icon_buf, sizeof(icon_buf)); gui_current_drag_type = GUI_DRAG_SAVE; ro_gui_drag_icon(pointer.pos.x, pointer.pos.y, icon_buf); }
static void __CDECL menu_add_bookmark(short item, short title, void *data) { LOG(("%s", __FUNCTION__)); if (input_window) { if( input_window->browser->bw->current_content != NULL ){ atari_hotlist_add_page( nsurl_access(hlcache_handle_get_url(input_window->browser->bw->current_content)), NULL ); } } }
static hlcache_handle *save_complete_ctx_find_content(save_complete_ctx *ctx, const nsurl *url) { save_complete_entry *entry; for (entry = ctx->list; entry != NULL; entry = entry->next) if (nsurl_compare(url, hlcache_handle_get_url(entry->content), NSURL_COMPLETE)) return entry->content; return NULL; }
static bool save_complete_save_stylesheet(save_complete_ctx *ctx, hlcache_handle *css) { const char *css_data; unsigned long css_size; char *source; unsigned long source_len; struct nscss_import *imports; uint32_t import_count; lwc_string *type; char filename[32]; bool result; if (save_complete_ctx_has_content(ctx, css)) return true; if (save_complete_ctx_add_content(ctx, css) == false) { warn_user("NoMemory", 0); return false; } imports = nscss_get_imports(css, &import_count); if (save_complete_save_imported_sheets(ctx, imports, import_count) == false) return false; css_data = content_get_source_data(css, &css_size); source = save_complete_rewrite_stylesheet_urls(ctx, css_data, css_size, hlcache_handle_get_url(css), &source_len); if (source == NULL) { warn_user("NoMemory", 0); return false; } type = content_get_mime_type(css); if (type == NULL) { free(source); return false; } snprintf(filename, sizeof filename, "%p", css); result = save_complete_save_buffer(ctx, filename, source, source_len, type); lwc_string_unref(type); free(source); return result; }
void ami_print(struct hlcache_handle *c, int copies) { double height; float scale = nsoption_int(print_scale) / 100.0; if(ami_print_info.msgport == NULL) ami_print_init(); #ifdef __amigaos4__ if(!(ami_print_info.PReq = (struct IODRPTagsReq *)AllocSysObjectTags(ASOT_IOREQUEST, ASOIOR_Size, sizeof(struct IODRPTagsReq), ASOIOR_ReplyPort, ami_print_info.msgport, ASO_NoTrack, FALSE, TAG_DONE))) return; #else if(!(ami_print_info.PReq = (struct IODRPTagsReq *)CreateIORequest(ami_print_info.msgport, sizeof(struct IODRPTagsReq)))) return; #endif if(OpenDevice("printer.device", nsoption_int(printer_unit), (struct IORequest *)ami_print_info.PReq, 0)) { amiga_warn_user("CompError","printer.device"); return; } ami_print_info.PD = (struct PrinterData *)ami_print_info.PReq->io_Device; ami_print_info.PED = &ami_print_info.PD->pd_SegmentData->ps_PED; ami_print_info.ps = print_make_settings(PRINT_DEFAULT, nsurl_access(hlcache_handle_get_url(c)), ami_layout_table); ami_print_info.ps->page_width = ami_print_info.PED->ped_MaxXDots; ami_print_info.ps->page_height = ami_print_info.PED->ped_MaxYDots; ami_print_info.ps->scale = scale; if(!print_set_up(c, &amiprinter, ami_print_info.ps, &height)) { amiga_warn_user("PrintError","print_set_up() returned false"); ami_print_close_device(); return; } height *= ami_print_info.ps->scale; ami_print_info.pages = height / ami_print_info.ps->page_height; ami_print_info.c = c; ami_print_progress(); while(ami_print_cont()); /* remove while() for async printing */ }
bool ami_easy_clipboard_svg(struct hlcache_handle *c) { const char *source_data; ULONG source_size; if(ami_mime_compare(c, "svg") == false) return false; if((source_data = content_get_source_data(c, &source_size)) == NULL) return false; if(!(OpenIFF(iffh,IFFF_WRITE))) { ami_svg_to_dr2d(iffh, source_data, source_size, nsurl_access(hlcache_handle_get_url(c))); CloseIFF(iffh); } return true; }
/** * Prepares the save box to reflect gui_save_type and a content, and * opens it. * * \param save_type type of save * \param h content to save * \param s selection to save * \param url url to be saved (link types) * \param title title (if any), when saving links */ void ro_gui_save_prepare(gui_save_type save_type, struct hlcache_handle *h, char *s, const nsurl *url, const char *title) { char name_buf[FILENAME_MAX]; size_t leaf_offset = 0; char icon_buf[20]; assert( (save_type == GUI_SAVE_LINK_URI) || (save_type == GUI_SAVE_LINK_URL) || (save_type == GUI_SAVE_LINK_TEXT) || (save_type == GUI_SAVE_HOTLIST_EXPORT_HTML) || (save_type == GUI_SAVE_HISTORY_EXPORT_HTML) || (save_type == GUI_SAVE_TEXT_SELECTION) || h); if (gui_save_selection == NULL) free(gui_save_selection); gui_save_selection = s; if (url != NULL) { gui_save_url = nsurl_access(url); } else { gui_save_url = NULL; } gui_save_title = title; if (save_dir) { leaf_offset = save_dir_len; memcpy(name_buf, save_dir, leaf_offset); name_buf[leaf_offset++] = '.'; } if (h != NULL) { url = hlcache_handle_get_url(h); } ro_gui_save_set_state(h, save_type, url, name_buf + leaf_offset, FILENAME_MAX - leaf_offset, icon_buf, sizeof(icon_buf)); ro_gui_set_icon_sprite(dialog_saveas, ICON_SAVE_ICON, saveas_area, icon_buf); ro_gui_set_icon_string(dialog_saveas, ICON_SAVE_PATH, name_buf, true); ro_gui_wimp_event_memorise(dialog_saveas); }
void ami_file_save_req(int type, struct gui_window_2 *gwin, struct hlcache_handle *object) { char *fname = AllocVecTags(1024, NULL); if(AslRequestTags(savereq, ASLFR_Window, gwin->win, ASLFR_SleepWindow, TRUE, ASLFR_TitleText, messages_get("NetSurf"), ASLFR_Screen, scrn, ASLFR_InitialFile, object ? FilePart(nsurl_access(hlcache_handle_get_url(object))) : "", TAG_DONE)) { strlcpy(fname, savereq->fr_Drawer, 1024); AddPart(fname, savereq->fr_File, 1024); ami_file_save(type, fname, gwin->win, object, gwin->bw->window->favicon, gwin->bw); } if(fname) FreeVec(fname); }
static void ami_menu_item_edit_copy(struct Hook *hook, APTR window, struct IntuiMessage *msg) { struct bitmap *bm; struct gui_window_2 *gwin; GetAttr(WINDOW_UserData, (Object *)window, (ULONG *)&gwin); if(content_get_type(gwin->bw->current_content) <= CONTENT_CSS) { browser_window_key_press(gwin->bw, KEY_COPY_SELECTION); browser_window_key_press(gwin->bw, KEY_CLEAR_SELECTION); } else if(bm = content_get_bitmap(gwin->bw->current_content)) { bm->url = (char *)nsurl_access(hlcache_handle_get_url(gwin->bw->current_content)); bm->title = (char *)content_get_title(gwin->bw->current_content); ami_easy_clipboard_bitmap(bm); } #ifdef WITH_NS_SVG else if(ami_mime_compare(gwin->bw->current_content, "svg") == true) { ami_easy_clipboard_svg(gwin->bw->current_content); } #endif }
/** * Recursively redraw a history_entry. * * \param history history containing the entry * \param entry entry to render * \param x0 area top left x coordinate * \param y0 area top left y coordinate * \param x1 area bottom right x coordinate * \param y1 area bottom right y coordinate * \param x window x offset * \param y window y offset * \param clip clip redraw * \param ctx current redraw context */ static bool browser_window_history__redraw_entry(struct history *history, struct history_entry *entry, int x0, int y0, int x1, int y1, int x, int y, bool clip, const struct redraw_context *ctx) { const struct plotter_table *plot = ctx->plot; size_t char_offset; int actual_x; struct history_entry *child; colour c = entry == history->current ? HISTORY_COLOUR_SELECTED : HISTORY_COLOUR_FOREGROUND; int tailsize = 5; int xoffset = x - x0; int yoffset = y - y0; plot_style_t pstyle_history_rect = { .stroke_type = PLOT_OP_TYPE_SOLID, .stroke_colour = c, .stroke_width = entry == history->current ? 3 : 1, }; plot_font_style_t fstyle = *plot_style_font; if (clip) { struct rect rect; rect.x0 = x0 + xoffset; rect.y0 = y0 + yoffset; rect.x1 = x1 + xoffset; rect.y1 = y1 + yoffset; if (!plot->clip(&rect)) { return false; } } /* Only attempt to plot bitmap if it is present */ if (entry->bitmap != NULL) { plot->bitmap(entry->x + xoffset, entry->y + yoffset, WIDTH, HEIGHT, entry->bitmap, 0xffffff, 0); } if (!plot->rectangle(entry->x - 1 + xoffset, entry->y - 1 + yoffset, entry->x + xoffset + WIDTH, entry->y + yoffset + HEIGHT, &pstyle_history_rect)) return false; if (!nsfont.font_position_in_string(plot_style_font, entry->page.title, strlen(entry->page.title), WIDTH, &char_offset, &actual_x)) return false; fstyle.background = HISTORY_COLOUR_BACKGROUND; fstyle.foreground = c; fstyle.weight = entry == history->current ? 900 : 400; if (!plot->text(entry->x + xoffset, entry->y + HEIGHT + 12 + yoffset, entry->page.title, char_offset, &fstyle)) return false; for (child = entry->forward; child; child = child->next) { if (!plot->line(entry->x + WIDTH + xoffset, entry->y + HEIGHT / 2 + yoffset, entry->x + WIDTH + tailsize + xoffset, entry->y + HEIGHT / 2 + yoffset, plot_style_stroke_history)) return false; if (!plot->line(entry->x + WIDTH + tailsize + xoffset, entry->y + HEIGHT / 2 + yoffset, child->x - tailsize +xoffset, child->y + HEIGHT / 2 + yoffset, plot_style_stroke_history)) return false; if (!plot->line(child->x - tailsize + xoffset, child->y + HEIGHT / 2 + yoffset, child->x + xoffset, child->y + HEIGHT / 2 + yoffset, plot_style_stroke_history)) return false; if (!browser_window_history__redraw_entry(history, child, x0, y0, x1, y1, x, y, clip, ctx)) return false; } return true; } /** * Find the history entry at a position. * * \param entry entry to search from * \param x coordinate * \param y coordinate * \return an entry if found, 0 if none */ static struct history_entry *browser_window_history__find_position( struct history_entry *entry, int x, int y) { struct history_entry *child; struct history_entry *found; if (!entry) return 0; if (entry->x <= x && x <= entry->x + WIDTH && entry->y <= y && y <= entry->y + HEIGHT) return entry; for (child = entry->forward; child; child = child->next) { found = browser_window_history__find_position(child, x, y); if (found) return found; } return 0; } /** * Enumerate subentries in history * See also history_enumerate() * * \param bw The browser window to enumerate history of * \param entry entry to start enumeration at * \param cb callback function * \param ud context pointer passed to cb * \return true to continue enumeration, false to cancel */ static bool browser_window_history__enumerate_entry( const struct browser_window *bw, const struct history_entry *entry, browser_window_history_enumerate_cb cb, void *ud) { const struct history_entry *child; if (!cb(bw, entry->x, entry->y, entry->x + WIDTH, entry->y + HEIGHT, entry, ud)) return false; for (child = entry->forward; child; child = child->next) { if (!browser_window_history__enumerate_entry(bw, child, cb, ud)) return false; } return true; } /* -------------------------------------------------------------------------- */ /* exported interface documented in desktop/browser_history.h */ nserror browser_window_history_create(struct browser_window *bw) { struct history *history; bw->history = NULL; history = calloc(1, sizeof *history); if (history == NULL) { return NSERROR_NOMEM; } history->width = RIGHT_MARGIN / 2; history->height = BOTTOM_MARGIN / 2; bw->history = history; return NSERROR_OK; } /* exported interface documented in desktop/browser_history.h */ nserror browser_window_history_clone(const struct browser_window *existing, struct browser_window *clone) { struct history *new_history; clone->history = NULL; if (existing == NULL || existing->history == NULL || existing->history->start == NULL) /* Nothing to clone, create new history for clone window */ return browser_window_history_create(clone); /* Make cloned history */ new_history = malloc(sizeof *new_history); if (!new_history) return NSERROR_NOMEM; clone->history = new_history; memcpy(new_history, existing->history, sizeof *new_history); new_history->start = browser_window_history__clone_entry(new_history, new_history->start); if (!new_history->start) { LOG("Insufficient memory to clone history"); browser_window_history_destroy(clone); clone->history = NULL; return NSERROR_NOMEM; } return NSERROR_OK; } /* exported interface documented in desktop/browser_history.h */ nserror browser_window_history_add(struct browser_window *bw, struct hlcache_handle *content, lwc_string *frag_id) { struct history *history; struct history_entry *entry; nsurl *nsurl = hlcache_handle_get_url(content); char *title; struct bitmap *bitmap; nserror ret; assert(bw); assert(bw->history); assert(content); history = bw->history; /* allocate space */ entry = malloc(sizeof *entry); if (entry == NULL) { return NSERROR_NOMEM; } title = strdup(content_get_title(content)); if (title == NULL) { free(entry); return NSERROR_NOMEM; } entry->page.url = nsurl_ref(nsurl); entry->page.frag_id = frag_id ? lwc_string_ref(frag_id) : 0; entry->page.title = title; entry->back = history->current; entry->next = 0; entry->forward = entry->forward_pref = entry->forward_last = 0; entry->children = 0; entry->bitmap = 0; if (history->current) { if (history->current->forward_last) history->current->forward_last->next = entry; else history->current->forward = entry; history->current->forward_pref = entry; history->current->forward_last = entry; history->current->children++; } else { history->start = entry; } history->current = entry; /* if we have a thumbnail, don't update until the page has finished * loading */ bitmap = urldb_get_thumbnail(nsurl); if (bitmap == NULL) { LOG("Creating thumbnail for %s", nsurl_access(nsurl)); bitmap = guit->bitmap->create(WIDTH, HEIGHT, BITMAP_NEW | BITMAP_CLEAR_MEMORY | BITMAP_OPAQUE); if (bitmap != NULL) { ret = guit->bitmap->render(bitmap, content); if (ret == NSERROR_OK) { /* Successful thumbnail so register it * with the url. */ urldb_set_thumbnail(nsurl, bitmap); } else { /* Thumbnailing failed. Ignore it * silently but clean up bitmap. */ LOG("Thumbnail renderfailed"); guit->bitmap->destroy(bitmap); bitmap = NULL; } } } entry->bitmap = bitmap; browser_window_history__layout(history); return NSERROR_OK; } /* exported interface documented in desktop/browser_history.h */ nserror browser_window_history_update(struct browser_window *bw, struct hlcache_handle *content) { struct history *history; char *title; assert(bw != NULL); history = bw->history; if (!history || !history->current || !history->current->bitmap) { return NSERROR_INVALID; } assert(history->current->page.url); assert(history->current->page.title); title = strdup(content_get_title(content)); if (title == NULL) { return NSERROR_NOMEM; } free(history->current->page.title); history->current->page.title = title; guit->bitmap->render(history->current->bitmap, content); return NSERROR_OK; } /* exported interface documented in desktop/browser_history.h */ void browser_window_history_destroy(struct browser_window *bw) { assert(bw != NULL); if (bw->history == NULL) return; browser_window_history__free_entry(bw->history->start); free(bw->history); bw->history = NULL; }
/** * Callback for (i)frame scrollbars. */ void browser_window_scroll_callback(void *client_data, struct scrollbar_msg_data *scrollbar_data) { struct browser_window *bw = client_data; switch(scrollbar_data->msg) { case SCROLLBAR_MSG_MOVED: if (bw->browser_window_type == BROWSER_WINDOW_IFRAME) { html_redraw_a_box(bw->parent->current_content, bw->box); } else { struct rect rect; rect.x0 = scrollbar_get_offset(bw->scroll_x); rect.y0 = scrollbar_get_offset(bw->scroll_y); rect.x1 = rect.x0 + bw->width; rect.y1 = rect.y0 + bw->height; browser_window_update_box(bw, &rect); } break; case SCROLLBAR_MSG_SCROLL_START: { struct rect rect = { .x0 = scrollbar_data->x0, .y0 = scrollbar_data->y0, .x1 = scrollbar_data->x1, .y1 = scrollbar_data->y1 }; if (scrollbar_is_horizontal(scrollbar_data->scrollbar)) browser_window_set_drag_type(bw, DRAGGING_SCR_X, &rect); else browser_window_set_drag_type(bw, DRAGGING_SCR_Y, &rect); } break; case SCROLLBAR_MSG_SCROLL_FINISHED: browser_window_set_drag_type(bw, DRAGGING_NONE, NULL); browser_window_set_pointer(bw, BROWSER_POINTER_DEFAULT); break; } } /* exported interface, documented in browser.h */ void browser_window_handle_scrollbars(struct browser_window *bw) { struct hlcache_handle *h = bw->current_content; bool scroll_x; bool scroll_y; int c_width = 0; int c_height = 0; assert(!bw->window); /* Core-handled windows only */ if (h != NULL) { c_width = content_get_width(h); c_height = content_get_height(h); } if (bw->scrolling == BW_SCROLLING_YES) { scroll_x = true; scroll_y = true; } else if (bw->scrolling == BW_SCROLLING_AUTO && bw->current_content) { int bw_width = bw->width; int bw_height = bw->height; /* subtract existing scrollbar width */ bw_width -= bw->scroll_y ? SCROLLBAR_WIDTH : 0; bw_height -= bw->scroll_x ? SCROLLBAR_WIDTH : 0; scroll_y = (c_height > bw_height) ? true : false; scroll_x = (c_width > bw_width) ? true : false; } else { /* No scrollbars */ scroll_x = false; scroll_y = false; } if (!scroll_x && bw->scroll_x != NULL) { scrollbar_destroy(bw->scroll_x); bw->scroll_x = NULL; } if (!scroll_y && bw->scroll_y != NULL) { scrollbar_destroy(bw->scroll_y); bw->scroll_y = NULL; } if (scroll_y) { int length = bw->height; int visible = bw->height - (scroll_x ? SCROLLBAR_WIDTH : 0); if (bw->scroll_y == NULL) { /* create vertical scrollbar */ if (scrollbar_create(false, length, c_height, visible, bw, browser_window_scroll_callback, &(bw->scroll_y)) != NSERROR_OK) { return; } } else { /* update vertical scrollbar */ scrollbar_set_extents(bw->scroll_y, length, visible, c_height); } } if (scroll_x) { int length = bw->width - (scroll_y ? SCROLLBAR_WIDTH : 0); int visible = length; if (bw->scroll_x == NULL) { /* create horizontal scrollbar */ if (scrollbar_create(true, length, c_width, visible, bw, browser_window_scroll_callback, &(bw->scroll_x)) != NSERROR_OK) { return; } } else { /* update horizontal scrollbar */ scrollbar_set_extents(bw->scroll_x, length, visible, c_width); } } if (scroll_x && scroll_y) scrollbar_make_pair(bw->scroll_x, bw->scroll_y); } /* exported function documented in desktop/frames.h */ nserror browser_window_create_iframes(struct browser_window *bw, struct content_html_iframe *iframe) { struct browser_window *window; struct content_html_iframe *cur; struct rect rect; int iframes = 0; int index; nserror ret = NSERROR_OK; if (iframe == NULL) { return NSERROR_BAD_PARAMETER; } /* Count iframe list and allocate enough space within the * browser window. */ for (cur = iframe; cur; cur = cur->next) { iframes++; } bw->iframes = calloc(iframes, sizeof(*bw)); if (!bw->iframes) { return NSERROR_NOMEM; } bw->iframe_count = iframes; index = 0; for (cur = iframe; cur; cur = cur->next) { window = &(bw->iframes[index++]); /* Initialise common parts */ browser_window_initialise_common(BW_CREATE_NONE, window, NULL); /* window characteristics */ window->browser_window_type = BROWSER_WINDOW_IFRAME; window->scrolling = cur->scrolling; window->border = cur->border; window->border_colour = cur->border_colour; window->no_resize = true; window->margin_width = cur->margin_width; window->margin_height = cur->margin_height; window->scale = bw->scale; if (cur->name != NULL) { window->name = strdup(cur->name); if (window->name == NULL) { free(bw->iframes) ; bw->iframes = 0; bw->iframe_count = 0; return NSERROR_NOMEM; } } /* linking */ window->box = cur->box; window->parent = bw; window->box->iframe = window; /* iframe dimensions */ box_bounds(window->box, &rect); browser_window_set_position(window, rect.x0, rect.y0); browser_window_set_dimensions(window, rect.x1 - rect.x0, rect.y1 - rect.y0); } /* calculate dimensions */ browser_window_update_extent(bw); browser_window_recalculate_iframes(bw); index = 0; for (cur = iframe; cur; cur = cur->next) { window = &(bw->iframes[index++]); if (cur->url) { /* fetch iframe's content */ ret = browser_window_navigate(window, cur->url, hlcache_handle_get_url(bw->current_content), BW_NAVIGATE_UNVERIFIABLE, NULL, NULL, bw->current_content); } } return ret; } /** * Recalculate iframe positions following a resize. * * \param bw The browser window to reposition iframes for */ void browser_window_recalculate_iframes(struct browser_window *bw) { struct browser_window *window; int index; for (index = 0; index < bw->iframe_count; index++) { window = &(bw->iframes[index]); if (window != NULL) { browser_window_handle_scrollbars(window); } } } /* exported interface documented in desktop/frames.h */ nserror browser_window_create_frameset(struct browser_window *bw, struct content_html_frames *frameset) { int row, col, index; struct content_html_frames *frame; struct browser_window *window; hlcache_handle *parent; assert(bw && frameset); /* 1. Create children */ assert(bw->children == NULL); assert(frameset->cols + frameset->rows != 0); bw->children = calloc((frameset->cols * frameset->rows), sizeof(*bw)); if (!bw->children) { return NSERROR_NOMEM; } bw->cols = frameset->cols; bw->rows = frameset->rows; for (row = 0; row < bw->rows; row++) { for (col = 0; col < bw->cols; col++) { index = (row * bw->cols) + col; frame = &frameset->children[index]; window = &bw->children[index]; /* Initialise common parts */ browser_window_initialise_common(BW_CREATE_NONE, window, NULL); /* window characteristics */ if (frame->children) window->browser_window_type = BROWSER_WINDOW_FRAMESET; else window->browser_window_type = BROWSER_WINDOW_FRAME; window->scrolling = frame->scrolling; window->border = frame->border; window->border_colour = frame->border_colour; window->no_resize = frame->no_resize; window->frame_width = frame->width; window->frame_height = frame->height; window->margin_width = frame->margin_width; window->margin_height = frame->margin_height; if (frame->name) { window->name = strdup(frame->name); if (!window->name) { free(bw->children); bw->children = NULL; return NSERROR_NOMEM; } } window->scale = bw->scale; /* linking */ window->parent = bw; if (window->name) LOG("Created frame '%s'", window->name); else LOG("Created frame (unnamed)"); } } /* 2. Calculate dimensions */ browser_window_update_extent(bw); browser_window_recalculate_frameset(bw); /* 3. Recurse for grandchildren */ for (row = 0; row < bw->rows; row++) { for (col = 0; col < bw->cols; col++) { index = (row * bw->cols) + col; frame = &frameset->children[index]; window = &bw->children[index]; if (frame->children) browser_window_create_frameset(window, frame); } } /* Use the URL of the first ancestor window containing html content * as the referer */ for (window = bw; window->parent; window = window->parent) { if (window->current_content && content_get_type(window->current_content) == CONTENT_HTML) break; } parent = window->current_content; /* 4. Launch content */ for (row = 0; row < bw->rows; row++) { for (col = 0; col < bw->cols; col++) { index = (row * bw->cols) + col; frame = &frameset->children[index]; window = &bw->children[index]; if (frame->url) { browser_window_navigate(window, frame->url, hlcache_handle_get_url(parent), BW_NAVIGATE_HISTORY | BW_NAVIGATE_UNVERIFIABLE, NULL, NULL, parent); } } } return NSERROR_OK; }
void ami_file_save(int type, char *fname, struct Window *win, struct hlcache_handle *object, struct hlcache_handle *favicon, struct browser_window *bw) { BPTR lock, fh; const char *source_data; ULONG source_size; struct bitmap *bm; ami_update_pointer(win, GUI_POINTER_WAIT); if(ami_download_check_overwrite(fname, win, 0)) { switch(type) { case AMINS_SAVE_SOURCE: if((source_data = content_get_source_data(object, &source_size))) { BPTR fh; if(fh = FOpen(fname, MODE_NEWFILE,0)) { FWrite(fh, source_data, 1, source_size); FClose(fh); } } break; case AMINS_SAVE_TEXT: save_as_text(object, fname); break; case AMINS_SAVE_COMPLETE: if(lock = CreateDir(fname)) { UnLock(lock); save_complete(object, fname, ami_file_set_type); amiga_icon_superimpose_favicon(fname, favicon, NULL); } break; case AMINS_SAVE_PDF: #ifdef WITH_PDF_EXPORT if(save_as_pdf(object, fname)) amiga_icon_superimpose_favicon(fname, favicon, "pdf"); #endif break; case AMINS_SAVE_IFF: if((bm = content_get_bitmap(object))) { bm->url = (char *)nsurl_access(hlcache_handle_get_url(object)); bm->title = (char *)content_get_title(object); bitmap_save(bm, fname, 0); } #ifdef WITH_NS_SVG else if(ami_mime_compare(object, "svg") == true) { ami_save_svg(object, fname); } #endif break; case AMINS_SAVE_SELECTION: if(source_data = browser_window_get_selection(bw)) { if(fh = FOpen(fname, MODE_NEWFILE,0)) { FWrite(fh, source_data, 1, strlen(source_data)); FClose(fh); } free((void *)source_data); } break; } if(object) SetComment(fname, nsurl_access(hlcache_handle_get_url(object))); } ami_update_pointer(win, GUI_POINTER_DEFAULT); }
/* See hlcache.h for documentation */ void hlcache_finalise(void) { uint32_t num_contents, prev_contents; hlcache_entry *entry; hlcache_retrieval_ctx *ctx, *next; /* Obtain initial count of contents remaining */ for (num_contents = 0, entry = hlcache->content_list; entry != NULL; entry = entry->next) { num_contents++; } LOG(("%d contents remain before cache drain", num_contents)); /* Drain cache */ do { prev_contents = num_contents; hlcache_clean(NULL); for (num_contents = 0, entry = hlcache->content_list; entry != NULL; entry = entry->next) { num_contents++; } } while (num_contents > 0 && num_contents != prev_contents); LOG(("%d contents remaining:", num_contents)); for (entry = hlcache->content_list; entry != NULL; entry = entry->next) { hlcache_handle entry_handle = { entry, NULL, NULL }; if (entry->content != NULL) { LOG((" %p : %s (%d users)", entry, nsurl_access( hlcache_handle_get_url(&entry_handle)), content_count_users(entry->content))); } else { LOG((" %p", entry)); } } /* Clean up retrieval contexts */ if (hlcache->retrieval_ctx_ring != NULL) { ctx = hlcache->retrieval_ctx_ring; do { next = ctx->r_next; if (ctx->llcache != NULL) llcache_handle_release(ctx->llcache); if (ctx->handle != NULL) free(ctx->handle); if (ctx->child.charset != NULL) free((char *) ctx->child.charset); free(ctx); ctx = next; } while (ctx != hlcache->retrieval_ctx_ring); hlcache->retrieval_ctx_ring = NULL; } LOG(("hit/miss %d/%d", hlcache->hit_count, hlcache->miss_count)); free(hlcache); hlcache = NULL; LOG(("Finalising low-level cache")); llcache_finalise(); }
void browser_window_create_iframes(struct browser_window *bw, struct content_html_iframe *iframe) { struct browser_window *window; struct content_html_iframe *cur; struct rect rect; int iframes = 0; int index; for (cur = iframe; cur; cur = cur->next) iframes++; bw->iframes = calloc(iframes, sizeof(*bw)); if (!bw->iframes) return; bw->iframe_count = iframes; index = 0; for (cur = iframe; cur; cur = cur->next) { window = &(bw->iframes[index++]); /* Initialise common parts */ browser_window_initialise_common(BW_CREATE_NONE, window, NULL); /* window characteristics */ window->browser_window_type = BROWSER_WINDOW_IFRAME; window->scrolling = cur->scrolling; window->border = cur->border; window->border_colour = cur->border_colour; window->no_resize = true; window->margin_width = cur->margin_width; window->margin_height = cur->margin_height; window->scale = bw->scale; if (cur->name) { window->name = strdup(cur->name); if (!window->name) warn_user("NoMemory", 0); } /* linking */ window->box = cur->box; window->parent = bw; window->box->iframe = window; /* iframe dimensions */ box_bounds(window->box, &rect); browser_window_set_position(window, rect.x0, rect.y0); browser_window_set_dimensions(window, rect.x1 - rect.x0, rect.y1 - rect.y0); } /* calculate dimensions */ browser_window_update_extent(bw); browser_window_recalculate_iframes(bw); index = 0; for (cur = iframe; cur; cur = cur->next) { window = &(bw->iframes[index++]); if (cur->url) { /* fetch iframe's content */ browser_window_navigate(window, cur->url, hlcache_handle_get_url(bw->current_content), BW_NAVIGATE_UNVERIFIABLE, NULL, NULL, bw->current_content); } } }
void browser_window_create_frameset(struct browser_window *bw, struct content_html_frames *frameset) { int row, col, index; struct content_html_frames *frame; struct browser_window *window; hlcache_handle *parent; assert(bw && frameset); /* 1. Create children */ assert(bw->children == NULL); assert(frameset->cols + frameset->rows != 0); bw->children = calloc((frameset->cols * frameset->rows), sizeof(*bw)); if (!bw->children) return; bw->cols = frameset->cols; bw->rows = frameset->rows; for (row = 0; row < bw->rows; row++) { for (col = 0; col < bw->cols; col++) { index = (row * bw->cols) + col; frame = &frameset->children[index]; window = &bw->children[index]; /* Initialise common parts */ browser_window_initialise_common(BW_CREATE_NONE, window, NULL); /* window characteristics */ if (frame->children) window->browser_window_type = BROWSER_WINDOW_FRAMESET; else window->browser_window_type = BROWSER_WINDOW_FRAME; window->scrolling = frame->scrolling; window->border = frame->border; window->border_colour = frame->border_colour; window->no_resize = frame->no_resize; window->frame_width = frame->width; window->frame_height = frame->height; window->margin_width = frame->margin_width; window->margin_height = frame->margin_height; if (frame->name) { window->name = strdup(frame->name); if (!window->name) warn_user("NoMemory", 0); } window->scale = bw->scale; /* linking */ window->parent = bw; if (window->name) LOG(("Created frame '%s'", window->name)); else LOG(("Created frame (unnamed)")); } } /* 2. Calculate dimensions */ browser_window_update_extent(bw); browser_window_recalculate_frameset(bw); /* 3. Recurse for grandchildren */ for (row = 0; row < bw->rows; row++) { for (col = 0; col < bw->cols; col++) { index = (row * bw->cols) + col; frame = &frameset->children[index]; window = &bw->children[index]; if (frame->children) browser_window_create_frameset(window, frame); } } /* Use the URL of the first ancestor window containing html content * as the referer */ for (window = bw; window->parent; window = window->parent) { if (window->current_content && content_get_type(window->current_content) == CONTENT_HTML) break; } parent = window->current_content; /* 4. Launch content */ for (row = 0; row < bw->rows; row++) { for (col = 0; col < bw->cols; col++) { index = (row * bw->cols) + col; frame = &frameset->children[index]; window = &bw->children[index]; if (frame->url) { browser_window_navigate(window, frame->url, hlcache_handle_get_url(parent), BW_NAVIGATE_HISTORY | BW_NAVIGATE_UNVERIFIABLE, NULL, NULL, parent); } } } }
/** * cleanup code physical update of all toolbars; resensitize * \param g the 'front' scaffolding that called customize */ void nsgtk_toolbar_close(nsgtk_scaffolding *g) { int i; nsgtk_scaffolding *list = scaf_list; while (list) { struct nsgtk_theme *theme = nsgtk_theme_load(GTK_ICON_SIZE_LARGE_TOOLBAR); if (theme == NULL) { warn_user(messages_get("NoMemory"), 0); continue; } /* clear toolbar */ gtk_container_foreach(GTK_CONTAINER(nsgtk_scaffolding_toolbar( list)), nsgtk_toolbar_clear_toolbar, list); /* then add items */ for (i = BACK_BUTTON; i < PLACEHOLDER_BUTTON; i++) { nsgtk_toolbar_add_item_to_toolbar(list, i, theme); } nsgtk_toolbar_connect_all(list); gtk_widget_show_all(GTK_WIDGET(nsgtk_scaffolding_toolbar( list))); nsgtk_scaffolding_set_sensitivity(list); nsgtk_widget_override_background_color(GTK_WIDGET(nsgtk_window_get_layout(nsgtk_scaffolding_top_level(list))), GTK_STATE_NORMAL, 0, 0xFFFF, 0xFFFF, 0xFFFF); g_signal_handler_unblock(GTK_WIDGET( nsgtk_window_get_layout( nsgtk_scaffolding_top_level(list))), nsgtk_window_get_signalhandler( nsgtk_scaffolding_top_level(list), NSGTK_WINDOW_SIGNAL_CLICK)); g_signal_handler_unblock(GTK_WIDGET( nsgtk_window_get_layout( nsgtk_scaffolding_top_level(list))), nsgtk_window_get_signalhandler( nsgtk_scaffolding_top_level(list), NSGTK_WINDOW_SIGNAL_REDRAW)); if ((nsgtk_get_browser_window(nsgtk_scaffolding_top_level( list))->current_content != NULL) && (hlcache_handle_get_url(nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list))-> current_content) != NULL)) browser_window_refresh_url_bar( nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list)), hlcache_handle_get_url( nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list))-> current_content), nsgtk_get_browser_window( nsgtk_scaffolding_top_level(list))-> frag_id); if (list != g) gtk_widget_set_sensitive(GTK_WIDGET( nsgtk_scaffolding_window(list)), TRUE); free(theme); list = nsgtk_scaffolding_iterate(list); } gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_notebook(g)), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(nsgtk_scaffolding_menu_bar(g)), TRUE); /* update favicon etc */ nsgtk_scaffolding_set_top_level(nsgtk_scaffolding_top_level(g)); if (search_web_ico()) gui_window_set_search_ico(search_web_ico()); }
void nsbeos_gui_view_source(struct hlcache_handle *content) { char *temp_name; bool done = false; BPath path; status_t err; size_t size; const char *source = content_get_source_data(content, &size); if (!content || !source) { warn_user("MiscError", "No document source"); return; } /* try to load local files directly. */ temp_name = url_to_path(nsurl_access(hlcache_handle_get_url(content))); if (temp_name) { path.SetTo(temp_name); BEntry entry; if (entry.SetTo(path.Path()) >= B_OK && entry.Exists() && entry.IsFile()) done = true; } if (!done) { /* We cannot release the requested filename until after it * has finished being used. As we can't easily find out when * this is, we simply don't bother releasing it and simply * allow it to be re-used next time NetSurf is started. The * memory overhead from doing this is under 1 byte per * filename. */ const char *filename = filename_request(); if (!filename) { warn_user("NoMemory", 0); return; } path.SetTo(TEMP_FILENAME_PREFIX); path.Append(filename); BFile file(path.Path(), B_WRITE_ONLY | B_CREATE_FILE); err = file.InitCheck(); if (err < B_OK) { warn_user("IOError", strerror(err)); return; } err = file.Write(source, size); if (err < B_OK) { warn_user("IOError", strerror(err)); return; } lwc_string *mime = content_get_mime_type(content); if (mime) { file.WriteAttr("BEOS:TYPE", B_MIME_STRING_TYPE, 0LL, lwc_string_data(mime), lwc_string_length(mime) + 1); lwc_string_unref(mime); } } entry_ref ref; if (get_ref_for_path(path.Path(), &ref) < B_OK) return; BMessage m(B_REFS_RECEIVED); m.AddRef("refs", &ref); // apps to try const char *editorSigs[] = { "application/x-vnd.beunited.pe", "application/x-vnd.XEmacs", "application/x-vnd.Haiku-StyledEdit", "application/x-vnd.Be-STEE", "application/x-vnd.yT-STEE", NULL }; int i; for (i = 0; editorSigs[i]; i++) { team_id team = -1; { BMessenger msgr(editorSigs[i], team); if (msgr.SendMessage(&m) >= B_OK) break; } err = be_roster->Launch(editorSigs[i], (BMessage *)&m, &team); if (err >= B_OK) break; } }
static nserror html_convert_css_callback(hlcache_handle *css, const hlcache_event *event, void *pw) { html_content *parent = pw; unsigned int i; struct html_stylesheet *s; /* Find sheet */ for (i = 0, s = parent->stylesheets; i != parent->stylesheet_count; i++, s++) { if (s->sheet == css) break; } assert(i != parent->stylesheet_count); switch (event->type) { case CONTENT_MSG_LOADING: break; case CONTENT_MSG_READY: break; case CONTENT_MSG_DONE: LOG(("done stylesheet slot %d '%s'", i, nsurl_access(hlcache_handle_get_url(css)))); parent->base.active--; LOG(("%d fetches active", parent->base.active)); break; case CONTENT_MSG_ERROR: LOG(("stylesheet %s failed: %s", nsurl_access(hlcache_handle_get_url(css)), event->data.error)); hlcache_handle_release(css); s->sheet = NULL; parent->base.active--; LOG(("%d fetches active", parent->base.active)); content_add_error(&parent->base, "?", 0); break; case CONTENT_MSG_STATUS: if (event->data.explicit_status_text == NULL) { /* Object content's status text updated */ html_set_status(parent, content_get_status_message(css)); content_broadcast(&parent->base, CONTENT_MSG_STATUS, event->data); } else { /* Object content wants to set explicit message */ content_broadcast(&parent->base, CONTENT_MSG_STATUS, event->data); } break; case CONTENT_MSG_POINTER: /* Really don't want this to continue after the switch */ return NSERROR_OK; default: assert(0); } if (html_can_begin_conversion(parent)) { html_begin_conversion(parent); } return NSERROR_OK; }
/** * Callback for syncronous scripts */ static nserror convert_script_sync_cb(hlcache_handle *script, const hlcache_event *event, void *pw) { html_content *parent = pw; unsigned int i; struct html_script *s; script_handler_t *script_handler; dom_hubbub_error err; /* Find script */ for (i = 0, s = parent->scripts; i != parent->scripts_count; i++, s++) { if (s->type == HTML_SCRIPT_SYNC && s->data.handle == script) break; } assert(i != parent->scripts_count); switch (event->type) { case CONTENT_MSG_LOADING: break; case CONTENT_MSG_READY: break; case CONTENT_MSG_DONE: LOG(("script %d done '%s'", i, nsurl_access(hlcache_handle_get_url(script)))); parent->base.active--; LOG(("%d fetches active", parent->base.active)); s->already_started = true; /* attempt to execute script */ script_handler = select_script_handler(content_get_type(s->data.handle)); if (script_handler != NULL) { /* script has a handler */ const char *data; unsigned long size; data = content_get_source_data(s->data.handle, &size ); script_handler(parent->jscontext, data, size); } /* continue parse */ err = dom_hubbub_parser_pause(parent->parser, false); if (err != DOM_HUBBUB_OK) { LOG(("unpause returned 0x%x", err)); } break; case CONTENT_MSG_ERROR: LOG(("script %s failed: %s", nsurl_access(hlcache_handle_get_url(script)), event->data.error)); hlcache_handle_release(script); s->data.handle = NULL; parent->base.active--; LOG(("%d fetches active", parent->base.active)); content_add_error(&parent->base, "?", 0); s->already_started = true; /* continue parse */ err = dom_hubbub_parser_pause(parent->parser, false); if (err != DOM_HUBBUB_OK) { LOG(("unpause returned 0x%x", err)); } break; case CONTENT_MSG_STATUS: break; default: assert(0); } /* if there are no active fetches remaining begin post parse * conversion */ if (html_can_begin_conversion(parent)) { html_begin_conversion(parent); } return NSERROR_OK; }
/* exported function documented in desktop/frames.h */ nserror browser_window_create_iframes(struct browser_window *bw, struct content_html_iframe *iframe) { struct browser_window *window; struct content_html_iframe *cur; struct rect rect; int iframes = 0; int index; nserror ret = NSERROR_OK; if (iframe == NULL) { return NSERROR_BAD_PARAMETER; } /* Count iframe list and allocate enough space within the * browser window. */ for (cur = iframe; cur; cur = cur->next) { iframes++; } bw->iframes = calloc(iframes, sizeof(*bw)); if (!bw->iframes) { return NSERROR_NOMEM; } bw->iframe_count = iframes; index = 0; for (cur = iframe; cur; cur = cur->next) { window = &(bw->iframes[index++]); /* Initialise common parts */ browser_window_initialise_common(BW_CREATE_NONE, window, NULL); /* window characteristics */ window->browser_window_type = BROWSER_WINDOW_IFRAME; window->scrolling = cur->scrolling; window->border = cur->border; window->border_colour = cur->border_colour; window->no_resize = true; window->margin_width = cur->margin_width; window->margin_height = cur->margin_height; window->scale = bw->scale; if (cur->name != NULL) { window->name = strdup(cur->name); if (window->name == NULL) { free(bw->iframes) ; bw->iframes = 0; bw->iframe_count = 0; return NSERROR_NOMEM; } } /* linking */ window->box = cur->box; window->parent = bw; window->box->iframe = window; /* iframe dimensions */ box_bounds(window->box, &rect); browser_window_set_position(window, rect.x0, rect.y0); browser_window_set_dimensions(window, rect.x1 - rect.x0, rect.y1 - rect.y0); } /* calculate dimensions */ browser_window_update_extent(bw); browser_window_recalculate_iframes(bw); index = 0; for (cur = iframe; cur; cur = cur->next) { window = &(bw->iframes[index++]); if (cur->url) { /* fetch iframe's content */ ret = browser_window_navigate(window, cur->url, hlcache_handle_get_url(bw->current_content), BW_NAVIGATE_UNVERIFIABLE, NULL, NULL, bw->current_content); } } return ret; }