WebKit을 갖고 작업할 때, 꼭 풀어야 하는 문제중 하나가 커스텀 JS Object를 추가하는 일이다. 관련 자료를 아래와 같이 요약한다.


JS Object 확장 방식

 

 

관련 뉴스그룹 기사

http://www.nabble.com/Extending-webkit-javascript-td21517784.html#a21536928

l  frameLoadDelegate2::didClearWindowObject() custom JS object JS context에 등록하는 최적의 자리다. 해당 함수는 현재 web 문서의 스크립트가 실행되기 직전에 호출된다.

 

 

커스텀 JS Object 추가 절차 요약

l  $/JavaScriptCore/API/tests/testapi.c 파일과
$/JavaScriptCore/API/JSObjectRef.h
파일에 유용한 정보가 있다.

l  JSClassDefinition 구조체의 staticValues 필드와 staticFunctions 필드를 이용하는 것이 커스텀 속성을 가진 커스텀 JS Object를 정의하는 가장 간단한 방법이다.

l  커스텀 속성을 가진 커스텀 객체를 정의하려면

n  커스텀 속성을 위한 get 함수와 set 함수를 준비한다 (ingeeGetPropFunc 함수)

n  커스텀 속성 테이블 JSStaticValue 배열을 준비한다 (ingeePorpArr 배열)

n  커스텀 객체를 위한 JSClassDefinition을 정의한다 (ingeeClassDef 변수)

n  적절한 시점에 JSClassCreate() 함수를 호출하여 타입을 등록한다

n  적절한 시점에 JSObjectMake() 함수를 호출하여 객체를 생성한다

 

static JSValueRef ingeeGetPropFunc

( JSContextRef ctx

, JSObjectRef object

, JSStringRef propertyName

, JSValueRef* exception

)

{

return JSValueMakeUndefined(ctx); //undefined-value 리턴 (단지 샘플...)

}

 

static JSStaticValue ingeePorpArr[]=

{ { "prop1", ingeeGetPropFunc, 0, kJSPropertyAttributeNone }

, { "prop2", ingeeGetPropFunc, 0, kJSPropertyAttributeNone }

, { "prop3", ingeeGetPropFunc, 0, kJSPropertyAttributeNone }

, { 0, 0, 0, 0 }

};

 

static JSClassDefinition ingeeClassDef=

{ 0 //ver

, kJSClassAttributeNone //attributes

, "PersonObject" //className

, 0 //parentClass

, ingeePorpArr //staticValues

, 0 //staticFunctions

, 0 //initialize

, 0 //finalize

, 0 //hasProperty

, 0 //getProperty

, 0 //setProperty

, 0 //deleteProperty

, 0 //getPropertyNames

, 0 //callAsFunction

, 0 //callAsConstructor

, 0 //hasInstance

, 0 //convertToType

};

 

JSValue* SomeFuncToCreateJSObject( ExecState* exec )

{

static JSClassRef ingeeClass;

if (!ingeeClass)

ingeeClass= JSClassCreate(&ingeeClassDef);

 

JSContextRef ctx= JSC::toRef(exec);

JSObjectRef objRef= JSObjectMake(ctx, ingeeClass, (void*)0/*someData*/ );

return JSC::toJS(objRef);

}

 

 

(끝)

Posted by ingee

