From 1df7b2fd4c07b92141e0afeb94aec341e4df2004 Mon Sep 17 00:00:00 2001 From: leency Date: Fri, 7 Mar 2025 00:58:03 +0100 Subject: [PATCH] Apps/webview: Version 3.8. Fixed

, new h3 style - `cmm/lib/collection.h`: fixed memory leak, more safe, optimizations; - webview: mostly fix

, new h3 style, some other updates. Reviewed-on: https://git.kolibrios.org/KolibriOS/kolibrios/pulls/115 --- programs/cmm/browser/TWB/TWB.c | 9 ++- programs/cmm/browser/TWB/links.h | 3 +- programs/cmm/browser/TWB/set_style.h | 21 ++++-- programs/cmm/browser/WebView.c | 20 ++++-- programs/cmm/browser/cache.h | 3 +- programs/cmm/browser/const.h | 33 +++++---- programs/cmm/browser/res/homepage_en.htm | 11 +-- programs/cmm/browser/res/homepage_ru.htm | 9 ++- programs/cmm/browser/tabs.h | 4 +- .../cmm/browser/{TWB => tests}/acid_0.1.htm | 0 programs/cmm/lib/collection.h | 67 +++++++++---------- programs/cmm/lib/encoding.h | 4 +- 12 files changed, 105 insertions(+), 79 deletions(-) rename programs/cmm/browser/{TWB => tests}/acid_0.1.htm (100%) diff --git a/programs/cmm/browser/TWB/TWB.c b/programs/cmm/browser/TWB/TWB.c index 06aa7fd2a..5d1159c8d 100644 --- a/programs/cmm/browser/TWB/TWB.c +++ b/programs/cmm/browser/TWB/TWB.c @@ -101,9 +101,12 @@ void TWebBrowser::SetPageDefaults() img_url.drop(); text_colors.drop(); text_colors.add(0); - bg_colors.drop(); - bg_colors.add(DEFAULT_BG_COL); - canvas.Fill(0, DEFAULT_BG_COL); + if (!secondrun) { + bg_colors.drop(); + bg_colors.add(DEFAULT_BG_COL); + } else { + canvas.Fill(0, bg_colors.get(0)); + } header = NULL; draw_y = BODY_MARGIN; draw_x = left_gap = BODY_MARGIN; diff --git a/programs/cmm/browser/TWB/links.h b/programs/cmm/browser/TWB/links.h index ab653eb29..21b4d2b75 100644 --- a/programs/cmm/browser/TWB/links.h +++ b/programs/cmm/browser/TWB/links.h @@ -45,9 +45,10 @@ void PAGE_LINKS::clear() w.drop(); h.drop(); underline_h.drop(); + id.drop(); + element_links.drop(); unic_links.drop(); - id.drop(); active = -1; active_url = 0; diff --git a/programs/cmm/browser/TWB/set_style.h b/programs/cmm/browser/TWB/set_style.h index 2d46f2268..8d140fadd 100644 --- a/programs/cmm/browser/TWB/set_style.h +++ b/programs/cmm/browser/TWB/set_style.h @@ -60,7 +60,8 @@ void TWebBrowser::SetStyle() void TWebBrowser::tag_p() { - IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) || (streq(#tag.prior,"p")) return; + IF (tag.prior[0] == 'h') || (streq(#tag.prior,"td")) return; + if (!tag.opened) && (streq(#tag.prior,"p")) return; NewLine(); } @@ -244,11 +245,19 @@ void TWebBrowser::tag_h1234_caption() } else { style.h = tag.opened; if (tag.opened) { - if (!style.pre) NewLine(); - draw_y += 10; - list.SetFont(BASIC_CHAR_W*2, 14*2, 10011001b); - list.item_h = BASIC_LINE_H * 2 - 2; - if (tag.is("h1")) style.b = true; + if (!style.pre) { + NewLine(); + NewLine(); + } + if (tag.is("h1")) { + list.SetFont(BASIC_CHAR_W*2, 14+12, 10011001b); + style.b = true; + } else if (tag.is("h2")) { + list.SetFont(BASIC_CHAR_W*2, 14+12, 10011001b); + } else { + list.SetFont(6*2, 9+7, 10001001b); + } + style.cur_line_h = list.item_h = list.font_h + 2; } else { if (tag.is("h1")) style.b = false; NewLine(); diff --git a/programs/cmm/browser/WebView.c b/programs/cmm/browser/WebView.c index 78afe3daf..6ecfb9986 100644 --- a/programs/cmm/browser/WebView.c +++ b/programs/cmm/browser/WebView.c @@ -337,6 +337,7 @@ void ProcessKeyEvent() { case SCAN_CODE_UP: EventScrollUpAndDown(SCAN_CODE_UP); return; case SCAN_CODE_DOWN: EventScrollUpAndDown(SCAN_CODE_DOWN); return; + case SCAN_CODE_F2: EventEditSource(); return; case SCAN_CODE_F6: {omnibox_edit.flags=ed_focus; DrawOmnibox();} return; case SCAN_CODE_F5: EventRefreshPage(); return; case SCAN_CODE_ENTER: if (omnibox_edit.flags & ed_focus) EventSubmitOmnibox(); return; @@ -571,7 +572,6 @@ void OpenPage(dword _open_URL) history.add(#new_url); WB1.custom_encoding = -1; if (streq(#new_url, URL_SERVICE_HOMEPAGE)) LoadInternalPage(#buildin_page_home, sizeof(buildin_page_home)); - else if (streq(#new_url, URL_SERVICE_HELP)) LoadInternalPage(#buildin_page_help, sizeof(buildin_page_help)); else if (streq(#new_url, URL_SERVICE_TEST)) LoadInternalPage(#buildin_page_test, sizeof(buildin_page_test)); else if (streq(#new_url, URL_SERVICE_HISTORY)) ShowHistory(); else LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error)); @@ -740,7 +740,12 @@ void LoadInternalPage(dword _bufdata, _in_bufsize){ WB1.DrawPage(); } http.hfree(); - if (WB1.img_url.count) { GetImg(true); DrawOmnibox(); } + if (WB1.img_url.count) { + GetImg(true); + DrawOmnibox(); + } else { + PageLoaded(); + } } } @@ -762,7 +767,7 @@ void DrawProgress() void EventShowPageMenu() { open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #rmb_menu); - menu_id = VIEW_SOURCE; + menu_id = BACK_BUTTON; } void EventShowLinkMenu() @@ -976,8 +981,13 @@ dword GetImg(bool _new) DrawStatusBar(T_RENDERING); WB1.Reparse(); WB1.DrawPage(); - debugln(sprintf(#param, T_DONE_IN_SEC, GetStartTime()-render_start_time/100)); - DrawStatusBar(NULL); + PageLoaded(); +} + +void PageLoaded() +{ + DrawStatusBar(sprintf(#param, T_DONE_IN_SEC, GetStartTime()-render_start_time/100, + GetStartTime()-render_start_time*10)); } stop: diff --git a/programs/cmm/browser/cache.h b/programs/cmm/browser/cache.h index cd7e77426..6c7c68cc4 100644 --- a/programs/cmm/browser/cache.h +++ b/programs/cmm/browser/cache.h @@ -16,7 +16,7 @@ struct _cache void add(); bool has(); void clear(); -} cache=0; +} cache; void _cache::add(dword _url, _data, _size, _type, _charset) { @@ -37,6 +37,7 @@ void _cache::add(dword _url, _data, _size, _type, _charset) bool _cache::has(dword _link) { int pos; + if (!url.count) return false; pos = url.get_pos_by_name(_link); if (pos != -1) { current_buf = data.get(pos); diff --git a/programs/cmm/browser/const.h b/programs/cmm/browser/const.h index bef4cb026..7b5ce7496 100644 --- a/programs/cmm/browser/const.h +++ b/programs/cmm/browser/const.h @@ -9,8 +9,11 @@ char buildin_page_home[] = FROM "res/homepage_ru.htm"; char buildin_page_help[] = FROM "res/help_ru.htm"; char accept_language[]= "Accept-Language: ru\n"; char rmb_menu[] = -"Посмотреть исходник|Ctrl+U -Редактировать исходник"; +"Back|Ctrl+< +Forward|Ctrl+> +- +Посмотреть исходник|Ctrl+U +Редактировать исходник|F2"; char main_menu[] = "Открыть файл...|Ctrl+O Новое окно|Ctrl+N @@ -34,7 +37,7 @@ char update_is_current[] = "'WebView\n char update_can_not_copy[] = "'WebView\nНе могу переместить новую версию из папки Downloads на Ramdisk. Возможно, не достаточно места.' -tE"; char clear_cache_ok[] = "'WebView\nКэш очищен.' -tI"; #define T_RENDERING "Рендеринг страницы..." -#define T_DONE_IN_SEC "Готово: %i сек" +#define T_DONE_IN_SEC "Готово: %i сек (%i милисек)" #else //===================================================// // // @@ -46,8 +49,11 @@ char buildin_page_home[] = FROM "res/homepage_en.htm"; char buildin_page_help[] = FROM "res/help_en.htm"; char accept_language[]= "Accept-Language: en\n"; char rmb_menu[] = -"View source|Ctrl+U -Edit source"; +"Back|Ctrl+< +Forward|Ctrl+> +- +View source|Ctrl+U +Edit source|F2"; char main_menu[] = "Open local file...|Ctrl+O New window|Ctrl+N @@ -70,7 +76,7 @@ char update_is_current[] = "'WebView\nThe browser is up to date.' -tI"; char update_can_not_copy[] = "'WebView\nError copying a new version from Downloads folder!\nProbably too litle space on Ramdisk.' -tE"; char clear_cache_ok[] = "'WebView\nThe cache has been cleared.' -tI"; #define T_RENDERING "Rendering..." -#define T_DONE_IN_SEC "Done in %i sec" +#define T_DONE_IN_SEC "Done in %i sec (%i milisec)" #endif //===================================================// @@ -83,7 +89,6 @@ char buildin_page_test[] = FROM "res/test.htm"; #define URL_SERVICE_HISTORY "WebView:history" #define URL_SERVICE_HOMEPAGE "WebView:home" -#define URL_SERVICE_HELP "WebView:help" #define URL_SERVICE_TEST "WebView:test" char webview_shared[] = "WEBVIEW"; @@ -91,12 +96,12 @@ char webview_shared[] = "WEBVIEW"; enum { NEW_TAB=600, ENCODINGS=700, - BACK_BUTTON=800, - FORWARD_BUTTON, REFRESH_BUTTON, GOTOURL_BUTTON, CHANGE_ENCODING, - SANDWICH_BUTTON, VIEW_SOURCE, EDIT_SOURCE, OPEN_FILE, - NEW_WINDOW, VIEW_HISTORY, DOWNLOAD_MANAGER, CLEAR_CACHE, - UPDATE_BROWSER, IN_NEW_TAB, IN_NEW_WINDOW, COPY_LINK_URL, - DOWNLOAD_LINK_CT, TAB_ID, + BACK_BUTTON=800, FORWARD_BUTTON, VIEW_SOURCE, EDIT_SOURCE, + REFRESH_BUTTON, GOTOURL_BUTTON, CHANGE_ENCODING, + SANDWICH_BUTTON, + OPEN_FILE, NEW_WINDOW, VIEW_HISTORY, DOWNLOAD_MANAGER, + CLEAR_CACHE, UPDATE_BROWSER, IN_NEW_TAB, IN_NEW_WINDOW, + COPY_LINK_URL, DOWNLOAD_LINK_CT, TAB_ID, TAB_CLOSE_ID = 900 }; @@ -107,4 +112,4 @@ char editbox_icons[] = FROM "res/editbox_icons.raw"; #define DEFAULT_URL URL_SERVICE_HOMEPAGE -char version[]="WebView 3.7"; \ No newline at end of file +char version[]="WebView 3.8"; \ No newline at end of file diff --git a/programs/cmm/browser/res/homepage_en.htm b/programs/cmm/browser/res/homepage_en.htm index 9a9c44541..77f5f175c 100644 --- a/programs/cmm/browser/res/homepage_en.htm +++ b/programs/cmm/browser/res/homepage_en.htm @@ -2,15 +2,16 @@ Homepage -

