Gui: Fix NullPointerException when pressing backspace on empty search box [#841]

master
gnosygnu 3 years ago
parent 17a3b4e7b3
commit 2a4abd8f75

@ -1,6 +1,6 @@
/* /*
XOWA: the XOWA Offline Wiki Application XOWA: the XOWA Offline Wiki Application
Copyright (C) 2012-2017 gnosygnu@gmail.com Copyright (C) 2012-2021 gnosygnu@gmail.com
XOWA is licensed under the terms of the General Public License (GPL) Version 3, XOWA is licensed under the terms of the General Public License (GPL) Version 3,
or alternatively under the terms of the Apache License Version 2.0. or alternatively under the terms of the Apache License Version 2.0.
@ -13,188 +13,214 @@ The terms of each license can be found in the source code repository:
GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt GPLv3 License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-GPLv3.txt
Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt Apache License: https://github.com/gnosygnu/xowa/blob/master/LICENSE-APACHE2.txt
*/ */
package gplx.xowa.htmls.js; import gplx.*; import gplx.xowa.*; import gplx.xowa.htmls.*; package gplx.xowa.htmls.js;
import gplx.core.threads.*; import gplx.xowa.xtns.pfuncs.ifs.*; import gplx.xowa.wikis.data.tbls.*;
import gplx.langs.jsons.*; import gplx.Bool_;
import gplx.xowa.htmls.js.*; import gplx.Bry_;
import gplx.xowa.guis.views.*; import gplx.Bry_bfr;
import gplx.xowa.parsers.*; import gplx.Bry_bfr_;
import gplx.xowa.htmls.modules.popups.*; import gplx.Bry_split_;
public class Xoh_js_cbk implements Gfo_invk { import gplx.Byte_ascii;
private Xoae_app app; import gplx.Err_;
private Xog_html_itm html_itm; import gplx.GfoMsg;
private Xop_root_tkn root = new Xop_root_tkn(); import gplx.Gfo_invk;
private final Bry_bfr bfr = Bry_bfr_.Reset(255); import gplx.Gfo_invk_;
public Xoh_js_cbk(Xog_html_itm html_itm) {this.html_itm = html_itm; this.app = html_itm.Owner_tab().Tab_mgr().Win().App();} import gplx.GfsCtx;
private String Xowa_exec_test(GfoMsg m) { // concat args with pipe; EX: xowa_exec('proc', 'arg0', 'arg1'); -> proc|arg0|arg1 import gplx.Int_;
bfr.Clear(); import gplx.Object_;
bfr.Add_str_u8(m.Key()); import gplx.String_;
int len = m.Args_count(); import gplx.core.threads.Thread_adp_;
for (int i = 0; i < len; i++) import gplx.xowa.Xoa_ttl;
bfr.Add_str_a7("|").Add_str_u8(m.Args_getAt(i).Val_to_str_or_empty()); import gplx.xowa.Xoae_app;
return bfr.To_str_and_clear(); import gplx.xowa.Xoae_page;
} import gplx.xowa.Xowe_wiki;
private String[] Xowa_exec_test_as_array(GfoMsg m) {// return args as array; EX: xowa_exec('proc', 'arg0', 'arg1'); -> proc,arg0,arg1 import gplx.xowa.guis.views.Xog_html_itm;
bfr.Clear(); import gplx.xowa.htmls.modules.popups.Xow_popup_mgr;
int len = m.Args_count(); import gplx.xowa.parsers.Xop_ctx;
String[] rv = new String[len + 1]; import gplx.xowa.parsers.Xop_root_tkn;
rv[0] = Invk_xowa_exec_test_as_array; import gplx.xowa.wikis.data.tbls.Xowd_page_itm;
for (int i = 0; i < len; i++) import gplx.xowa.xtns.pfuncs.ifs.Pfunc_ifexist;
rv[i + 1] = Object_.Xto_str_strict_or_empty(m.ReadValAt(i));
return rv; public class Xoh_js_cbk implements Gfo_invk {
} private Xoae_app app;
private String Parse_to_html(GfoMsg m) { private Xog_html_itm html_itm;
Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); private Xop_root_tkn root = new Xop_root_tkn();
Xop_ctx ctx = wiki.Parser_mgr().Ctx(); private final Bry_bfr bfr = Bry_bfr_.Reset(255);
boolean old_para_enabled = ctx.Para().Enabled(); public Xoh_js_cbk(Xog_html_itm html_itm) {this.html_itm = html_itm; this.app = html_itm.Owner_tab().Tab_mgr().Win().App();}
byte[] raw = Bry_.new_u8(m.Args_getAt(0).Val_to_str_or_empty()); private String Xowa_exec_test(GfoMsg m) { // concat args with pipe; EX: xowa_exec('proc', 'arg0', 'arg1'); -> proc|arg0|arg1
boolean para_enabled = m.Args_count() < 2 ? false : Bool_.Parse(m.Args_getAt(1).Val_to_str_or_empty()); bfr.Clear();
try { bfr.Add_str_u8(m.Key());
ctx.Para().Enabled_(para_enabled); int len = m.Args_count();
wiki.Parser_mgr().Main().Parse_text_to_wdom(root, ctx, ctx.Tkn_mkr(), raw, 0); for (int i = 0; i < len; i++)
byte[] data = root.Data_mid(); bfr.Add_str_a7("|").Add_str_u8(m.Args_getAt(i).Val_to_str_or_empty());
wiki.Html_mgr().Html_wtr().Write_doc(bfr, ctx, data, root); return bfr.To_str_and_clear();
return bfr.To_str_and_clear(); }
} private String[] Xowa_exec_test_as_array(GfoMsg m) {// return args as array; EX: xowa_exec('proc', 'arg0', 'arg1'); -> proc,arg0,arg1
finally { bfr.Clear();
ctx.Para().Enabled_(old_para_enabled); int len = m.Args_count();
} String[] rv = new String[len + 1];
} rv[0] = Invk_xowa_exec_test_as_array;
private String Get_page(GfoMsg m) { for (int i = 0; i < len; i++)
Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); rv[i + 1] = Object_.Xto_str_strict_or_empty(m.ReadValAt(i));
try { return rv;
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, m.Args_getAt(0).Val_to_bry()); }
Xoae_page page = wiki.Data_mgr().Load_page_by_ttl(ttl); private String Parse_to_html(GfoMsg m) {
return String_.new_u8(page.Db().Text().Text_bry()); Xowe_wiki wiki = html_itm.Owner_tab().Wiki();
} catch (Exception e) {Err_.Noop(e); return null;} Xop_ctx ctx = wiki.Parser_mgr().Ctx();
} boolean old_para_enabled = ctx.Para().Enabled();
private String Popups_get_html(GfoMsg m) { byte[] raw = Bry_.new_u8(m.Args_getAt(0).Val_to_str_or_empty());
try { boolean para_enabled = m.Args_count() < 2 ? false : Bool_.Parse(m.Args_getAt(1).Val_to_str_or_empty());
String mode = m.Args_getAt(0).Val_to_str_or_empty(); try {
String popups_id = m.Args_getAt(1).Val_to_str_or_empty(); ctx.Para().Enabled_(para_enabled);
wiki.Parser_mgr().Main().Parse_text_to_wdom(root, ctx, ctx.Tkn_mkr(), raw, 0);
Xow_popup_mgr popup_mgr = html_itm.Owner_tab().Wiki().Html_mgr().Head_mgr().Popup_mgr(); byte[] data = root.Data_mid();
if (String_.Eq(mode, "init")) { wiki.Html_mgr().Html_wtr().Write_doc(bfr, ctx, data, root);
byte[] href_bry = m.Args_getAt(2).Val_to_bry(); return bfr.To_str_and_clear();
byte[] tooltip_bry = m.Args_getAt(3).Val_to_bry(); }
return popup_mgr.Show_init(popups_id, href_bry, tooltip_bry); finally {
} ctx.Para().Enabled_(old_para_enabled);
else if (String_.Eq(mode, "more")) }
return popup_mgr.Show_more(popups_id); }
else if (String_.Eq(mode, "all")) private String Get_page(GfoMsg m) {
popup_mgr.Show_all(popups_id); Xowe_wiki wiki = html_itm.Owner_tab().Wiki();
return ""; try {
} catch (Exception e) {Err_.Noop(e); return null;} Xoa_ttl ttl = Xoa_ttl.Parse(wiki, m.Args_getAt(0).Val_to_bry());
} Xoae_page page = wiki.Data_mgr().Load_page_by_ttl(ttl);
private String[] Get_title_meta(Xowe_wiki wiki, byte[] ttl_bry) { return String_.new_u8(page.Db().Text().Text_bry());
synchronized (tmp_page) { } catch (Exception e) {Err_.Noop(e); return null;}
tmp_page.Clear(); }
Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry); private String Popups_get_html(GfoMsg m) {
wiki.Db_mgr().Load_mgr().Load_by_ttl(tmp_page, ttl.Ns(), ttl.Page_db()); try {
} String mode = m.Args_getAt(0).Val_to_str_or_empty();
return String_.Ary(tmp_page.Exists() ? "1" : "0", Int_.To_str(tmp_page.Id()), Int_.To_str(tmp_page.Ns_id()), String_.new_u8(tmp_page.Ttl_page_db()), Bool_.To_str_lower(tmp_page.Redirected()), tmp_page.Modified_on().XtoStr_fmt("yyyy-MM-dd HH:mm:ss"), Int_.To_str(tmp_page.Text_len())); String popups_id = m.Args_getAt(1).Val_to_str_or_empty();
} private static final Xowd_page_itm tmp_page = Xowd_page_itm.new_tmp();
private String[][] Get_titles_meta(GfoMsg m) { Xow_popup_mgr popup_mgr = html_itm.Owner_tab().Wiki().Html_mgr().Head_mgr().Popup_mgr();
Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); if (String_.Eq(mode, "init")) {
try { byte[] href_bry = m.Args_getAt(2).Val_to_bry();
byte[][] ttls = Bry_split_.Split(Bry_.new_u8((String)m.ReadValAt(0)), Byte_ascii.Nl); byte[] tooltip_bry = m.Args_getAt(3).Val_to_bry();
int ttls_len = ttls.length; return popup_mgr.Show_init(popups_id, href_bry, tooltip_bry);
String[][] rv = new String[ttls_len][]; }
for (int i = 0; i < ttls_len; i++) { else if (String_.Eq(mode, "more"))
byte[] ttl = ttls[i]; return popup_mgr.Show_more(popups_id);
rv[i] = Get_title_meta(wiki, ttl); else if (String_.Eq(mode, "all"))
} popup_mgr.Show_all(popups_id);
return rv; return "";
} catch (Exception e) {Err_.Noop(e); return null;} } catch (Exception e) {Err_.Noop(e); return null;}
} }
private boolean Get_title_exists(Xowe_wiki wiki, byte[] ttl) { private String[] Get_title_meta(Xowe_wiki wiki, byte[] ttl_bry) {
return Pfunc_ifexist.Exists(wiki, ttl); synchronized (tmp_page) {
} tmp_page.Clear();
private String[] Get_titles_exists(GfoMsg m) { Xoa_ttl ttl = Xoa_ttl.Parse(wiki, ttl_bry);
Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); wiki.Db_mgr().Load_mgr().Load_by_ttl(tmp_page, ttl.Ns(), ttl.Page_db());
try { }
byte[][] ttls = Bry_.Ary_obj((Object[])m.ReadValAt(0)); return String_.Ary(tmp_page.Exists() ? "1" : "0", Int_.To_str(tmp_page.Id()), Int_.To_str(tmp_page.Ns_id()), String_.new_u8(tmp_page.Ttl_page_db()), Bool_.To_str_lower(tmp_page.Redirected()), tmp_page.Modified_on().XtoStr_fmt("yyyy-MM-dd HH:mm:ss"), Int_.To_str(tmp_page.Text_len()));
int ttls_len = ttls.length; } private static final Xowd_page_itm tmp_page = Xowd_page_itm.new_tmp();
String[] rv = new String[ttls_len]; private String[][] Get_titles_meta(GfoMsg m) {
for (int i = 0; i < ttls_len; i++) { Xowe_wiki wiki = html_itm.Owner_tab().Wiki();
byte[] ttl = ttls[i]; try {
rv[i] = Get_title_exists(wiki, ttl) ? "1" : "0"; byte[][] ttls = Bry_split_.Split(Bry_.new_u8((String)m.ReadValAt(0)), Byte_ascii.Nl);
} int ttls_len = ttls.length;
return rv; String[][] rv = new String[ttls_len][];
} catch (Exception e) {Err_.Noop(e); return null;} for (int i = 0; i < ttls_len; i++) {
} byte[] ttl = ttls[i];
private String Get_search_suggestions(GfoMsg m) { rv[i] = Get_title_meta(wiki, ttl);
Xowe_wiki wiki = html_itm.Owner_tab().Wiki(); }
byte[] search_str = Bry_.new_u8((String)m.ReadValAt(0)); return rv;
byte[] cbk_func = Bry_.new_u8((String)m.ReadValAt(1)); } catch (Exception e) {Err_.Noop(e); return null;}
app.Addon_mgr().Itms__search__htmlbar().Search_by_swt(wiki, search_str, cbk_func); }
return ""; private boolean Get_title_exists(Xowe_wiki wiki, byte[] ttl) {
} return Pfunc_ifexist.Exists(wiki, ttl);
private String[] Wikidata_get_label(GfoMsg m) { }
try { private String[] Get_titles_exists(GfoMsg m) {
Thread_adp_.Sleep(10); // slow down calls to prevent random crashing in XulRunner; DATE:2014-04-23 Xowe_wiki wiki = html_itm.Owner_tab().Wiki();
gplx.xowa.xtns.wbases.Wdata_wiki_mgr wdata_mgr = app.Wiki_mgr().Wdata_mgr(); try {
wdata_mgr.Wdata_wiki().Init_assert(); // NOTE: must assert else ns_mgr won't load Property byte[][] ttls = Bry_.Ary_obj((Object[])m.ReadValAt(0));
int len = m.Args_count(); int ttls_len = ttls.length;
if (len < 1) return null; String[] rv = new String[ttls_len];
byte[][] langs = Bry_split_.Split(m.Args_getAt(0).Val_to_bry(), Byte_ascii.Semic); for (int i = 0; i < ttls_len; i++) {
int langs_len = langs.length; byte[] ttl = ttls[i];
String[] rv = new String[len - 1]; rv[i] = Get_title_exists(wiki, ttl) ? "1" : "0";
for (int i = 1; i < len; i++) { }
try { return rv;
byte[] ttl_bry = m.Args_getAt(i).Val_to_bry(); } catch (Exception e) {Err_.Noop(e); return null;}
gplx.xowa.xtns.wbases.Wdata_doc page = wdata_mgr.Doc_mgr.Get_by_xid_or_null(ttl_bry); if (page == null) continue; }
for (int j = 0; j < langs_len; j++) { private String Get_search_suggestions(GfoMsg m) {
byte[] lang_key = langs[j]; Xowe_wiki wiki = html_itm.Owner_tab().Wiki();
if (Bry_.Eq(lang_key, Wikidata_get_label_xowa_ui_lang)) String search_str = (String)m.ReadValAt(0);
lang_key = app.Sys_cfg().Lang(); // 2021-03-02|ISSUE#:841|Pressing backspace on empty search box will generate a null
byte[] val_bry = null; if (search_str == null) {
if (Bry_.Eq(lang_key, Wikidata_get_label_xowa_title)) return "";
val_bry = ttl_bry; }
else { byte[] search_bry = Bry_.new_u8(search_str);
val_bry = page.Get_label_bry_or_null(lang_key); byte[] cbk_func = Bry_.new_u8((String)m.ReadValAt(1));
} app.Addon_mgr().Itms__search__htmlbar().Search_by_swt(wiki, search_bry, cbk_func);
if (val_bry == null) continue; return "";
rv[i - 1] = String_.new_u8(val_bry); }
break; private String[] Wikidata_get_label(GfoMsg m) {
} try {
} catch (Exception e) {Err_.Noop(e); rv[i] = null;} Thread_adp_.Sleep(10); // slow down calls to prevent random crashing in XulRunner; DATE:2014-04-23
finally {} gplx.xowa.xtns.wbases.Wdata_wiki_mgr wdata_mgr = app.Wiki_mgr().Wdata_mgr();
} wdata_mgr.Wdata_wiki().Init_assert(); // NOTE: must assert else ns_mgr won't load Property
return rv; int len = m.Args_count();
} catch (Exception e) {Err_.Noop(e); return null;} if (len < 1) return null;
} byte[][] langs = Bry_split_.Split(m.Args_getAt(0).Val_to_bry(), Byte_ascii.Semic);
private String Scripts_exec(GfoMsg m) { int langs_len = langs.length;
Object rv = null; String[] rv = new String[len - 1];
try { for (int i = 1; i < len; i++) {
rv = app.Gfs_mgr().Run_str(m.Args_getAt(0).Val_to_str_or_empty()); try {
} byte[] ttl_bry = m.Args_getAt(i).Val_to_bry();
catch (Exception e) {Err_.Noop(e); return null;} gplx.xowa.xtns.wbases.Wdata_doc page = wdata_mgr.Doc_mgr.Get_by_xid_or_null(ttl_bry); if (page == null) continue;
return Object_.Xto_str_strict_or_empty(rv); for (int j = 0; j < langs_len; j++) {
} byte[] lang_key = langs[j];
private static final byte[] Wikidata_get_label_xowa_ui_lang = Bry_.new_a7("xowa_ui_lang"), Wikidata_get_label_xowa_title = Bry_.new_a7("xowa_title"); if (Bry_.Eq(lang_key, Wikidata_get_label_xowa_ui_lang))
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) { lang_key = app.Sys_cfg().Lang();
if (ctx.Match(k, Invk_parse_to_html)) return Parse_to_html(m); byte[] val_bry = null;
else if (ctx.Match(k, Invk_wikidata_get_label)) return Wikidata_get_label(m); if (Bry_.Eq(lang_key, Wikidata_get_label_xowa_title))
else if (ctx.Match(k, Invk_get_page)) return Get_page(m); val_bry = ttl_bry;
else if (ctx.MatchIn(k, Invk_cmd, Invk_scripts_exec)) return Scripts_exec(m); else {
else if (ctx.Match(k, Invk_scripts_exec)) return Scripts_exec(m); val_bry = page.Get_label_bry_or_null(lang_key);
else if (ctx.Match(k, Invk_popups_get_html)) return Popups_get_html(m); }
else if (ctx.Match(k, Invk_get_search_suggestions)) return Get_search_suggestions(m); if (val_bry == null) continue;
else if (ctx.Match(k, Invk_get_titles_meta)) return Get_titles_meta(m); rv[i - 1] = String_.new_u8(val_bry);
else if (ctx.Match(k, Invk_get_titles_exists)) return Get_titles_exists(m); break;
else if (ctx.Match(k, Invk_get_current_url)) return String_.new_u8(html_itm.Owner_tab().Page().Url().Raw()); }
else if (ctx.Match(k, Invk_xowa_exec_test)) return Xowa_exec_test(m); } catch (Exception e) {Err_.Noop(e); rv[i] = null;}
else if (ctx.Match(k, Invk_xowa_exec_test_as_array)) return Xowa_exec_test_as_array(m); finally {}
else if (ctx.Match(k, Invk_exec_json)) return app.Html__bridge_mgr().Cmd_mgr().Exec(m); }
else if (ctx.Match(k, Invk_bldr_exec)) return app.Bldr().Exec_json((String)m.ReadValAt(0)); return rv;
else return Gfo_invk_.Rv_unhandled; } catch (Exception e) {Err_.Noop(e); return null;}
} }
public static final String Invk_parse_to_html = "parse_to_html", Invk_wikidata_get_label = "wikidata_get_label", Invk_get_page = "get_page", Invk_cmd = "cmd", Invk_scripts_exec = "scripts_exec" private String Scripts_exec(GfoMsg m) {
, Invk_get_search_suggestions = "get_search_suggestions", Invk_get_titles_meta = "get_titles_meta", Invk_get_titles_exists = "get_titles_exists", Invk_get_current_url = "get_current_url" Object rv = null;
, Invk_xowa_exec_test = "xowa_exec_test", Invk_xowa_exec_test_as_array = "xowa_exec_test_as_array" try {
, Invk_popups_get_html = "popups_get_html" rv = app.Gfs_mgr().Run_str(m.Args_getAt(0).Val_to_str_or_empty());
, Invk_exec_json = "exec_json" }
, Invk_bldr_exec = "bldr_exec" catch (Exception e) {Err_.Noop(e); return null;}
; return Object_.Xto_str_strict_or_empty(rv);
} }
private static final byte[] Wikidata_get_label_xowa_ui_lang = Bry_.new_a7("xowa_ui_lang"), Wikidata_get_label_xowa_title = Bry_.new_a7("xowa_title");
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
if (ctx.Match(k, Invk_parse_to_html)) return Parse_to_html(m);
else if (ctx.Match(k, Invk_wikidata_get_label)) return Wikidata_get_label(m);
else if (ctx.Match(k, Invk_get_page)) return Get_page(m);
else if (ctx.MatchIn(k, Invk_cmd, Invk_scripts_exec)) return Scripts_exec(m);
else if (ctx.Match(k, Invk_scripts_exec)) return Scripts_exec(m);
else if (ctx.Match(k, Invk_popups_get_html)) return Popups_get_html(m);
else if (ctx.Match(k, Invk_get_search_suggestions)) return Get_search_suggestions(m);
else if (ctx.Match(k, Invk_get_titles_meta)) return Get_titles_meta(m);
else if (ctx.Match(k, Invk_get_titles_exists)) return Get_titles_exists(m);
else if (ctx.Match(k, Invk_get_current_url)) return String_.new_u8(html_itm.Owner_tab().Page().Url().Raw());
else if (ctx.Match(k, Invk_xowa_exec_test)) return Xowa_exec_test(m);
else if (ctx.Match(k, Invk_xowa_exec_test_as_array)) return Xowa_exec_test_as_array(m);
else if (ctx.Match(k, Invk_exec_json)) return app.Html__bridge_mgr().Cmd_mgr().Exec(m);
else if (ctx.Match(k, Invk_bldr_exec)) return app.Bldr().Exec_json((String)m.ReadValAt(0));
else return Gfo_invk_.Rv_unhandled;
}
public static final String Invk_parse_to_html = "parse_to_html", Invk_wikidata_get_label = "wikidata_get_label", Invk_get_page = "get_page", Invk_cmd = "cmd", Invk_scripts_exec = "scripts_exec"
, Invk_get_search_suggestions = "get_search_suggestions", Invk_get_titles_meta = "get_titles_meta", Invk_get_titles_exists = "get_titles_exists", Invk_get_current_url = "get_current_url"
, Invk_xowa_exec_test = "xowa_exec_test", Invk_xowa_exec_test_as_array = "xowa_exec_test_as_array"
, Invk_popups_get_html = "popups_get_html"
, Invk_exec_json = "exec_json"
, Invk_bldr_exec = "bldr_exec"
;
}

Loading…
Cancel
Save