diff --git a/programs/cmm/TWB/TWB.c b/programs/cmm/TWB/TWB.c index 975b7c1aa4..04fd27e3b7 100644 --- a/programs/cmm/TWB/TWB.c +++ b/programs/cmm/TWB/TWB.c @@ -35,7 +35,6 @@ struct TWebBrowser { dword o_bufpointer; int cur_encoding, custom_encoding; bool link, t_html, t_body; - dword link_bg; dword bufpointer; dword bufsize; dword is_html; @@ -106,7 +105,7 @@ void TWebBrowser::Paint() if (link) { if (line[0]==' ') && (line[1]==NULL) {} else { DrawBuf.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2)-1, line_length, zoom, link_color_default); - PageLinks.AddText(start_x, draw_y + list.y, line_length, list.item_h - calc(zoom*2)-1, UNDERLINE, zoom); + links.add_text(start_x, draw_y + list.y, line_length, list.item_h - calc(zoom*2)-1, zoom); } } stolbec += stolbec_len; @@ -123,10 +122,9 @@ void TWebBrowser::SetPageDefaults() link_color_default = 0x0000FF; link_color_active = 0xFF0000; page_bg = 0xFFFFFF; - link_bg = 0xFFFFFF; style.bg_color = page_bg; DrawBuf.Fill(0, page_bg); - PageLinks.Clear(); + links.clear(); anchors.clear(); header = NULL; cur_encoding = CH_CP866; @@ -341,10 +339,9 @@ void TWebBrowser::SetStyle() { t_body = tag.opened; if (value = tag.get_value_of("link=")) link_color_default = GetColor(value); if (value = tag.get_value_of("alink=")) link_color_active = GetColor(value); - if (value = tag.get_value_of("bglink=")) link_bg=GetColor(value); if (value = tag.get_value_of("text=")) text_colors[0]=GetColor(value); if (value = tag.get_value_of("bgcolor=")) { - style.bg_color = page_bg = link_bg = GetColor(value); + style.bg_color = page_bg = GetColor(value); DrawBuf.Fill(0, page_bg); } // Autodetecting encoding if no encoding was set @@ -366,8 +363,7 @@ void TWebBrowser::SetStyle() { if (value = tag.get_value_of("href=")) && (!strstr(value,"javascript:")) { link = true; - PageLinks.AddLink(value); - style.bg_color = link_bg; + links.add_link(value); } } else { link = false; @@ -380,7 +376,7 @@ void TWebBrowser::SetStyle() { strcpy(#line, "IFRAME: "); Paint(); link=true; - PageLinks.AddLink(value); + links.add_link(value); strncpy(#line, value, sizeof(line)-1); while (CheckForLineBreak()) {}; Paint(); diff --git a/programs/cmm/TWB/anchors.h b/programs/cmm/TWB/anchors.h index df88b3fbbb..38ea84c225 100644 --- a/programs/cmm/TWB/anchors.h +++ b/programs/cmm/TWB/anchors.h @@ -37,7 +37,7 @@ void _anchors::take_anchor_from(dword _URL) int anchor_pos; if (!current) && (_URL) && (anchor_pos = strrchr(_URL, '#')) { strncpy(#current, _URL+anchor_pos-1, sizeof(_anchors.current)-1); - ESBYTE[_URL+anchor_pos-1] = EOS; + ESBYTE[_URL+anchor_pos-1] = '\0'; } } diff --git a/programs/cmm/TWB/img_cache.h b/programs/cmm/TWB/img_cache.h index 471af4753c..130aa4372e 100644 --- a/programs/cmm/TWB/img_cache.h +++ b/programs/cmm/TWB/img_cache.h @@ -73,8 +73,8 @@ void ImageCache::Images(dword left1, top1, width1) DrawBar(WB1.list.x, top1+imgh, WB1.list.w, -imgh % WB1.list.item_h + WB1.list.item_h, page_bg); if (link) { - UnsafeDefineButton(left1 - 5, top1, imgw, imgh-1, PageLinks.count + 400 + BT_HIDE, 0xB5BFC9); - PageLinks.AddText(0, imgw, imgh-1, NOLINE, 1); + UnsafeDefineButton(left1 - 5, top1, imgw, imgh-1, links.count + 400 + BT_HIDE, 0xB5BFC9); + links.AddText(0, imgw, imgh-1, NOLINE, 1); WB1.DrawPage(); } */ diff --git a/programs/cmm/TWB/links.h b/programs/cmm/TWB/links.h index 94dfa9c487..0c33a9d3ee 100644 --- a/programs/cmm/TWB/links.h +++ b/programs/cmm/TWB/links.h @@ -2,153 +2,111 @@ CustomCursor CursorPointer; dword CursorFile = FROM "../TWB/pointer.cur"; #include "..\lib\collection.h" -#define NOLINE 0 -#define UNDERLINE 1 +struct PAGE_LINKS { + collection_int link; + collection_int x; + collection_int y; + collection_int w; + collection_int h; + collection_int id; + collection_int underline_h; -#define MAXLINKS 2000 - -bool open_new_window=false; -bool open_new_tab=false; - -struct array_link { - dword link; - unsigned int x,y,w,h; - unsigned int unic_id; - int underline, underline_h; -}; - -struct LinksArray { - array_link links[MAXLINKS]; collection page_links; - unsigned int count; - unsigned int unic_count; - unsigned int active; - bool HoverAndProceed(); - bool Click(); - void AddLink(); - void AddText(); - dword GetURL(); - void Clear(); - void DrawUnderline(); -} PageLinks; + signed int active; + dword active_url; + bool hover(); + void add_link(); + void add_text(); + void clear(); + void draw_underline(); +} links; -void LinksArray::AddLink(dword lpath) +void PAGE_LINKS::add_link(dword lpath) { - if (count>= MAXLINKS) return; page_links.add(lpath); - unic_count++; } -void LinksArray::AddText(dword _x, _y, _w, _h, _link_underline, _underline_h) +void PAGE_LINKS::add_text(dword _x, _y, _w, _h, _underline_h) { - if (count>= MAXLINKS) return; - links[count].x = _x; - links[count].y = _y; - links[count].w = _w; - links[count].h = _h; - links[count].underline = _link_underline; - links[count].underline_h = _underline_h; - links[count].link = page_links.get(page_links.count-1); - links[count].unic_id = unic_count; - count++; + x.add(_x); + y.add(_y); + w.add(_w); + h.add(_h); + underline_h.add(_underline_h); + link.add(page_links.get_last()); + id.add(page_links.count); } -dword LinksArray::GetURL(int id) +void PAGE_LINKS::clear() { - return links[id].link; -} + x.drop(); + y.drop(); + w.drop(); + h.drop(); + underline_h.drop(); + link.drop(); + id.drop(); -void LinksArray::Clear() -{ page_links.drop(); page_links.realloc_size = 4096 * 32; - count = 0; active = -1; - unic_count = 0; + active_url = 0; CursorPointer.Restore(); - open_new_window = false; } -void LinksArray::DrawUnderline(dword und_id, list_first, list_y, color) +void PAGE_LINKS::draw_underline(signed _id, dword list_first, list_y, color) { int i; - for (i=0; i list_y) { - DrawBar(links[i].x, links[i].y + links[i].h - list_first, links[i].w, links[i].underline_h, color); + if (id.get(i) - id.get(_id) == 0) + && (y.get(i) + h.get(i) - list_first > list_y) { + DrawBar(x.get(i), y.get(i) + h.get(i) - list_first, + w.get(i), underline_h.get(i), color); } } } -PathShow_data status_text = {0, 17,250, 6, 250}; - -bool LinksArray::Click(dword list_first) -{ - if (mouse.lkm) && (mouse.down) { - DrawRectangle(links[active].x, -list_first + links[active].y, - links[active].w, links[active].h, 0); - return false; - } - if (mouse.mkm) && (mouse.up) { - if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT) { - open_new_window = true; - EventClickLink(PageLinks.GetURL(PageLinks.active)); - open_new_window = false; - } else { - open_new_tab = true; - EventClickLink(PageLinks.GetURL(PageLinks.active)); - open_new_tab = false; - } - return false; - } - if (mouse.lkm) && (mouse.up) { - CursorPointer.Restore(); - EventClickLink(PageLinks.GetURL(PageLinks.active)); - return false; - } - if (mouse.pkm) && (mouse.up) { - EventShowLinkMenu(); - return false; - } -} - -bool LinksArray::HoverAndProceed(dword mx, my, list_y, list_first) +bool PAGE_LINKS::hover(dword list_y, list_first) { int i; - if (!count) return true; - for (i=0; ilinks[i].x) && (my>links[i].y) - && (mxx.get(i)) && (my>y.get(i)) + && (mxlist_y+list_first) { if (active!=i) { CursorPointer.Load(#CursorFile); CursorPointer.Set(); - if (links[active].underline) { - DrawUnderline(active, list_first, list_y, link_color_default); - } - - if (links[i].underline) { - DrawUnderline(i, list_first, list_y, page_bg); - } + draw_underline(active, list_first, list_y, link_color_default); + draw_underline(i, list_first, list_y, page_bg); + active_url = link.get(i); active = i; - DrawStatusBar(links[active].link); + DrawStatusBar(); + } + if (mouse.lkm) && (mouse.down) { + DrawRectangle(x.get(active), -list_first + y.get(active), + w.get(active), h.get(active), 0); } - Click(list_first); return true; } } - if (active!=-1) - { + if (active_url) { CursorPointer.Restore(); - if (links[active].underline) { - DrawUnderline(active, list_first, list_y, link_color_default); - } - DrawStatusBar(NULL); + draw_underline(active, list_first, list_y, link_color_default); + active_url = 0; active = -1; + DrawStatusBar(); } + return false; } diff --git a/programs/cmm/TWB/parse_tag.h b/programs/cmm/TWB/parse_tag.h index 60669753d1..94d7775158 100644 --- a/programs/cmm/TWB/parse_tag.h +++ b/programs/cmm/TWB/parse_tag.h @@ -71,18 +71,18 @@ bool _tag::get_next_param() { //remove quotes quotes = params[i]; - params[i] = EOS; + params[i] = '\0'; i--; //find VAL start and copy i = strrchr(#params, quotes); strlcpy(#val, #params + i, sizeof(val)-1); - params[i] = EOS; + params[i] = '\0'; i--; //find ATTR end while (i > 0) && (params[i] != '=') i--; - params[i+1] = EOS; + params[i+1] = '\0'; } else { diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index 0b35587aaa..46fdddcaf9 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -64,6 +64,8 @@ enum { TAB_CLOSE_ID = 900 }; +enum { TARGET_SAME_TAB, TARGET_NEW_WINDOW, TARGET_NEW_TAB }; + #include "..\TWB\TWB.c" //HTML Parser, a core component TWebBrowser WB1; @@ -125,7 +127,6 @@ void HandleParam() ExitProcess(); } else if (!strncmp(#param, "-download ", 10)) { strcpy(#downloader_edit, #param+10); - //CreateThread(#Downloader,#downloader_stak+4092); Downloader(); ExitProcess(); } else if (!strncmp(#param, "-source ", 8)) { @@ -151,7 +152,7 @@ void HandleParam() void main() { - int i, btn, redirect_count=0; + int i, redirect_count=0; LoadLibraries(); CreateDir("/tmp0/1/Downloads"); //CreateDir("/tmp0/1/WebView_Cache"); @@ -165,33 +166,47 @@ void main() case evMouse: edit_box_mouse stdcall (#address_box); mouse.get(); - PageLinks.HoverAndProceed(mouse.x, WB1.list.first + mouse.y, WB1.list.y, WB1.list.first); - if (PageLinks.active == -1) && (mouse.pkm) && (mouse.up) { - if (WB1.list.MouseOver(mouse.x, mouse.y)) EventShowPageMenu(); - break; - } + if (WB1.list.MouseScroll(mouse.vert)) WB1.DrawPage(); + scrollbar_v_mouse (#scroll_wv); - if (WB1.list.first != scroll_wv.position) - { + if (scroll_wv.delta) { WB1.list.first = scroll_wv.position; WB1.DrawPage(); break; } - if (mouse.up) && (! address_box.flags & ed_focus) && (address_box.flags & ed_shift_bac) + + if (links.hover(WB1.list.y, WB1.list.first)) { - DrawOmnibox(); //reset text selection + if (mouse.mkm) { + if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT) { + EventClickLink(TARGET_NEW_WINDOW); + } else { + EventClickLink(TARGET_NEW_TAB); + } + } + if (mouse.lkm) { + CursorPointer.Restore(); + EventClickLink(TARGET_SAME_TAB); + } + if (mouse.pkm) { + CursorPointer.Restore(); + EventShowLinkMenu(); + } + } else { + CursorPointer.Restore(); + if (mouse.pkm) && (WB1.list.MouseOver(mouse.x, mouse.y)) { + EventShowPageMenu(); + } } break; case evButton: - btn = GetButtonID(); - if (1==btn) ExitProcess(); else ProcessEvent(btn); + ProcessEvent( GetButtonID() ); break; case evKey: GetKeys(); - //if (key_scancode == SCAN_CODE_F1) {DebugTabs();break;} if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT) { if (key_scancode == SCAN_CODE_TAB) {EventActivatePreviousTab();break;} @@ -352,7 +367,7 @@ void draw_window() DrawOmnibox(); } DrawProgress(); - DrawStatusBar(NULL); + DrawStatusBar(); DrawTabsBar(); } @@ -388,9 +403,11 @@ void EventChangeEncodingAndLoadPage(int _new_encoding) void ProcessEvent(dword id__) { - char new_clip_url[URL_SIZE+1]; switch (id__) { + case 1: + ExitProcess(); + break; case ENCODINGS...ENCODINGS+6: EventChangeEncodingAndLoadPage(id__-ENCODINGS); return; @@ -450,25 +467,18 @@ void ProcessEvent(dword id__) EventRefreshPage(); return; case IN_NEW_TAB: - open_new_tab = true; - EventClickLink(PageLinks.GetURL(PageLinks.active)); - open_new_tab = false; + EventClickLink(TARGET_NEW_TAB); return; case IN_NEW_WINDOW: - open_new_window = true; - EventClickLink(PageLinks.GetURL(PageLinks.active)); - open_new_window = false; + EventClickLink(TARGET_NEW_WINDOW); return; case COPY_LINK_URL: - strncpy(#new_clip_url, PageLinks.GetURL(PageLinks.active), URL_SIZE); - GetAbsoluteURL(#new_clip_url, history.current()); - Clipboard__CopyText(#new_clip_url); + Clipboard__CopyText(GetAbsoluteActiveURL()); notify("'URL copied to clipboard'O"); return; case DOWNLOAD_LINK_CONTENTS: if (!downloader_opened) { - strcpy(#downloader_edit, PageLinks.GetURL(PageLinks.active)); - GetAbsoluteURL(#downloader_edit, history.current()); + strcpy(#downloader_edit, GetAbsoluteActiveURL()); CreateThread(#Downloader,#downloader_stak+4092); } return; @@ -565,23 +575,20 @@ bool GetLocalFileData(dword _path) void OpenPage(dword _open_URL) { char new_url[URL_SIZE+1]; + char new_url_full[URL_SIZE+1]; int unz_id; StopLoading(); - if (open_new_tab) { - open_new_tab = false; - EventOpenNewTab(_open_URL); - return; - } - SetOmniboxText(_open_URL); strncpy(#new_url, _open_URL, URL_SIZE); //Exclude # from the URL to the load page //We will bring it back when we get the buffer - if (strrchr(#new_url, '#')) anchors.take_anchor_from(#new_url); + if (strrchr(#new_url, '#')) { + anchors.take_anchor_from(#new_url); + } history.add(#new_url); @@ -605,9 +612,9 @@ void OpenPage(dword _open_URL) if (!strncmp(#new_url,"http:",5)) { http.get(#new_url); } else if (!strncmp(#new_url,"https://",8)) { - strcpy(#new_url, "http://gate.aspero.pro/?site="); - strncat(#new_url, _open_URL, URL_SIZE); - http.get(#new_url); + strcpy(#new_url_full, "http://gate.aspero.pro/?site="); + strncat(#new_url_full, #new_url, URL_SIZE); + http.get(#new_url_full); } DrawOmnibox(); @@ -631,34 +638,56 @@ void OpenPage(dword _open_URL) } } -void EventClickLink(dword _click_URL) + +bool EventClickAnchor() +{ + dword aURL = links.active_url; + + if (anchors.get_pos_by_name(aURL+1)!=-1) { + WB1.list.first = anchors.get_pos_by_name(aURL+1); + //WB1.list.CheckDoesValuesOkey(); + strcpy(#editURL, history.current()); + strcat(#editURL, aURL); + DrawOmnibox(); + WB1.DrawPage(); + return true; + } + return false; +} + +void EventClickLink(dword _target) { char new_url[URL_SIZE+1]; char new_url_full[URL_SIZE+1]; + dword aURL = GetAbsoluteActiveURL(); + if (!aURL) return; - if (open_new_window) { - strncpy(#new_url, _click_URL, sizeof(new_url)); - GetAbsoluteURL(#new_url, history.current()); + strcpy(#new_url, aURL); + + if (ESBYTE[aURL]=='#') { + if (_target == TARGET_SAME_TAB) { + EventClickAnchor(); + return; + } else { + strcpy(#new_url, history.current()); + strcat(#new_url, aURL); + } + } + + if (_target == TARGET_NEW_TAB) { + EventOpenNewTab(#new_url); + return; + } + + if (_target == TARGET_NEW_WINDOW) { strcpy(#new_url_full, "-new "); - strncat(#new_url_full, #new_url, sizeof(new_url_full)); + strncat(#new_url_full, #new_url, URL_SIZE); RunProgram(#program_path, #new_url_full); return; } - if (ESBYTE[_click_URL]=='#') { - if (anchors.get_pos_by_name(_click_URL+1)!=-1) { - WB1.list.first = anchors.get_pos_by_name(_click_URL+1); - WB1.list.CheckDoesValuesOkey(); - } - strcpy(#editURL, history.current()); - strcat(#editURL, _click_URL); - DrawOmnibox(); - WB1.DrawPage(); - return; - } - - if (!strncmp(_click_URL,"mailto:", 7)) || (!strncmp(_click_URL,"tel:", 4)) { - notify(_click_URL); + if (!strncmp(#new_url,"mailto:", 7)) || (!strncmp(#new_url,"tel:", 4)) { + notify(#new_url); return; } @@ -667,9 +696,6 @@ void EventClickLink(dword _click_URL) history.back(); } - strcpy(#new_url, _click_URL); - GetAbsoluteURL(#new_url, history.current()); - if (strrchr(#new_url, '#')!=0) { anchors.take_anchor_from(#new_url); OpenPage(#new_url); @@ -717,7 +743,7 @@ void EventSubmitOmnibox() OpenPage(#editURL); } else { strcpy(#new_url, "http://"); - strncat(#new_url, #editURL, sizeof(new_url)-1); + strncat(#new_url, #editURL, URL_SIZE-1); OpenPage(#new_url); } } @@ -733,7 +759,7 @@ void LoadInternalPage(dword _bufdata, _in_bufsize){ DrawOmnibox(); } WB1.ParseHtml(_bufdata, _in_bufsize); - DrawStatusBar(NULL); + DrawStatusBar(); DrawActiveTab(); if (source_mode) { source_mode = false; @@ -784,7 +810,7 @@ void EventShowMainMenu() void EventShowEncodingsList() { - open_lmenu(Form.left + Form.cwidth, Form.top + skin_height + status_text.start_y + 8, + open_lmenu(Form.left + Form.cwidth, Form.top + skin_height + Form.cheight - STATUSBAR_H + 12, MENU_ALIGN_BOT_RIGHT, WB1.cur_encoding + 1, "UTF-8\nKOI8-RU\nCP1251\nCP1252\nISO8859-5\nCP866"); menu_id = ENCODINGS; } @@ -895,23 +921,17 @@ void EventUpdateBrowser() } } -void DrawStatusBar(dword _status_text) +void DrawStatusBar() { - status_text.font_color = sc.work_text; - status_text.start_x = 10; - status_text.start_y = Form.cheight - STATUSBAR_H + 4; - status_text.area_size_x = Form.cwidth - status_text.start_x -3 - 70; - //DrawBar(status_text.start_x, status_text.start_y, status_text.area_size_x, 9, sc.work); + dword status_y = Form.cheight - STATUSBAR_H + 4; + dword status_w = Form.cwidth - 90; DrawBar(0,Form.cheight - STATUSBAR_H+1, Form.cwidth,STATUSBAR_H-1, sc.work); - if (_status_text) { - status_text.text_pointer = _status_text; - PathShow_prepare stdcall(#status_text); - PathShow_draw stdcall(#status_text); + if (links.active_url) { + ESI = math.min(status_w/6, strlen(links.active_url)); + WriteText(10, status_y, 0, sc.work_text, links.active_url); } - DefineHiddenButton(status_text.start_x+status_text.area_size_x+10, status_text.start_y-3, - 60, 12, CHANGE_ENCODING); - WriteTextCenter(status_text.start_x+status_text.area_size_x+10, - status_text.start_y, 60, sc.work_text, WB1.cur_encoding*10+#charsets); + DefineHiddenButton(status_w+20, status_y-3, 60, 12, CHANGE_ENCODING); + WriteTextCenter(status_w+20, status_y, 60, sc.work_text, WB1.cur_encoding*10+#charsets); } void DrawOmnibox() @@ -941,5 +961,15 @@ void SetOmniboxText(dword _text) DrawOmnibox(); } +dword GetAbsoluteActiveURL() +{ + char abs_url[URL_SIZE]; + if (links.active_url) { + strncpy(#abs_url, links.active_url, URL_SIZE); + GetAbsoluteURL(#abs_url, history.current()); + return #abs_url; + } + return 0; +} stop: \ No newline at end of file diff --git a/programs/cmm/browser/texts.h b/programs/cmm/browser/texts.h index 7ece1ba663..65f0460db1 100644 --- a/programs/cmm/browser/texts.h +++ b/programs/cmm/browser/texts.h @@ -1,4 +1,4 @@ -char version[]="WebView 2.5e"; +char version[]="WebView 2.6"; #ifdef LANG_RUS char page_not_found[] = FROM "html\\page_not_found_ru.htm""\0"; diff --git a/programs/cmm/examples/window.c b/programs/cmm/examples/window.c index 408add0431..7545cae770 100644 --- a/programs/cmm/examples/window.c +++ b/programs/cmm/examples/window.c @@ -27,7 +27,7 @@ void draw_ascii() { char s[2]; int i, x, y; - s[1]=EOS; + s[1] = '\0'; for (i=0; i<256; i++) { y = i / 20; x = i % 20; diff --git a/programs/cmm/lib/kolibri.h b/programs/cmm/lib/kolibri.h index 20908c69bb..86cda786c6 100644 --- a/programs/cmm/lib/kolibri.h +++ b/programs/cmm/lib/kolibri.h @@ -28,7 +28,6 @@ char program_path[4096]; #define bool int #define NULL 0 -#define EOS 0 #define OLD -1 #define true 1 #define false 0 diff --git a/programs/cmm/lib/obj/box_lib.h b/programs/cmm/lib/obj/box_lib.h index 0cd8b03f7c..91d7fa9f03 100644 --- a/programs/cmm/lib/obj/box_lib.h +++ b/programs/cmm/lib/obj/box_lib.h @@ -64,7 +64,7 @@ struct PathShow_data dword type; word start_y, start_x, - font_size_x, // 6 - for font 0, 8 - for font 1 + font_w, // 6 - for font 0, 8 - for font 1 area_size_x; dword font_number, // 0 - monospace, 1 - variable background_flag, diff --git a/programs/cmm/liza/mail_box.c b/programs/cmm/liza/mail_box.c index 697694cf2f..df747faf64 100644 --- a/programs/cmm/liza/mail_box.c +++ b/programs/cmm/liza/mail_box.c @@ -176,7 +176,7 @@ void MailBoxLoop() { break; } - PageLinks.HoverAndProceed(mouse.x, mouse.y); + links.hover(mouse.x, mouse.y); if (!mail_list.count) break; if (!panels_drag) { scrollbar_v_mouse (#scroll1); scrollbar_v_mouse (#scroll_wv); } @@ -419,5 +419,5 @@ int GetLetterSize_(int number) { void EventClickLink() { - RunProgram("/sys/network/WebView", PageLinks.GetURL(PageLinks.active)); + RunProgram("/sys/network/WebView", links.active_url); } \ No newline at end of file