Bookmarks:
+
Welcome to WebView a Text-Based Browser. 
+
+Bookmarks:
 1. KolibriOS homepage
-2. KolibriN homepage
-3. Night-builds
-4. Kolibri Stuff
+2. Night-builds
+3. KolibriOS FTP
 
 By the way, 
 • You can check for browser updates from the main menu.
 • To run a web search, type a text in the adress box and press Ctrl+Enter. 
-• You can also use other Hotkeys.
+• Pressing F6 moves a text cursor to the omnibox.
 • Click on a label in the bottom right corner to change the encoding of a page.
 
diff --git a/programs/cmm/browser/res/homepage_ru.htm b/programs/cmm/browser/res/homepage_ru.htm
index 0c89c3f4b..6db213579 100644
--- a/programs/cmm/browser/res/homepage_ru.htm
+++ b/programs/cmm/browser/res/homepage_ru.htm
@@ -4,14 +4,13 @@
 Домашняя страница
 
 
Закладки:
-1. Домашняя страница KolibriOS
-2. KolibriN10
-3. Ночные сборки
-4. Kolibri Store
+1. Официальный сайт KolibriOS
+2. Ночные сборки
+3. KolibriOS FTP
 
 Кстати, 
 • Из главного меню можно проверить наличие обновлений
 • Для поиска в Google наберите тест в адресной строке и нажмите Ctrl+Enter
