From 1ae3511fb7799b3d07cf8a3ce5e8d576496333bd Mon Sep 17 00:00:00 2001 From: "Kirill Lipatov (Leency)" Date: Sat, 4 Apr 2020 19:13:03 +0000 Subject: [PATCH] WebView: autodetect encoding, fix crash on "dd" tag overflow, write ipfame link git-svn-id: svn://kolibrios.org@7762 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/cmm/TWB/TWB.c | 113 +++++++++++++++++++-------------- programs/cmm/browser/WebView.c | 51 ++------------- programs/cmm/browser/texts.h | 42 ++++++++++++ 3 files changed, 115 insertions(+), 91 deletions(-) create mode 100644 programs/cmm/browser/texts.h diff --git a/programs/cmm/TWB/TWB.c b/programs/cmm/TWB/TWB.c index 757a7b9e74..6b416a573c 100644 --- a/programs/cmm/TWB/TWB.c +++ b/programs/cmm/TWB/TWB.c @@ -36,15 +36,16 @@ struct TWebBrowser { dword bufpointer; dword bufsize; + void DrawStyle(); void SetPageDefaults(); void AddCharToTheLine(); void ParseHtml(); void SetStyle(); - void DrawStyle(); - void DrawPage(); - void DrawScroller(); - void NewLine(); bool CheckForLineBreak(); + void NewLine(); + void DrawScroller(); + void ChangeEncoding(); + void DrawPage(); char line[500]; char header[150]; }; @@ -55,6 +56,7 @@ scroll_bar scroll_wv = { 15,NULL,NULL,NULL,0,2,NULL,0,0,0xeeeeee,0xBBBbbb,0xeeee void TWebBrowser::DrawStyle() { dword start_x, line_length, stolbec_len; + dword text_color__; if (style.tag_title) { @@ -91,10 +93,14 @@ void TWebBrowser::DrawStyle() DrawBuf.DrawBar(start_x, draw_y + list.item_h - calc(zoom*2), line_length, zoom, 0x999999); } - DrawBuf.WriteText(start_x, draw_y, list.font_type, text_colors[text_color_index], #line); - if (style.b) DrawBuf.WriteText(start_x+1, draw_y, list.font_type, text_colors[text_color_index], #line); - if (style.s) DrawBuf.DrawBar(start_x, list.item_h / 2 - zoom + draw_y, line_length, zoom, text_colors[text_color_index]); - if (style.u) DrawBuf.DrawBar(start_x, list.item_h - zoom - zoom + draw_y, line_length, zoom, text_colors[text_color_index]); + text_color__ = text_colors[text_color_index]; + if (link) && (text_colors[text_color_index]==text_colors[0]) text_color__ = link_color_default; + + + DrawBuf.WriteText(start_x, draw_y, list.font_type, text_color__, #line); + if (style.b) DrawBuf.WriteText(start_x+1, draw_y, list.font_type, text_color__, #line); + if (style.s) DrawBuf.DrawBar(start_x, list.item_h / 2 - zoom + draw_y, line_length, zoom, text_color__); + if (style.u) DrawBuf.DrawBar(start_x, list.item_h - zoom - zoom + draw_y, line_length, zoom, text_color__); 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); @@ -222,7 +228,7 @@ void TWebBrowser::ParseHtml(dword _bufpointer, _bufsize){ while (ESBYTE[bufpos] !='>') && (bufpos < bufpointer + bufsize) //ïîëó÷àåì òåã è åãî ïàðàìåòðû { bukva = ESBYTE[bufpos]; - if (bukva == '\9') || (bukva == '\x0a') || (bukva == '\x0d') bukva = ' '; + if (bukva == '\x9') || (bukva == '\x0a') || (bukva == '\x0d') bukva = ' '; if (!ignor_param) && (bukva <>' ') { if (strlen(#tag.name)+1 list.column_max)CheckForLineBreak(); + //while (CheckForLineBreak()==true) {}; return true; } //============================================================================================ void TWebBrowser::SetStyle() { char img_path[4096]=0; - int meta_encoding; dword value; @@ -315,16 +320,6 @@ void TWebBrowser::SetStyle() { t_html = tag.opened; return; } - if (tag.is("q")) - { - if (tag.opened) { - meta_encoding = strlen(#line); - if (line[meta_encoding-1] != ' ') chrcat(#line, ' '); - chrcat(#line, '\"'); - } - if (!tag.opened) strcat(#line, "\" "); - return; - } if (tag.is("title")) { style.tag_title = tag.opened; if (!tag.opened) DrawTitle(#header); @@ -339,26 +334,40 @@ void TWebBrowser::SetStyle() { style.bg_color = page_bg = GetColor(value); DrawBuf.Fill(0, page_bg); } + // Autodetecting encoding if no encoding was set + if (tag.opened) && (custom_encoding==-1) && (cur_encoding == CH_CP866) { + if (strstr(bufpointer, "\208\190")) ChangeEncoding(CH_UTF8); + else if (chrnum(bufpointer, '\x246')>5) ChangeEncoding(CH_CP1251); + } return; } + if (tag.is("br")) { NewLine(); return; } + if (tag.is("b")) || (tag.is("strong")) || (tag.is("big")) { style.b = tag.opened; return; } if (tag.is("a")) { if (tag.opened) { - if (link) IF(text_color_index > 0) text_color_index--; //åñëè ïðåäûäóùèé òåã à íå áûë çàêðûò if (value = tag.get_value_of("href=")) && (!strstr(value,"javascript:")) { - text_color_index++; - text_colors[text_color_index] = text_colors[text_color_index-1]; - link = 1; - text_colors[text_color_index] = link_color_default; + link = true; PageLinks.AddLink(value); } } else { - link = 0; - IF(text_color_index > 0) text_color_index--; + link = false; } return; } + if (tag.is("iframe")) && (value = tag.get_value_of("src=")) { + NewLine(); + strcpy(#line, "IFRAME: "); + DrawStyle(); + link=true; + PageLinks.AddLink(value); + strncpy(#line, value, sizeof(TWebBrowser.line)-1); + while (CheckForLineBreak()) {}; + DrawStyle(); + link=false; + NewLine(); + } if (tag.is("font")) { style.bg_color = page_bg; if (tag.opened) @@ -385,16 +394,14 @@ void TWebBrowser::SetStyle() { NewLine(); return; } - if (tag.is("br")) { NewLine(); return; } + if (tag.is("pre")) { style.pre = tag.opened; return; } if (tag.is("td")) { if (tag.opened) AddCharToTheLine(' '); return; } if (tag.is("tr")) { if (tag.opened) NewLine(); return; } - if (tag.is("b")) || (tag.is("strong")) || (tag.is("big")) { style.b = tag.opened; return; } if (tag.is("button")) { style.button = tag.opened; stolbec++; return; } if (tag.is("u")) || (tag.is("ins")) { style.u=tag.opened; return;} if (tag.is("s")) || (tag.is("strike")) || (tag.is("del")) { style.s=tag.opened; return; } - if (tag.is("dd")) { stolbec += 5; return; } + //if (tag.is("dd")) { stolbec += 5; return; } //stolbec overflow! if (tag.is("blockquote")) { style.blq = tag.opened; return; } - if (tag.is("pre")) { style.pre = tag.opened; return; } if (tag.is("code")) { if (tag.opened) style.bg_color = 0xe4ffcb; else style.bg_color = page_bg; style.pre = tag.opened; return; @@ -473,6 +480,16 @@ void TWebBrowser::SetStyle() { } return; } + if (tag.is("q")) + { + if (tag.opened) { + EAX = strlen(#line); + if (line[EAX-1] != ' ') chrcat(#line, ' '); + chrcat(#line, '\"'); + } + if (!tag.opened) strcat(#line, "\" "); + return; + } if (tag.is("hr")) { if (value = tag.get_value_of("color=")) EDI = GetColor(value); else EDI = 0x999999; $push edi; @@ -485,24 +502,15 @@ void TWebBrowser::SetStyle() { return; } if (custom_encoding == -1) && (tag.is("meta")) || (tag.is("?xml")) { - meta_encoding = CH_CP866; if (value = tag.get_value_of("charset=")) || (value = tag.get_value_of("content=")) || (value = tag.get_value_of("encoding=")) { value += strrchr(value, '='); //search in content= strlwr(value); - if (streq(value,"utf-8")) || (streq(value,"utf8")) meta_encoding = CH_UTF8; - else if (streq(value,"windows-1251")) || (streq(value,"windows1251")) meta_encoding = CH_CP1251; - else if (streq(value,"dos")) || (streq(value,"cp-866")) meta_encoding = CH_CP866; - else if (streq(value,"iso-8859-5")) || (streq(value,"iso8859-5")) meta_encoding = CH_ISO8859_5; - else if (streq(value,"koi8-r")) || (streq(value,"koi8-u")) meta_encoding = CH_KOI8; - } - if (meta_encoding != CH_CP866) && (cur_encoding != meta_encoding) { - cur_encoding = meta_encoding; - bufpointer = ChangeCharset(cur_encoding*10+#charsets, "CP866", bufpointer); - if (header) { - ChangeCharset(cur_encoding*10+#charsets, "CP866", #header); - DrawTitle(#header); - } + if (streq(value,"utf-8")) || (streq(value,"utf8")) ChangeEncoding(CH_UTF8); + else if (streq(value,"windows-1251")) || (streq(value,"windows1251")) ChangeEncoding(CH_CP1251); + else if (streq(value,"dos")) || (streq(value,"cp-866")) ChangeEncoding(CH_CP866); + else if (streq(value,"iso-8859-5")) || (streq(value,"iso8859-5")) ChangeEncoding(CH_ISO8859_5); + else if (streq(value,"koi8-r")) || (streq(value,"koi8-u")) ChangeEncoding(CH_KOI8); } return; } @@ -520,6 +528,17 @@ void TWebBrowser::DrawScroller() scrollbar_v_draw(#scroll_wv); } //============================================================================================ +void TWebBrowser::ChangeEncoding(int _new_encoding) +{ + if (cur_encoding == _new_encoding) return; + cur_encoding = _new_encoding; + bufpointer = ChangeCharset(cur_encoding*10+#charsets, "CP866", bufpointer); + if (header) { + ChangeCharset(cur_encoding*10+#charsets, "CP866", #header); + DrawTitle(#header); + } +} +//============================================================================================ void TWebBrowser::NewLine() { dword onleft, ontop; diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index 3ba807ef7c..c5db8d4967 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -35,53 +35,12 @@ _history history; #include "history.h" bool debug_mode = false; #include "..\TWB\TWB.c" //HTML Parser, a core component +#include "texts.h" TWebBrowser WB1; -char version[]="WebView 2.1"; - -#ifdef LANG_RUS -char page_not_found[] = FROM "html\\page_not_found_ru.htm""\0"; -char homepage[] = FROM "html\\homepage_ru.htm""\0"; -char help[] = FROM "html\\help_ru.htm""\0"; -char accept_language[]= "Accept-Language: ru\n"; -char rmb_menu[] = -"ᬮ 室 -஢ 室"; -char main_menu[] = -" 䠩 - - - 㧮"; -char link_menu[] = -"஢ 뫪 - ᮤন 뫪"; -char loading_text[] = "㧪..."; -#else -char page_not_found[] = FROM "html\\page_not_found_en.htm""\0"; -char homepage[] = FROM "html\\homepage_en.htm""\0"; -char help[] = FROM "html\\help_en.htm""\0"; -char accept_language[]= "Accept-Language: en\n"; -char rmb_menu[] = -"View source -Edit source"; -char main_menu[] = -"Open local file -New window -History -Download Manager"; -char link_menu[] = -"Copy link -Download link contents"; -char loading_text[] = "Loading..."; -#endif - #define URL_SIZE 4000 -#define URL_SERVICE_HISTORY "WebView:history" -#define URL_SERVICE_HOMEPAGE "WebView:home" -#define URL_SERVICE_HELP "WebView:help" - #define PADDING 9 #define SKIN_Y 24 #define TSZE 25 @@ -157,7 +116,8 @@ void main() { int i, btn, redirect_count=0; LoadLibraries(); - CreateDir("/tmp0/1/downloads"); + CreateDir("/tmp0/1/Downloads"); + CreateDir("/tmp0/1/WebView_Cache"); Libimg_LoadImage(#skin, "/sys/toolbar.png"); HandleParam(); skin.h = 26; @@ -490,7 +450,10 @@ void OpenPage(dword _open_URL) history.add(#new_url); - if (!strncmp(#new_url,"WebView:",8)) { + if (pages_cache.have(#new_url)) { + LoadInternalPage(pages_cache.current_page_buf, pages_cache.pages_cache.current_page_size); + } + else if (!strncmp(#new_url,"WebView:",8)) { //INTERNAL PAGE if (!strcmp(#new_url, URL_SERVICE_HOMEPAGE)) LoadInternalPage(#homepage, sizeof(homepage)); else if (!strcmp(#new_url, URL_SERVICE_HELP)) LoadInternalPage(#help, sizeof(help)); diff --git a/programs/cmm/browser/texts.h b/programs/cmm/browser/texts.h new file mode 100644 index 0000000000..b681ba5b05 --- /dev/null +++ b/programs/cmm/browser/texts.h @@ -0,0 +1,42 @@ +char version[]="WebView 2.15"; + +#ifdef LANG_RUS +char page_not_found[] = FROM "html\\page_not_found_ru.htm""\0"; +char homepage[] = FROM "html\\homepage_ru.htm""\0"; +char help[] = FROM "html\\help_ru.htm""\0"; +char accept_language[]= "Accept-Language: ru\n"; +char rmb_menu[] = +"ᬮ 室 +஢ 室"; +char main_menu[] = +" 䠩 + + + 㧮"; +char link_menu[] = +"஢ 뫪 + ᮤন 뫪"; +char loading_text[] = "㧪..."; +#else +char page_not_found[] = FROM "html\\page_not_found_en.htm""\0"; +char homepage[] = FROM "html\\homepage_en.htm""\0"; +char help[] = FROM "html\\help_en.htm""\0"; +char accept_language[]= "Accept-Language: en\n"; +char rmb_menu[] = +"View source +Edit source"; +char main_menu[] = +"Open local file +New window +History +Download Manager"; +char link_menu[] = +"Copy link +Download link contents"; +char loading_text[] = "Loading..."; +#endif + +#define URL_SERVICE_HISTORY "WebView:history" +#define URL_SERVICE_HOMEPAGE "WebView:home" +#define URL_SERVICE_HELP "WebView:help" +