댓글을 달아 주세요

  1. 워럽 2009.08.31 17:46 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 :)
    웹킷쪽을 보다가 우연히 들르게 되었는데 좋은자료가 참 많네요 :)

    많은것을 배워가는데 여쭤볼게 있어서 질문하나 드려봅니다.

    안드로이드 플랫폼상의 웹킷을 수정해서 커스텀 object를 구현하고자 하는데,

    커스텀 오브젝트의 정의부분을 어떻게 꾸미셨나 싶어서 여쭤보고자 합니다 :)
    살포시 정의부분 소스좀 부탁드릴 수 있을까요??

    • ingee 2009.08.31 19:52 신고  댓글주소  수정/삭제

      반갑습니다. Custom Javascript Object 말씀이신거죠? 대단한 소스는 아니지만 회사 과제를 수행하며 작성한 소스는 오픈하기 어렵습니다. 제것이 아니라 회사것이라서요. 그렇더라도 본 기사에서 언급한 내용을 크게 벗어나지 않습니다. 충분히 유추할 수 있는 수준입니다.
      어쨌든 오픈 소스 웹킷에 대한 분석과 노하우는 회사 재산이 아니라 인류 공용의 재산이라 생각하고 과감하게 오픈하고 있습니다. 님께서도 작업 결과로 좋은 내용 얻게되시면 공유 부탁 드립니다.

  2. 워럽 2009.09.01 10:33 신고  댓글주소  수정/삭제  댓글쓰기

    아~ 회사업무상이셨구나 :)
    개인 프로젝트용인줄 알고 오픈요청을 했었네요 ^^;

    무례한 부탁을 드려서 죄송합니다 :(

    저도 쌩뚱맞게 웹킷을 만지라는 명령이 떨어져서 날고생 중입니다 -_ㅠ

    함께 대박프로젝트 내서 성과 팍팍을 이뤄봐요 :)

    • ingee 2009.09.01 20:05 신고  댓글주소  수정/삭제

      고생하는 엔지니어끼리 돕고 삽시다. ^^
      님의 블로그에 자주 들러야 할 것 같습니다. 좋은 글 많던데요. 방문 고맙습니다. 좋은 하루 되세요.

    • csro 2010.01.08 17:27 신고  댓글주소  수정/삭제

      Android는 WebView안에있는 addJavascriptInterface라는 메소드를 쓰시면 될것 같은데요. 자바로 처리해야하지 만요.

    • ingee 2010.01.16 07:04 신고  댓글주소  수정/삭제

      to csro
      addJavascriptInterface, 꽤 유용해 보이는데요? 안드로이드의 유연함에 경외감마저 듭니다. 사용하셨던 경험을 얘기해주시면 큰 도움될 것 같습니다.

  3. 깜장병아리 2009.09.25 10:35 신고  댓글주소  수정/삭제  댓글쓰기

    웹킷을 4년째 하고 있는 프로그래머입니다. ㅋㅋㅋ
    여기 오니 좋은글들이 많이 있네요..

    회사에서 갑자기 NPRuntime을 사용해야 한다해서 분석하다가
    이와 같은 좋은 글이 있어 잘 보고 갑니다.
    ^^*

    더 좋은 세상을 위해서 IT개발자 파이팅...

  4. 미완성인 2009.09.28 18:44 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요
    다들 저와 비슷한 일을 하시네요..
    좋은 정보가 많아 참고하고 있습니다.
    저도 이와같은 블로그를 하나 만들어 공유해야겠습니다..

    커스텀 Object를 구현해보려고 하는데
    위에 나와있는 예제는 DumpRenderTree를 debugging으로 사용시에만 해당되던데요
    Winlauncher로 디버깅했을시에는 FrameLoadDelegate가 생성되지만 didClearWindowObject()가 실행되지 않았습니다.
    그러면 커스텀 object를 확장하기 위해서 이용하는 API가 DumpRenderTree인가요?
    그것을 언로드 시켰을때는 커스텀 object 확장을 하지 못하는것인지 궁금합니다.

    JS API 또는 하드코딩으로 커스텀 object를 확장하려고 하는데
    저 위에 있는것이 하드코딩인지 API를 이용하는것인지 감이 잘안잡혀서요.

    • ingee 2009.09.28 19:24 신고  댓글주소  수정/삭제

      Q- DumpRenderTree를 디버깅으로 사용시에만 해당?
      A- 이건 질문을 이해 못했습니다. -_-;;

      Q- FrameLoadDelegate가 생성되지만 didClearWindowObject()가 실행되지 않음.
      A- didClearWindowObject()는 FrameLoadDelegate2 타입 COM 인터페이스의 메소드입니다.

      Q- 그러면, 커스텀 object 확장하는 API가 DumpRenderTree인가?
      A- 이것도 질문을 이해 못했습니다. -_-;;;

      Q- 하드코딩이냐 API 이용이냐?
      A- 이것도 질문을 이해 못했습니다. -_-;;;
      하드코딩이라고 답해야 할 것 같은 느낌만 갖습니다.

      블로그 주인장이 별 도움 안되서... 그래도 자주 방문 주시고 댓글이나 트랙백 많이 걸어주세요.

  5. 천궁 2010.08.26 17:04 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 저도 요즘 WebKit 때문에 탈모 증상이 나타나는 개발자입니다~ㅡㅡ;;;
    addJavascriptInterface의 function 같은 경우
    제가 알고 있기로는 Android가 시초가 아니라
    QT에서 먼저 만들어서 쓰는 것으로 알고 있습니다.
    QT에서 JavaScript custom object 만드는 건 class 만들기보다
    쉽거든요 ㅋ
    암튼 덕분에 많은 도움 받고 갑니다.

    • ingee 2010.08.30 10:57 신고  댓글주소  수정/삭제

      WebKit 같은 멋진 일을 하시다니 부러울 따름입니다. 일을 만들어 하지 못하고 시키는대로 하는 입장이라 WebKit을 손에서 내려놨습니다. 놓으라길래 놓았지만 아쉽움이 깊습니다. 어여 일을 만들어낼 수 있는 주변머리를 찾아야겠다 결심하고 있습니다.
      기술은 나눠야 맛. 좋은 정보 찾거든 댓글이나 트랙백으로 나눠주세요.

    • 천궁 2010.08.30 20:42 신고  댓글주소  수정/삭제

      WebKit 같은 멋진일~ㅡㅡ;;;
      동감이 심히 힘들긴하지만
      그래도 재밌는 일 정도까지는 인정할께요 ㅋ

      저도 WebKit을 계속 파면 재밌을거 같긴한데
      요즘은 WebKit 보다는 Custom object 추가하는
      작업 중이라 ㅋ

      참. 웹킷하시고 싶으시면 제가 다니는 회사로~ㅜㅜ;;;;
      (농담 반 / 진담 반 ㅋㅋ)

    • ingee 2010.08.31 11:08 신고  댓글주소  수정/삭제

      감사합니다. 지금은 새로운 일을 잡았고 일년정도는 뒤 안돌아보고 몰입하려고 합니다. 자주 들려주세요.

  6. 천궁 2010.08.31 16:50 신고  댓글주소  수정/삭제  댓글쓰기

    아 요즘 JS extension 관련하여 자료 찾다보면 이 페이지가 눈에 자주 뛰네요~
    무슨 새로운 일을 하시는 지 궁굼하네요 ㅋ

    오늘 찾아온 이유는

    HTML JS로 아래와 같은 형식을 호출 가능하게 할려고 하는데
    parentClass 등록으로는 잘 진행이 안되에요 흑~ㅜㅜ;;
    "callAsConstructor" 부분도 파고 있는데 역시 안나오네요 ㅋ

    [아래]
    CustomerObjectParent.CustomerObject.method();

    혹시 이 방법에 대해서 아시면 간단하게 코멘트 부탁드립니다.

    그리고 두개 더 문의 드릴께요
    혹시 Object를 반환하는 method 만드는 방법 알고 계신지와
    JS에서 method 호출할 때 파라미터로 function을 받아 async로
    호출하는 방법도 혹시 아시면 가르쳐 주시길 부탁드립니다.

    이 JS extension 관련하여 아무리 찾아도 제대로 된 reference가 안 나오네요~ㅡㅡ;;;
    진짜 10여년만에 완전 맨땅에 헤딩하고 있습니다 흑~ㅜㅜ;;;;

    • ingee 2010.09.23 22:18 신고  댓글주소  수정/삭제

      1.
      CustomObjectParent.CustomObject.method(); 호출 가능합니다.

      2.
      Object를 반환하는 method 가능합니다.

      무책임하지만 어떻게 가능한지는 잊었습니다. -_-;;;
      가끔은 "가능하다"라는 사실만 알아도 도움이 되는 경우가 있습니다. 부디 도움이 되면 좋겠습니다.

      JSObject.h 였었나? JSAPI.h 였었나??? JSAPI쪽 폴더에 보면 헤더 파일이 하나 있는데, custom JS Object를 추가하는데 도움이 되는 함수와 주석이 잔뜩 들어있습니다. 찾아서 정독하시면 도움이 될 것 같습니다.

  7. 박작가 2011.09.26 17:44 신고  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. Webkit 기능에 대해 정리를 잘 해주셨네요. 도움 많이 받고 있습니다. 감사합니다.
    한가지 문의가 있습니다.
    위의 방법으로 custom object를 만들 때 기존에 javascript에서 제공되고 있던 Date와 같은 object를 상속받게 하고 싶은데 이게 가능한가요?
    위의 , JSClassDefinition의 값 중에 parentClass 값을 넣어주면 될 것 같은데
    해당 값을 어떻게 생성해야 할지 막막하네요. 해당 내용에 대해 조언 부탁드려요.
    감사합니다.

    • ingee 2011.10.10 11:05 신고  댓글주소  수정/삭제

      웹킷 실무에서 조금 벗어나 있습니다. 안타깝지만 이 질문에 대한 답변을 다른 방문자분들께 미뤄야겠습니다. 혹시 좋은 답을 스스로 찾으시면 다른 개발자들을 위해 간단하게라도 메모 남겨주세요. 감사합니다.