-• Есть также другие Горячие клавиши.
+• Клавиша F6 перемещает текстовый курсор в омнибокс.
 • Можно изменить кодировку страницы, для этого нажмите на надпись в правом нижнем углу окна.
 
diff --git a/programs/cmm/browser/tabs.h b/programs/cmm/browser/tabs.h
index bfb988983..f3a7de36b 100644
--- a/programs/cmm/browser/tabs.h
+++ b/programs/cmm/browser/tabs.h
@@ -7,8 +7,8 @@
 
 #define TABS_MAX 5
 
-TWebBrowser tabdata[TABS_MAX+1]=0;
-_history tabstory[TABS_MAX+1]=0;
+TWebBrowser tabdata[TABS_MAX+1];
+_history tabstory[TABS_MAX+1];
 
 struct TAB
 {
diff --git a/programs/cmm/browser/TWB/acid_0.1.htm b/programs/cmm/browser/tests/acid_0.1.htm
similarity index 100%
rename from programs/cmm/browser/TWB/acid_0.1.htm
rename to programs/cmm/browser/tests/acid_0.1.htm
diff --git a/programs/cmm/lib/collection.h b/programs/cmm/lib/collection.h
index f1a8f228c..d9699f237 100644
--- a/programs/cmm/lib/collection.h
+++ b/programs/cmm/lib/collection.h
@@ -13,7 +13,6 @@ struct collection_int
 	dword buf;
 	dword buf_size;
 	unsigned count;
-	void alloc();
 	void add();
 	dword get();
 	dword set();
@@ -22,34 +21,35 @@ struct collection_int
 	dword get_last();
 	void pop();
 	void drop();
+	#define DWSIZE4 4
 };
 
-:void collection_int::alloc() {
-	if (!buf) {
-		buf_size = 4096;
-		buf = malloc(4096);
-	} else {
-		buf_size += 4096;
-		buf = realloc(buf, buf_size);
-	}
-}
-
 :void collection_int::add(dword _in) {
-	if (!buf) || (count * sizeof(dword) >= buf_size) alloc();
-	EAX = count * sizeof(dword) + buf;
-	ESDWORD[EAX] = _in;
+	unsigned i;
+	if (!buf) {
+		//if (buf_size) notify("'buf_size on empty buf' -A");
+		buf_size = 4096 * 5;
+		buf = malloc(4096 * 5);
+		//if (!buf) notify("'malloc error' -E");
+	} else if (count + 1 * DWSIZE4 >= buf_size) {
+		buf_size += 4096 * 5;
+		buf = realloc(buf, buf_size);
+		//if (!buf) notify("'realloc error' -E");
+	}
+	i = count * DWSIZE4 + buf;
+	ESDWORD[i] = _in;
 	count++;
 }
 
 :dword collection_int::get(dword pos) {
-	if (pos<0) || (pos>=count) return 0;
-	return ESDWORD[pos * sizeof(dword) + buf];
+	if (!buf) || (pos<0) || (pos>=count) return 0;
+	return ESDWORD[pos * DWSIZE4 + buf];
 }
 
 
 :dword collection_int::set(dword pos, _in) {
 	while (pos >= count) add(0);
-	EAX = pos * sizeof(dword) + buf;
+	EAX = pos * DWSIZE4 + buf;
 	ESDWORD[EAX] = _in;
 	return ESDWORD[EAX];
 }
