SWT Browser(org.eclipse.swt.browser.Browser)에서 Runtime 에 해당 Browser 상에서 Javascript 의 수행결과를 얻고 싶을 경우가 있다.

 SWT Browser 에서 Javascript 수행결과를 얻는 방법으로는 다음과 같이 2가지 방법이 있다.

  • Browser 의 public Object evaluate (String script) 함수를 이용한 리턴값을 이용하는 방법
  • Javascript 핸들러로 org.eclipse.swt.browser.BrowserFunction 을 확장구현한 클래스를 Browser 에 등록하는 방법

 여기에서는 Browser 의 evaluate 함수를 이용하여 Javascript 수행 값을 얻는 방법을 알아 보도록 한다.

 evaluate 함수는 Javascript 의 eval 함수와 비슷하다고 생각하면 되는데, 이용 방법은 간단하다.

 다음과 같이 Browser 의 evaluate 함수에 Runtime 에 수행할 Javascript Code 를 넣어주면 된다.

final Browser browser = new Browser(parent, SWT.NONE);
browser.setJavascriptEnabled(true);    	
browser.addProgressListener(new ProgressAdapter() {
    public void completed(ProgressEvent event) {
        String bodyHTML = (String) browser.evaluate("return document.body;");
        // TODO:
    }
});

evaluate 함수는 다음과 같이 5개의 type 을 리턴한다.

  • javascript null or undefined -> null
  • javascript number -> java.lang.Double
  • javascript string -> java.lang.String
  • javascript boolean -> java.lang.Boolean
  • javascript array whose elements are all of supported types -> java.lang.Object[]


evaluate 함수를 사용할때 주의 할 점은 Browser 객체와 같은 Thread 에서 수행하면 evaluate 함수가 Async 하게 동작하므로 제대로 된 값을 리턴받지 못하는 경우가 발생 할 수 있다. 따라서 다른 Thread 혹은 ProgressListener 등에서 수행되도록 작성하여야 한다.

Posted by leechwin
,