Subversion Repositories Kolibri OS

Rev

Rev 8413 | Rev 8425 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7739 leency 1
//Copyright 2007-2020 by Veliant & Leency
6978 leency 2
//Asper, lev, Lrz, Barsuk, Nable, hidnplayr...
3067 leency 3
 
4085 leency 4
#ifndef AUTOBUILD
5
	#include "lang.h--"
6
#endif
7
 
8332 leency 8
//===================================================//
9
//                                                   //
10
//                       LIB                         //
11
//                                                   //
12
//===================================================//
13
 
8413 leency 14
#define MEMSIZE 1024 * 130
5499 leency 15
#include "..\lib\gui.h"
4508 leency 16
#include "..\lib\draw_buf.h"
17
#include "..\lib\list_box.h"
18
#include "..\lib\cursor.h"
5978 leency 19
#include "..\lib\collection.h"
6795 leency 20
#include "..\lib\random.h"
7037 leency 21
#include "..\lib\clipboard.h"
5981 leency 22
 
5499 leency 23
#include "..\lib\obj\box_lib.h"
7049 leency 24
#include "..\lib\obj\libimg.h"
5499 leency 25
#include "..\lib\obj\http.h"
5690 leency 26
#include "..\lib\obj\iconv.h"
7748 leency 27
#include "..\lib\obj\proc_lib.h"
8330 leency 28
#include "..\lib\obj\netcode.h"
7757 leency 29
 
5978 leency 30
#include "..\lib\patterns\history.h"
7748 leency 31
#include "..\lib\patterns\simple_open_dialog.h"
7759 leency 32
#include "..\lib\patterns\toolbar_button.h"
7914 leency 33
#include "..\lib\patterns\restart_process.h"
5408 leency 34
 
8336 leency 35
#include "const.h"
36
#include "cache.h"
37
#include "show_src.h"
38
 
8332 leency 39
//===================================================//
40
//                                                   //
41
//                       DATA                        //
42
//                                                   //
43
//===================================================//
8417 leency 44
char version[]="WebView 3.04";
8278 leency 45
 
8398 leency 46
#define DEFAULT_URL URL_SERVICE_HOMEPAGE
8016 leency 47
 
7757 leency 48
bool debug_mode = false;
8396 leency 49
bool show_images = true;
7771 leency 50
 
8016 leency 51
_history history;
52
 
7970 leency 53
enum { TARGET_SAME_TAB, TARGET_NEW_WINDOW, TARGET_NEW_TAB };
54
 
8330 leency 55
#include "TWB\TWB.c" //HTML Parser, a core component
7757 leency 56
 
7759 leency 57
TWebBrowser WB1;
7758 leency 58
 
7771 leency 59
#include "history.h"
7752 leency 60
 
7758 leency 61
#define PADDING 9
62
#define TSZE 25
7771 leency 63
#define STATUSBAR_H 15
64
#define TAB_H 20
7758 leency 65
dword TOOLBAR_H = PADDING+TSZE+PADDING+2;
4677 leency 66
 
7759 leency 67
_http http = 0;
7758 leency 68
 
7750 leency 69
bool source_mode = false;
7282 leency 70
 
8330 leency 71
progress_bar prbar;
7750 leency 72
proc_info Form;
7748 leency 73
 
8336 leency 74
#include "tabs.h"
75
 
76
dword cur_img_url;
77
dword shared_url;
78
dword http_get_type;
8365 leency 79
dword render_start_time;
7780 leency 80
int menu_id=NULL;
81
 
7748 leency 82
char default_dir[] = "/rd/1";
7788 leency 83
od_filter filter2 = { 22, "TXT\0HTM\0HTML\0DOCX\0\0" };
7748 leency 84
 
