Skip to content

Commit 075c129

Browse files
committed
Find first input field also in frame elements
1 parent 413f60c commit 075c129

File tree

3 files changed

+42
-5
lines changed

3 files changed

+42
-5
lines changed

src/main.rs

-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@
5050
*
5151
* TODO: might find this useful for for filler: https://webkitgtk.org/reference/webkit2gtk/stable/WebKitWebPage.html#WebKitWebPage-form-controls-associated
5252
*
53-
* TODO: find first input also in frames.
54-
*
5553
* FIXME: submit not working in bnc.ca login form.
5654
*
5755
* FIXME: cannot follow the clone button on GitHub anymore.

titanium-web-extension/src/dom.rs

+39-1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ use webkit2gtk_webextension::{
4343
DOMHTMLElement,
4444
DOMHTMLFieldSetElement,
4545
DOMHTMLFieldSetElementExtManual,
46+
DOMHTMLFrameElement,
47+
DOMHTMLFrameElementExt,
48+
DOMHTMLIFrameElement,
49+
DOMHTMLIFrameElementExt,
4650
DOMHTMLInputElement,
4751
DOMHTMLInputElementExt,
4852
DOMHTMLSelectElement,
@@ -144,6 +148,40 @@ pub fn get_document(page: &WebPage) -> Option<DOMElement> {
144148
)
145149
}
146150

151+
pub fn get_elements_by_tag_name_in_all_frames(document: &DOMDocument, tag_name: &str) -> Vec<(DOMDocument, DOMElement)> {
152+
let mut elements = vec![];
153+
let iter = NodeIter::new(document.get_elements_by_tag_name(tag_name));
154+
for element in iter {
155+
elements.push((document.clone(), element));
156+
}
157+
158+
let iter = NodeIter::new(document.get_elements_by_tag_name("frame"));
159+
for frame in iter {
160+
if let Ok(frame) = frame.downcast::<DOMHTMLFrameElement>() {
161+
if let Some(document) = frame.get_content_document() {
162+
let iter = NodeIter::new(document.get_elements_by_tag_name(tag_name));
163+
for element in iter {
164+
elements.push((document.clone(), element));
165+
}
166+
}
167+
}
168+
}
169+
170+
let iter = NodeIter::new(document.get_elements_by_tag_name("iframe"));
171+
for frame in iter {
172+
if let Ok(frame) = frame.downcast::<DOMHTMLIFrameElement>() {
173+
if let Some(document) = frame.get_content_document() {
174+
let iter = NodeIter::new(document.get_elements_by_tag_name(tag_name));
175+
for element in iter {
176+
elements.push((document.clone(), element));
177+
}
178+
}
179+
}
180+
}
181+
182+
elements
183+
}
184+
147185
/// Get the body if it exists or the html element.
148186
pub fn get_hints_container(page: &WebPage) -> Option<DOMNode> {
149187
let document = page.get_dom_document()?;
@@ -260,7 +298,7 @@ pub fn is_hidden(document: &DOMDocument, element: &DOMElement) -> bool {
260298
{
261299
return true;
262300
}
263-
element = el.get_offset_parent();
301+
element = el.get_parent_element();
264302
}
265303
true
266304
}

titanium-web-extension/src/executor/mod.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ use titanium_common::InnerMessage::*;
7373
use dom::{
7474
NodeIter,
7575
get_body,
76+
get_elements_by_tag_name_in_all_frames,
7677
get_hints_container,
7778
get_href,
7879
get_position,
@@ -340,8 +341,8 @@ impl Executor {
340341
let mut element_to_focus = None;
341342
let mut element_y_pos = f32::INFINITY;
342343
for tag_name in &tag_names {
343-
let iter = NodeIter::new(document.get_elements_by_tag_name(tag_name));
344-
for element in iter {
344+
let iter = get_elements_by_tag_name_in_all_frames(&document, tag_name);
345+
for (document, element) in iter {
345346
let tabindex = element.get_attribute("tabindex");
346347
if !is_hidden(&document, &element) && is_enabled(&element) && is_text_input(&element)
347348
&& tabindex != Some("-1".to_string())

0 commit comments

Comments
 (0)