@@ -57,8 +57,8 @@ struct collection_int
 :void collection_int::swap(dword pos1, pos2) {
 	while (pos1 >= count) add(0);
 	while (pos2 >= count) add(0);
-	EAX = pos1 * sizeof(dword) + buf;
-	EBX = pos2 * sizeof(dword) + buf;
+	EAX = pos1 * DWSIZE4 + buf;
+	EBX = pos2 * DWSIZE4 + buf;
 	ESDWORD[EAX] >< ESDWORD[EBX];
 }
 
@@ -77,6 +77,8 @@ struct collection_int
 
 :void collection_int::drop() {
 	count = 0;
+	if (buf) buf = free(buf);
+	buf_size = 0;
 }
 
 /*========================================================
@@ -87,12 +89,11 @@ struct collection_int
 
 struct collection
 {
-	int realloc_size, count;
+	unsigned int realloc_size, count;
 	dword data_start;
 	dword data_size;
 	collection_int offset;
-	int add();
-	int addn();
+	dword add();
 	dword get(); //get_name_by_pos
 	dword get_pos_by_name();
 	void drop();
@@ -105,28 +106,22 @@ struct collection
 	if (realloc_size<4096) realloc_size = 4096;
 	if (!data_size) {
 		data_size = realloc_size;
-		data_start = malloc(realloc_size);		
-	}
-	else {
+		data_start = malloc(data_size);		
+	} else {
 		data_size = data_size + realloc_size;
 		data_start = realloc(data_start, data_size);
 	}
 }
 
-:int collection::add(dword in) {
-	return addn(in, strlen(in));
-}
-
-:int collection::addn(dword in, len) {
-	if (offset.get(count)+len+2 > data_size) {
+:dword collection::add(dword in) {
+	dword len = strlen(in);
+	while (offset.get(count) + len + 4 > data_size) {
 		increase_data_size();
-		addn(in, len);
-		return 1;
 	}
 	strncpy(data_start+offset.get(count), in, len);
 	count++;
 	offset.set(count, offset.get(count-1) + len + 1);
-	return 1;
+	return data_start+offset.get(count-1);
 }
 
 :dword collection::get(dword pos) {
@@ -141,7 +136,9 @@ struct collection
 :dword collection::get_pos_by_name(dword name) {
 	dword i;
 	for (i=0; i