7755 leency 85
char editURL[URL_SIZE+1];
8332 leency 86
edit_box omnibox_edit = {, PADDING+TSZE*2+PADDING+6, PADDING+3, 0xffffff,
7758 leency 87
	0x94AECE, 0xffffff, 0xffffff,0x10000000,URL_SIZE-2,#editURL,0,,19,19};
4534 leency 88
 
8332 leency 89
//===================================================//
90
//                                                   //
91
//                       CODE                        //
92
//                                                   //
93
//===================================================//
94
 
7748 leency 95
void LoadLibraries()
96
{
8330 leency 97
	load_dll(boxlib,      #box_lib_init,0);
98
	load_dll(libimg,      #libimg_init,1);
99
	load_dll(libHTTP,     #http_lib_init,1);
100
	load_dll(iconv_lib,   #iconv_open,0);
101
	load_dll(netcode_lib, #base64_encode,0);
102
	load_dll(Proc_lib,    #OpenDialog_init,0);
7748 leency 103
	OpenDialog_init stdcall (#o_dialog);
104
}
105
 
106
void HandleParam()
107
{
8278 leency 108
	if (!param) {
8336 leency 109
		history.add(DEFAULT_URL);
8278 leency 110
	} else {
111
		if (!strncmp(#param, "-source ", 8)) {
7750 leency 112
			source_mode = true;
7765 leency 113
			history.add(#param + 8);
7936 leency 114
		} else if (!strncmp(#param, "-new ", 5)) {
115
			history.add(#param + 5);
7748 leency 116
		} else {
7914 leency 117
			if (GetProcessesCount("WEBVIEW") == 1) {
118
				history.add(#param);
119
			} else {
120
				shared_url = memopen(#webview_shared, URL_SIZE+1, SHM_OPEN + SHM_WRITE);
121
				strncpy(shared_url, #param, URL_SIZE);
122
				ExitProcess();
123
			}
7748 leency 124
		}
125
	}
7914 leency 126
	shared_url = memopen(#webview_shared, URL_SIZE+1, SHM_CREATE + SHM_WRITE);
7920 leency 127
	ESDWORD[shared_url] = '\0';
7748 leency 128
}
129
 
3067 leency 130
void main()
131
{
8332 leency 132
	int redirect_count=0;
7748 leency 133
	LoadLibraries();
134
	HandleParam();
6045 leency 135
	WB1.list.SetFont(8, 14, 10011000b);
5779 leency 136
	WB1.list.no_selection = true;
7759 leency 137
	WB1.custom_encoding = -1;
8332 leency 138
	@SetEventMask(EVM_REDRAW + EVM_KEY + EVM_BUTTON + EVM_MOUSE + EVM_MOUSE_FILTER + EVM_STACK);
7914 leency 139
	loop() switch(@WaitEventTimeout(30))
6978 leency 140
	{
141
		case evMouse:
8332 leency 142
			edit_box_mouse stdcall (#omnibox_edit);
6978 leency 143
			mouse.get();
7970 leency 144
 
7282 leency 145
			if (WB1.list.MouseScroll(mouse.vert)) WB1.DrawPage();
7970 leency 146
 
6978 leency 147
			scrollbar_v_mouse (#scroll_wv);
8330 leency 148
			if (scroll_wv.delta2) {
6978 leency 149
				WB1.list.first = scroll_wv.position;
150
				WB1.DrawPage();
3067 leency 151
				break;
6978 leency 152
			}
7970 leency 153
 
154
			if (links.hover(WB1.list.y, WB1.list.first))
7758 leency 155
			{
8330 leency 156
				if (mouse.key&MOUSE_MIDDLE) && (mouse.up) {
7970 leency 157
					if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT) {
158
						EventClickLink(TARGET_NEW_WINDOW);
159
					} else {
160
						EventClickLink(TARGET_NEW_TAB);
161
					}
162
				}
8330 leency 163
				if (mouse.key&MOUSE_LEFT) && (mouse.up) {
7970 leency 164
					CursorPointer.Restore();
165
					EventClickLink(TARGET_SAME_TAB);
166
				}
8330 leency 167
				if (mouse.key&MOUSE_RIGHT) && (mouse.up) {
7970 leency 168
					CursorPointer.Restore();
169
					EventShowLinkMenu();
170
				}
171
			} else {
172
				CursorPointer.Restore();
8330 leency 173
				if (mouse.key&MOUSE_RIGHT) && (mouse.up) && (WB1.list.MouseOver(mouse.x, mouse.y)) {
7970 leency 174
					EventShowPageMenu();
175
				}
7758 leency 176
			}
6978 leency 177
			break;
5711 leency 178
 
6978 leency 179
		case evButton:
8332 leency 180
			ProcessButtonClick( @GetButtonID() );
6978 leency 181
			break;
5711 leency 182
 
6978 leency 183
		case evKey:
8332 leency 184
			@GetKeys();
185
			edit_box_key stdcall(#omnibox_edit);
186
			ProcessKeyEvent();
6978 leency 187
			break;
188
 
189
		case evReDraw:
8332 leency 190
			DefineAndDrawWindow(GetScreenWidth()-800/2-random(80),
7755 leency 191
				GetScreenHeight()-700/2-random(80),800,700,0x73,0,0,0);
6978 leency 192
			GetProcessInfo(#Form, SelfInfo);
7780 leency 193
			ProcessMenuClick();
7806 leency 194
			sc.get();
7759 leency 195
			if (Form.status_window>2) break;
6978 leency 196
			if (Form.height<120) { MoveSize(OLD,OLD,OLD,120); break; }
197
			if (Form.width<280) { MoveSize(OLD,OLD,280,OLD); break; }
7748 leency 198
			draw_window();
6978 leency 199
			break;
200
 
201
		case evNetwork:
7758 leency 202
			if (http.transfer <= 0) break;
203
			http.receive();
8336 leency 204
 
205
			if (http_get_type==PAGE) {
206
				CheckContentType();
207
				prbar.max = http.content_length;
208
				if (prbar.value != http.content_received) {
209
					prbar.value = http.content_received;
210
					DrawProgress();
211
				}
212
			}
213
 
7758 leency 214
			if (http.receive_result != 0) break;
8413 leency 215
			if (debug_mode) debugval("HTTP", http.status_code);
7758 leency 216
			if (http.status_code >= 300) && (http.status_code < 400)
217
			{
218
				// Handle redirects
219
				if (redirect_count<=5) {
220
					redirect_count++;
8305 leency 221
					HandleRedirect();
7758 leency 222
				} else {
223
					notify("'Too many redirects.' -E");
224
					StopLoading();
7791 leency 225
					redirect_count = 0;
4536 leency 226
				}
7758 leency 227
			} else {
228
				// Loading the page is complete, free resources
229
				redirect_count = 0;
8291 leency 230
				http.hfree();
8016 leency 231
				if (http_get_type==PAGE) {
8413 leency 232
					history.add(http.cur_url);
233
					cache.add(http.cur_url, http.content_pointer, http.content_received, PAGE);
8016 leency 234
					LoadInternalPage(http.content_pointer, http.content_received);
235
				}
236
				else if (http_get_type==IMG) {
8336 leency 237
					cache.add(cur_img_url, http.content_pointer, http.content_received, IMG);
238
					GetImg(false);
8016 leency 239
				}
6978 leency 240
			}
7914 leency 241
			break;
242
		default:
243
			if (ESDWORD[shared_url] != '\0') {
244
				EventOpenNewTab(shared_url);
245
				ESDWORD[shared_url] = '\0';
246
				ActivateWindow(GetProcessSlot(Form.ID));
247
			}
6978 leency 248
	}
3067 leency 249
}
250
 
8332 leency 251
 
252
//===================================================//
253
//                                                   //
254
//                      EVENTS                       //
255
//                                                   //
256
//===================================================//
257
 
258
void ProcessButtonClick(dword id__)
7772 leency 259
{
8332 leency 260
	switch (id__)
261
	{
262
		case 1: ExitProcess();
263
		case TAB_CLOSE_ID...TAB_CLOSE_ID+TABS_MAX: EventTabClose(id__ - TAB_CLOSE_ID); return;
264
		case TAB_ID...TAB_ID+TABS_MAX: EventAllTabsClick(id__ - TAB_ID); return;
265
		case ENCODINGS...ENCODINGS+6: EventChangeEncodingAndLoadPage(id__-ENCODINGS); return;
266
		case NEW_WINDOW:       RunProgram(#program_path, NULL); return;
267
		case NEW_TAB:          if (!http.transfer) EventOpenNewTab(URL_SERVICE_HOMEPAGE); return;
268
		case SCAN_CODE_BS:
269
		case BACK_BUTTON:      if (history.back()) OpenPage(history.current()); return;
270
		case FORWARD_BUTTON:   if (history.forward()) OpenPage(history.current()); return;
271
		case GOTOURL_BUTTON:   EventSubmitOmnibox();	return;
272
		case REFRESH_BUTTON:   EventRefreshPage(); return;
273
		case CHANGE_ENCODING:  EventShowEncodingsList(); return;
274
		case SANDWICH_BUTTON:  EventShowMainMenu(); return;
275
		case VIEW_SOURCE:      EventViewSource(); return;
276
		case EDIT_SOURCE:      EventEditSource(); return;
277
		case VIEW_HISTORY:     OpenPage(URL_SERVICE_HISTORY); return;
278
		case DOWNLOAD_MANAGER: EventOpenDownloader(""); return;
279
		case UPDATE_BROWSER:   EventUpdateBrowser(); return;
280
		case CLEAR_CACHE:      EventClearCache(); return;
281
		case IN_NEW_TAB:       EventClickLink(TARGET_NEW_TAB); return;
282
		case IN_NEW_WINDOW:    EventClickLink(TARGET_NEW_WINDOW); return;
283
		case COPY_LINK_URL:    EventCopyLinkToClipboard(); return;
284
		case DOWNLOAD_LINK_CT: EventOpenDownloader( GetAbsoluteActiveURL() ); return;
285
		case OPEN_FILE:        EventOpenDialog(); return;
286
	}
287
}
288
 
289
bool ProcessKeyEvent()
290
{
291
	if (key_modifier&KEY_LSHIFT) || (key_modifier&KEY_RSHIFT)
292
	{
293
		if (key_scancode == SCAN_CODE_TAB) {EventActivatePreviousTab();return;}
294
	}
295
 
7772 leency 296
	if (key_modifier&KEY_LCTRL) || (key_modifier&KEY_RCTRL) switch(key_scancode)
297
	{
8016 leency 298
		case SCAN_CODE_KEY_O: EventOpenDialog(); return true;
8332 leency 299
		case SCAN_CODE_KEY_H: ProcessButtonClick(VIEW_HISTORY); return true;
8016 leency 300
		case SCAN_CODE_KEY_U: EventViewSource(); return true;
301
		case SCAN_CODE_KEY_T: EventOpenNewTab(URL_SERVICE_HOMEPAGE); return true;
302
		case SCAN_CODE_KEY_N: RunProgram(#program_path, NULL); return true;
8332 leency 303
		case SCAN_CODE_KEY_J: ProcessButtonClick(DOWNLOAD_MANAGER); return true;
304
		case SCAN_CODE_KEY_R: ProcessButtonClick(REFRESH_BUTTON); return true;
8016 leency 305
		case SCAN_CODE_ENTER: EventSeachWeb(); return true;
8332 leency 306
		case SCAN_CODE_LEFT:  ProcessButtonClick(BACK_BUTTON); return true;
307
		case SCAN_CODE_RIGHT: ProcessButtonClick(FORWARD_BUTTON); return true;
8016 leency 308
		case SCAN_CODE_KEY_W: EventCloseActiveTab(); return true;
309
		case SCAN_CODE_TAB:   EventActivateNextTab(); return true;
8336 leency 310
		case SCAN_CODE_F5:    EventClearCache(); return;
8016 leency 311
		default: return false;
7772 leency 312
	}
8332 leency 313
 
314
	switch(key_scancode)
315
	{
316
		case SCAN_CODE_UP:    EventScrollUpAndDown(SCAN_CODE_UP); return;
317
		case SCAN_CODE_DOWN:  EventScrollUpAndDown(SCAN_CODE_DOWN); return;
318
		case SCAN_CODE_F6:    {omnibox_edit.flags=ed_focus; DrawOmnibox();} return;
319
		case SCAN_CODE_F5:    EventRefreshPage(); return;
320
		case SCAN_CODE_ENTER: if (omnibox_edit.flags & ed_focus) EventSubmitOmnibox(); return;
321
		case SCAN_CODE_F12:   EventToggleDebugMode(); return;
322
		case SCAN_CODE_F11:   show_images^=1; EventClearCache(); return;
323
		default:              if (WB1.list.ProcessKey(key_scancode)) WB1.DrawPage(); return;
324
	}
7772 leency 325
}
326
 
3067 leency 327
void SetElementSizes()
328
{
8332 leency 329
	omnibox_edit.width = Form.cwidth - omnibox_edit.left - 52 - 16;
7771 leency 330
	WB1.list.SetSizes(0, TOOLBAR_H+TAB_H, Form.width - 10 - scroll_wv.size_x,
331
		Form.cheight - TOOLBAR_H - STATUSBAR_H - TAB_H, BASIC_LINE_H);
7759 leency 332
	WB1.list.wheel_size = 7 * BASIC_LINE_H;
7746 leency 333
	WB1.list.column_max = WB1.list.w - scroll_wv.size_x / WB1.list.font_w + 1;
6794 leency 334
	WB1.list.visible = WB1.list.h;
3067 leency 335
}
336
 
5981 leency 337
 
7748 leency 338
void draw_window()
3067 leency 339
{
7910 leency 340
	bool burger_active = false;
341
	if (menu_id == OPEN_FILE) burger_active = true;
342
 
3067 leency 343
	SetElementSizes();
7758 leency 344
 
7806 leency 345
	DrawBar(0,0, Form.cwidth,PADDING, sc.work);
346
	DrawBar(0,PADDING+TSZE+1, Form.cwidth,PADDING-1, sc.work);
347
	DrawBar(0,TOOLBAR_H-2, Form.cwidth,1, MixColors(sc.work_dark, sc.work, 180));
348
	DrawBar(0,TOOLBAR_H-1, Form.cwidth,1, sc.work_graph);
8332 leency 349
	DrawBar(0, PADDING, omnibox_edit.left-2, TSZE+1, sc.work);
350
	DrawBar(omnibox_edit.left+omnibox_edit.width+18, PADDING, Form.cwidth-omnibox_edit.left-omnibox_edit.width-18, TSZE+1, sc.work);
7758 leency 351
 
7910 leency 352
	DrawTopPanelButton(BACK_BUTTON, PADDING-1, PADDING, 30, false);
353
	DrawTopPanelButton(FORWARD_BUTTON, PADDING+TSZE+PADDING-2, PADDING, 31, false);
354
	DrawTopPanelButton(SANDWICH_BUTTON, Form.cwidth-PADDING-TSZE-3, PADDING, -1, burger_active); //burger menu
7758 leency 355
 
7806 leency 356
	DrawBar(0,Form.cheight - STATUSBAR_H, Form.cwidth,1, sc.work_graph);
7758 leency 357
 
358
	DrawRectangle(WB1.list.x + WB1.list.w, WB1.list.y, scroll_wv.size_x,
359
		WB1.list.h-1, scroll_wv.bckg_col);
360
 
7771 leency 361
	if (!BrowserWidthChanged()) {
362
		WB1.DrawPage();
363
		DrawOmnibox();
364
	}
365
	DrawProgress();
8413 leency 366
	DrawStatusBar(NULL);
7771 leency 367
	DrawTabsBar();
368
}
369
 
370
bool BrowserWidthChanged()
371
{
372
	dword source_mode_holder;
373
	if (WB1.list.w!=DrawBuf.bufw) {
374
		DrawBuf.Init(WB1.list.x, WB1.list.y, WB1.list.w, 400*20);
7758 leency 375
		if (!strncmp(history.current(),"http",4)) {
7759 leency 376
			//nihuya ne izyashnoe reshenie, no pust' poka butet tak
7771 leency 377
			source_mode_holder = source_mode;
7758 leency 378
			LoadInternalPage(#loading_text, sizeof(loading_text));
7771 leency 379
			source_mode = source_mode_holder;
7758 leency 380
		}
381
		OpenPage(history.current());
7771 leency 382
		return true;
7282 leency 383
	}
7771 leency 384
	return false;
3067 leency 385
}
386
 
7771 leency 387
 
7759 leency 388
void EventChangeEncodingAndLoadPage(int _new_encoding)
389
{
390
	dword newbuf, newsize;
391
	WB1.custom_encoding = _new_encoding;
392
	newsize = strlen(WB1.o_bufpointer);
393
	newbuf = malloc(newsize);
394
	memmov(newbuf, WB1.o_bufpointer, newsize);
395
	LoadInternalPage(newbuf, newsize);
396
	free(newbuf);
397
}
3067 leency 398
 
7759 leency 399
 
8332 leency 400
void EventScrollUpAndDown(int _direction)
4413 leency 401
{
8332 leency 402
	int i;
403
	for (i=0;i
404
		if (_direction == SCAN_CODE_UP) WB1.list.KeyUp();
405
		if (_direction == SCAN_CODE_DOWN) WB1.list.KeyDown();
406
	}
407
	WB1.DrawPage();
4413 leency 408
}
409
 
8305 leency 410
void EventToggleDebugMode()
411
{
412
	debug_mode ^= 1;
413
	if (debug_mode) notify("'Debug mode ON'-I");
414
	else notify("'Debug mode OFF'-I");
415
}
416
 
417
void EventAllTabsClick(dword _n)
418
{
419
	if (http.transfer) return;
420
	if (mouse.mkm) {
421
		EventTabClose(_n);
422
	} else {
423
		EventTabClick(_n);
8355 leency 424
	}
8305 leency 425
}
426
 
427
void EventEditSource()
428
{
429
	if (check_is_the_adress_local(history.current())) {
8330 leency 430
		RunProgram("/rd/1/quark", history.current());
8305 leency 431
	} else {
432
		CreateFile(WB1.bufsize, WB1.bufpointer, "/tmp0/1/WebView_tmp.htm");
8330 leency 433
		if (!EAX) RunProgram("/rd/1/quark", "/tmp0/1/WebView_tmp.htm");
8305 leency 434
	}
435
}
436
 
437
void EventClearCache()
438
{
439
	cache.clear();
440
	notify(#clear_cache_ok);
441
	EventRefreshPage();
442
}
443
 
444
void EventCopyLinkToClipboard()
445
{
446
	Clipboard__CopyText(GetAbsoluteActiveURL());
447
	notify("'URL copied to clipboard'O");
448
}
449
 
4636 leency 450
void StopLoading()
451
{
8305 leency 452
	if (http.stop()) pause(10);
8330 leency 453
	prbar.value = 0;
4645 leency 454
}
455
 
7756 leency 456
//rewrite into
7757 leency 457
//bool strrpl(dword dst, from, into, dst_len);
458
bool ReplaceSpaceInUrl(dword url, size) {
7756 leency 459
	unsigned int i, j;
7757 leency 460
	bool was_changed=false;
461
	for (i=url+size-3; i>url; i--)
7720 leency 462
	{
7756 leency 463
		if (ESBYTE[i]!=' ') continue;
7757 leency 464
		for (j=url+size-3; j>=i; j--) {
465
			ESBYTE[j+3]=ESBYTE[j+2];
7756 leency 466
			ESBYTE[j+2]=ESBYTE[j+1];
467
			ESBYTE[j+1]=ESBYTE[j];
468
		}
469
		ESBYTE[i] = '%';
470
		ESBYTE[i+1] = '2';
471
		ESBYTE[i+2] = '0';
7757 leency 472
		was_changed = true;
7720 leency 473
	}
7757 leency 474
	return was_changed;
7720 leency 475
}
476
 
7801 leency 477
bool HandleUrlFiles(dword _path, _data)
478
{
479
	dword url_from_file;
480
	if (!UrlExtIs(_path, "url")) return false;
7945 leency 481
	if (! url_from_file = strstri(_data, "URL=")) return false;
7801 leency 482
	replace_char(url_from_file, '\n', '\0', strlen(url_from_file));
7945 leency 483
	OpenPage(url_from_file);
484
	return true;
7801 leency 485
}
486
 
7755 leency 487
bool GetLocalFileData(dword _path)
4416 leency 488
{
7801 leency 489
	dword data, size;
8392 leency 490
	read_file(_path, #data, #size);
7801 leency 491
	if (!HandleUrlFiles(_path, data)) {
492
		LoadInternalPage(data, size);
4692 leency 493
	}
7801 leency 494
	free(data);
495
	return true;
7755 leency 496
}
7282 leency 497
 
8336 leency 498
bool GetUrl(dword _http_url)
8330 leency 499
{
500
	char new_url_full[URL_SIZE+1];
501
 
502
	if (!strncmp(_http_url,"http:",5)) {
503
		http.get(_http_url);
8336 leency 504
		return true;
8330 leency 505
	} else if (!strncmp(_http_url,"https://",8)) {
506
		strcpy(#new_url_full, "http://gate.aspero.pro/?site=");
507
		strncat(#new_url_full, _http_url, URL_SIZE);
508
		http.get(#new_url_full);
8336 leency 509
		return true;
8330 leency 510
	}
8336 leency 511
	return false;
8330 leency 512
}
513
 
7755 leency 514
void OpenPage(dword _open_URL)
515
{
516
	char new_url[URL_SIZE+1];
7788 leency 517
	int unz_id;
7755 leency 518
 
519
	StopLoading();
520
 
7771 leency 521
	SetOmniboxText(_open_URL);
522
 
7755 leency 523
	strncpy(#new_url, _open_URL, URL_SIZE);
524
 
525
	//Exclude # from the URL to the load page
526
	//We will bring it back when we get the buffer
7970 leency 527
	if (strrchr(#new_url, '#')) {
528
		anchors.take_anchor_from(#new_url);
529
	}
7755 leency 530
 
7976 leency 531
	/*
532
	There could be several possible types of addresses:
533
	- cached page (only http/https)
534
	- internal page
535
	- web page
536
	- local file
537
	So we need to detect what incoming address is
538
	and then halndle it in the propper way.
539
	*/
540
 
8016 leency 541
	if (cache.has(#new_url)) {
7764 leency 542
		//CACHED PAGE
8413 leency 543
		if (cache.current_type==PAGE) {
544
			history.add(#new_url);
545
			LoadInternalPage(cache.current_buf, cache.current_size);
546
		}
547
		else {
548
			EventDownloadAndOpenImage(#new_url);
549
		}
7764 leency 550
 
551
	} else if (!strncmp(#new_url,"WebView:",8)) {
7755 leency 552
		//INTERNAL PAGE
8413 leency 553
		history.add(#new_url);
8278 leency 554
		if (streq(#new_url, URL_SERVICE_HOMEPAGE)) LoadInternalPage(#buildin_page_home, sizeof(buildin_page_home));
555
		else if (streq(#new_url, URL_SERVICE_HELP)) LoadInternalPage(#buildin_page_help, sizeof(buildin_page_help));
7976 leency 556
		else if (streq(#new_url, URL_SERVICE_HISTORY)) ShowHistory();
8278 leency 557
		else LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
7800 leency 558
 
7755 leency 559
	} else if (!strncmp(#new_url,"http:",5)) || (!strncmp(#new_url,"https:",6)) {
560
		//WEB PAGE
7757 leency 561
		if (ReplaceSpaceInUrl(#new_url, URL_SIZE)) {
562
			strcpy(#editURL, #new_url);
563
		}
564
 
8016 leency 565
		http_get_type = PAGE;
8330 leency 566
		GetUrl(#new_url);
7758 leency 567
 
568
		DrawOmnibox();
569
 
7755 leency 570
		if (!http.transfer) {
8413 leency 571
			history.add(#new_url);
8278 leency 572
			LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
4646 leency 573
		}
7755 leency 574
	} else {
575
		//LOCAL PAGE
8413 leency 576
		history.add(#new_url);
7788 leency 577
		if (UrlExtIs(#new_url,".docx")) {
578
			DeleteFile("/tmp0/1/temp/word/document.xml");
579
			CreateDir("/tmp0/1/temp");
580
			unz_id = RunProgram("/sys/unz", sprintf(#param, "-o \"/tmp0/1/temp\" -h \"%s\"", #new_url));
581
			while (GetProcessSlot(unz_id)) pause(2);
582
			strcpy(#new_url, "/tmp0/1/temp/word/document.xml");
583
		}
7755 leency 584
		if (!GetLocalFileData(#new_url)) {
8278 leency 585
			LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
4650 leency 586
		}
4636 leency 587
	}
4416 leency 588
}
4415 leency 589
 
8278 leency 590
dword EventOpenDownloader(dword _url)
591
{
592
	//char download_params[URL_SIZE+50];
593
	return RunProgram("/sys/network/dl", _url);
594
}
7970 leency 595
 
596
bool EventClickAnchor()
4508 leency 597
{
7970 leency 598
	dword aURL = links.active_url;
599
 
600
	if (anchors.get_pos_by_name(aURL+1)!=-1) {
601
		WB1.list.first = anchors.get_pos_by_name(aURL+1);
8417 leency 602
		WB1.list.CheckDoesValuesOkey();
7970 leency 603
		strcpy(#editURL, history.current());
604
		strcat(#editURL, aURL);
605
		DrawOmnibox();
606
		WB1.DrawPage();
607
		return true;
608
	}
609
	return false;
610
}
611
 
612
void EventClickLink(dword _target)
613
{
7756 leency 614
	char new_url[URL_SIZE+1];
7936 leency 615
	char new_url_full[URL_SIZE+1];
7970 leency 616
	dword aURL = GetAbsoluteActiveURL();
617
	if (!aURL) return;
4415 leency 618
 
7970 leency 619
	strcpy(#new_url, aURL);
620
 
621
	if (ESBYTE[aURL]=='#') {
622
		if (_target == TARGET_SAME_TAB) {
623
			EventClickAnchor();
624
			return;
625
		} else {
626
			strcpy(#new_url, history.current());
627
			strcat(#new_url, aURL);
628
		}
629
	}
630
 
631
	if (_target == TARGET_NEW_TAB) {
632
		EventOpenNewTab(#new_url);
7758 leency 633
		return;
634
	}
635
 
7970 leency 636
	if (_target == TARGET_NEW_WINDOW) {
637
		strcpy(#new_url_full, "-new ");
638
		strncat(#new_url_full, #new_url, URL_SIZE);
639
		RunProgram(#program_path, #new_url_full);
7755 leency 640
		return;
5768 leency 641
	}
7742 leency 642
 
7970 leency 643
	if (!strncmp(#new_url,"mailto:", 7)) || (!strncmp(#new_url,"tel:", 4)) {
644
		notify(#new_url);
7755 leency 645
		return;
7742 leency 646
	}
4508 leency 647
 
7771 leency 648
	if (http.transfer) {
5774 leency 649
		StopLoading();
650
	}
6730 leency 651
 
7755 leency 652
	if (strrchr(#new_url, '#')!=0) {
653
		anchors.take_anchor_from(#new_url);
654
		OpenPage(#new_url);
6730 leency 655
		return;
656
	}
657
 
7755 leency 658
	if (!strncmp(#new_url,"WebView:",8)) {
659
		OpenPage(#new_url);
7742 leency 660
		return;
661
	}
6730 leency 662
 
7755 leency 663
	if (strncmp(#new_url,"http://",7)!=0) && (strncmp(#new_url,"https://",8)!=0)
5774 leency 664
	{
7755 leency 665
		if (UrlExtIs(#new_url,".htm")!=true) && (UrlExtIs(#new_url,".html")!=true)
6730 leency 666
		{
7755 leency 667
			if (strchr(#new_url, '|')) {
668
				ESBYTE[strchr(#new_url, '|')] = NULL;
669
				RunProgram(#new_url, strlen(#new_url)+1+#new_url);
670
			} else {
671
				RunProgram("/sys/@open", #new_url);
7422 leency 672
			}
6730 leency 673
			return;
674
		}
5774 leency 675
	}
7755 leency 676
	OpenPage(#new_url);
677
}
678
 
679
void EventSubmitOmnibox()
680
{
681
	char new_url[URL_SIZE+1];
682
	if (!editURL[0]) return;
683
	if (!strncmp(#editURL,"http:",5)) || (editURL[0]=='/')
684
	|| (!strncmp(#editURL,"https:",6)) || (!strncmp(#editURL,"WebView:",8)) {
685
		OpenPage(#editURL);
686
	} else {
687
		strcpy(#new_url, "http://");
7970 leency 688
		strncat(#new_url, #editURL, URL_SIZE-1);
7755 leency 689
		OpenPage(#new_url);
6931 leency 690
	}
5774 leency 691
}
692
 
7755 leency 693
void LoadInternalPage(dword _bufdata, _in_bufsize){
694
	if (!_bufdata) || (!_in_bufsize) {
8278 leency 695
		LoadInternalPage(#buildin_page_error, sizeof(buildin_page_error));
7755 leency 696
	} else {
697
		WB1.list.first = 0; //scroll page to the top
698
		DrawOmnibox();
699
		if(!strrchr(#editURL, '#')) {
700
			strcat(#editURL, #anchors.current);
701
			DrawOmnibox();
702
		}
8365 leency 703
		render_start_time = GetStartTime();
7759 leency 704
		WB1.ParseHtml(_bufdata, _in_bufsize);
8302 leency 705
		// REJECTED. Reason: infinite redirect at Google Results.
706
		/*
707
		if (WB1.redirect) { //
708
			get_absolute_url(#WB1.redirect, history.current());
709
			history.back();
710
			OpenPage(#WB1.redirect);
711
		}
712
		*/
8413 leency 713
		DrawStatusBar(NULL);
7771 leency 714
		DrawActiveTab();
7756 leency 715
		if (source_mode) {
716
			source_mode = false;
7799 leency 717
			WB1.custom_encoding = CH_CP866;
7759 leency 718
			ShowSource(WB1.bufpointer, _in_bufsize);
7757 leency 719
		} else {
8016 leency 720
			WB1.DrawPage();
7756 leency 721
		}
8396 leency 722
		if (WB1.img_url.count) GetImg(true);
7742 leency 723
	}
724
}
725
 
7799 leency 726
bool UrlExtIs(dword base, ext)
7742 leency 727
{
7755 leency 728
	if (!strcmpi(base + strlen(base) - strlen(ext), ext)) return true;
7742 leency 729
	return false;
730
}
731
 
732
void DrawProgress()
733
{
8330 leency 734
	dword pct;
735
	if (!http.transfer) return;
736
	if (http_get_type==PAGE) && (prbar.max) pct = prbar.value*30/prbar.max; else pct = 10;
8336 leency 737
	if (http_get_type==IMG) pct = prbar.value * 70 / prbar.max + 30;
8332 leency 738
	DrawBar(omnibox_edit.left-1, omnibox_edit.top+20, pct*omnibox_edit.width+16/100, 2, 0x72B7EB);
7742 leency 739
}
740
 
7770 leency 741
void EventShowPageMenu()
6782 leency 742
{
8020 leency 743
	open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #rmb_menu);
7780 leency 744
	menu_id = VIEW_SOURCE;
6782 leency 745
}
746
 
7770 leency 747
void EventShowLinkMenu()
7759 leency 748
{
8020 leency 749
	open_lmenu(mouse.x, mouse.y, MENU_TOP_LEFT, NULL, #link_menu);
7789 simsanutiy 750
	menu_id = IN_NEW_TAB;
7759 leency 751
}
752
 
7780 leency 753
void EventShowMainMenu()
754
{
8020 leency 755
	open_lmenu(Form.cwidth - PADDING -4, PADDING + TSZE + 3,
756
		MENU_TOP_RIGHT, NULL, #main_menu);
7780 leency 757
	menu_id = OPEN_FILE;
758
}
759
 
7770 leency 760
void EventShowEncodingsList()
7758 leency 761
{
8020 leency 762
	open_lmenu(Form.cwidth-4, Form.cheight - STATUSBAR_H + 12,
763
		MENU_BOT_RIGHT, WB1.cur_encoding + 1,
764
		"UTF-8\nKOI8-RU\nCP1251\nCP1252\nISO8859-5\nCP866");
7780 leency 765
	menu_id = ENCODINGS;
7758 leency 766
}
767
 
7780 leency 768
void ProcessMenuClick()
6795 leency 769
{
7780 leency 770
	int click_id;
7910 leency 771
	if (menu_id) {
772
		if (click_id = get_menu_click()) {
773
			click_id += menu_id - 1;
8332 leency 774
			ProcessButtonClick(click_id);
7910 leency 775
		}
776
		if (!menu_process_id) menu_id = NULL;
7780 leency 777
	}
6795 leency 778
}
779
 
7743 leency 780
void EventSeachWeb()
781
{
7755 leency 782
	char new_url[URL_SIZE+1];
783
	replace_char(#editURL, ' ', '_', URL_SIZE);
784
	strcpy(#new_url, "https://www.google.com/search?q=");
785
	strncat(#new_url, #editURL, URL_SIZE);
786
	OpenPage(#new_url);
7743 leency 787
}
788
 
7748 leency 789
void EventOpenDialog()
790
{
791
	OpenDialog_start stdcall (#o_dialog);
792
	if (o_dialog.status) {
7755 leency 793
		OpenPage(#openfile_path);
7748 leency 794
	}
795
}
796
 
7750 leency 797
void EventViewSource()
798
{
7771 leency 799
	source_mode = true;
800
	EventOpenNewTab(history.current());
7750 leency 801
}
802
 
7893 leency 803
void EventRefreshPage()
804
{
805
	if (http.transfer) {
806
		StopLoading();
807
		draw_window();
808
	} else {
809
		OpenPage(history.current());
810
	}
811
}
812
 
7765 leency 813
void EventUpdateBrowser()
814
{
815
	dword downloader_id, slot_n;
816
	dword current_size;
817
	dword new_size;
818
 
819
	draw_window();
820
 
8278 leency 821
	downloader_id = EventOpenDownloader(#update_param);
7765 leency 822
	do {
823
		slot_n = GetProcessSlot(downloader_id);
824
		pause(10);
825
	} while (slot_n!=0);
826
 
8392 leency 827
	current_size = get_file_size(#program_path);
828
	new_size = get_file_size("/tmp0/1/Downloads/WebView.com");
7765 leency 829
 
8413 leency 830
	if (!new_size) || (new_size<5000) { notify(#update_download_error); return; }
831
	if (current_size == new_size) { notify(#update_is_current);	return; }
7765 leency 832
 
8332 leency 833
	if (CopyFileAtOnce(new_size, "/tmp0/1/Downloads/WebView.com", #program_path)) {
7765 leency 834
		notify(#update_can_not_copy);
835
	} else {
836
		notify(#update_ok);
837
		RunProgram(#program_path, history.current());
838
		ExitProcess();
839
	}
840
}
841
 
8413 leency 842
void DrawStatusBar(dword _msg)
6795 leency 843
{
7970 leency 844
	dword status_y = Form.cheight - STATUSBAR_H + 4;
845
	dword status_w = Form.cwidth - 90;
8417 leency 846
	if (Form.status_window>2) return;
7806 leency 847
	DrawBar(0,Form.cheight - STATUSBAR_H+1, Form.cwidth,STATUSBAR_H-1, sc.work);
8413 leency 848
	if (_msg) {
849
		ESI = math.min(status_w/6, strlen(_msg));
850
		WriteText(10, status_y, 0, sc.work_text, _msg);
7758 leency 851
	}
7970 leency 852
	DefineHiddenButton(status_w+20, status_y-3, 60, 12, CHANGE_ENCODING);
853
	WriteTextCenter(status_w+20, status_y, 60, sc.work_text, WB1.cur_encoding*10+#charsets);
7758 leency 854
}
855
 
856
void DrawOmnibox()
857
{
7784 leency 858
	int imgxoff;
7758 leency 859
 
8332 leency 860
	DrawOvalBorder(omnibox_edit.left-2, omnibox_edit.top-3, omnibox_edit.width+18, 24, sc.work_graph,
7806 leency 861
		sc.work_graph, sc.work_graph, sc.work_dark);
8332 leency 862
	DrawBar(omnibox_edit.left-1, omnibox_edit.top-2, omnibox_edit.width+18, 1, 0xD8DCD8);
863
	DrawBar(omnibox_edit.left-1, omnibox_edit.top-1, omnibox_edit.width+18, 1, omnibox_edit.color);
864
	DrawBar(omnibox_edit.left-1, omnibox_edit.top, 1, 22, omnibox_edit.color);
7758 leency 865
 
8332 leency 866
	if (omnibox_edit.flags & ed_focus) omnibox_edit.flags = ed_focus; else omnibox_edit.flags = 0;
867
	EditBox_UpdateText(#omnibox_edit, omnibox_edit.flags);
868
	edit_box_draw stdcall(#omnibox_edit);
7784 leency 869
	if (http.transfer) imgxoff = 16*23*3; else imgxoff = 0;
8332 leency 870
	_PutImage(omnibox_edit.left+omnibox_edit.width+1, omnibox_edit.top-1, 16, 23, imgxoff + #editbox_icons);
871
	DefineHiddenButton(omnibox_edit.left+omnibox_edit.width-1, omnibox_edit.top-2, 17, 23, REFRESH_BUTTON);
7758 leency 872
 
873
	DrawProgress();
874
}
875
 
7771 leency 876
void SetOmniboxText(dword _text)
877
{
8336 leency 878
	edit_box_set_text stdcall (#omnibox_edit, _text);
8355 leency 879
	omnibox_edit.pos = omnibox_edit.flags = 0;
880
	DrawOmnibox();
7771 leency 881
}
7758 leency 882
 
7970 leency 883
dword GetAbsoluteActiveURL()
884
{
885
	char abs_url[URL_SIZE];
886
	if (links.active_url) {
887
		strncpy(#abs_url, links.active_url, URL_SIZE);
8291 leency 888
		get_absolute_url(#abs_url, history.current());
7970 leency 889
		return #abs_url;
890
	}
891
	return 0;
892
}
7771 leency 893
 
8305 leency 894
void CheckContentType()
895
{
896
	char content_type[64];
8319 leency 897
	if (http.header_field("content-type", #content_type, sizeof(content_type))) // application || image
8413 leency 898
 
899
	if (content_type[0] == 'i') {
900
		EventDownloadAndOpenImage(http.cur_url);
901
		StopLoading();
902
	}if (content_type[0] == 'a') {
8305 leency 903
		EventOpenDownloader(history.current());
904
		StopLoading();
905
	}
906
}
907
 
8413 leency 908
void EventDownloadAndOpenImage(dword _url)
909
{
910
	char image_download_url[URL_SIZE];
911
	strcpy(#image_download_url, "-eo ");
912
	strncat(#image_download_url, _url, URL_SIZE);
913
	EventOpenDownloader(#image_download_url);
914
}
915
 
8305 leency 916
void HandleRedirect()
917
{
918
	char redirect_url[URL_SIZE];
8319 leency 919
	http.header_field("location", #redirect_url, URL_SIZE);
8413 leency 920
	get_absolute_url(#redirect_url, http.cur_url);
8305 leency 921
	http.hfree();
922
	if (http_get_type==PAGE) OpenPage(#redirect_url);
8330 leency 923
	else if (http_get_type==IMG) GetUrl(#redirect_url);
8305 leency 924
}
925
 
8336 leency 926
dword GetImg(bool _new)
8016 leency 927
{
8336 leency 928
	int i;
8330 leency 929
	if (!show_images) return;
8336 leency 930
	http_get_type = IMG;
931
 
8396 leency 932
	for (i = 0; i < WB1.img_url.count; i++)
8336 leency 933
	{
8396 leency 934
		cur_img_url = WB1.img_url.get(i);
8336 leency 935
		if (cache.has(cur_img_url)==false) {
8396 leency 936
			prbar.max = WB1.img_url.count;
8336 leency 937
			prbar.value = i;
8413 leency 938
			if (GetUrl(cur_img_url)) {DrawStatusBar(cur_img_url); DrawProgress(); return;}
8336 leency 939
		}
8016 leency 940
	}
8336 leency 941
	if (_new) return;
8016 leency 942
	DrawOmnibox();
8413 leency 943
	DrawStatusBar(T_RENDERING);
8330 leency 944
	WB1.ParseHtml(WB1.o_bufpointer, WB1.bufsize);
8016 leency 945
	WB1.DrawPage();
8413 leency 946
	debugln(sprintf(#param, T_DONE_IN_SEC, GetStartTime()-render_start_time/100));
947
	DrawStatusBar(NULL);
8016 leency 948
}
949
 
5631 pavelyakov 950
stop: