파이어폭스 플러그인 개발 방법 (npruntime)

1 목적[ | ]

본 문서는 ubuntu 상에서 firefox 웹브라우저에 npruntime 기반 NPAPI 플러그인 개발 및 적용 방법에 대해 기술한다.

본 문서에 사용되는 소프트웨어의 버전은 다음과 같다.

  • Ubuntu 13.10 64 bit
  • Firefox 25.0.1 (Mozilla Firefox for Ubuntu canonical - 1.0)
  • g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1

NPAPI 플러그인은 웹페이지 내에 그래픽/동영상 표현과 같은 기능만 수행 가능하며, 플러그인과 HTML 페이지 간의 자바스크립트 기반 연동을 수행하기 위해서는 npruntime 기반 스크립팅 플러그인을 작성해야 한다.

본 문서에서는 모질라에서 제공하는 npruntime sample 을 이용하여 스크립팅 플러그인 개발 방법을 설명한다.

npruntime 스크립팅 플러그인은 NPAPI 플러그인과 동일하게 npapi-sdk 이용하여 개발할 수 있다.

2 npapi-sdk 받기[ | ]

npapi-sdk 소스를 체크아웃 한다.

svn checkout http://npapi-sdk.googlecode.com/svn/trunk/ npapi-sdk

3 npruntime 샘플 받기[ | ]

모질라 CVS에서 npruntime 샘플 코드를 체크아웃 한다.

cvs -d :pserver:anonymous:anonymous@cvs-mirror.mozilla.org:/cvsroot co mozilla/modules/plugin/samples/npruntime

4 npruntime 샘플 빌드[ | ]

위 npruntime 샘플 코드는 Makefile 이 존재하지 않으므로, npapi-sdk 소스 내의 unix-basic의 Makefile을 참고하여 아래와 같이 Makefile을 작성 후 빌드한다.

아래 Makefile 내용 중 6번째 라인의 INCLUDES 항목에는 앞서 체크 아웃한 npapi-sdk의 headers 디렉토리를 참조하도록 작성한다.

cd mozilla/modules/plugin/samples/npruntime
vi Makefile
make
CXX = g++

CXXFLAGS = -Wall -DXP_UNIX=1 -fPIC -g 

INCLUDES = -I../../../../../npapi-sdk/headers

TARGET = npruntime.so
OBJS = np_entry.o npn_gate.o npp_gate.o plugin.o

$(TARGET) : $(OBJS) 
	$(CXX) $(CLFAGS) -o $@ -shared $(OBJS)

%.o:%.cpp
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $<

clean :
	rm -rf $(TARGET) $(OBJS)

5 npruntime 샘플 패치[ | ]

작성된 Makefile 을 이용하여 빌드를 수행할 경우 npapi-sdk에 정의된 해더와 호환되지 않아 에러가 발생한다.

아래의 패치 내용을 복사하여 npapi-sdk.patch 이름으로 npruntime 샘플 디렉토리에 저장한다. 아래와 같이 패치를 수행하고 다시 빌드 한다.

patch < npapi-sdk.patch
make
? npapi-sdk.patch
Index: np_entry.cpp
===================================================================
RCS file: /cvsroot/mozilla/modules/plugin/samples/npruntime/np_entry.cpp,v
retrieving revision 1.1
diff -r1.1 np_entry.cpp
43c43,45
< #include "npupp.h"
---
> #include "npfunctions.h"
> 
> typedef uint32_t uint32;
82c84
< char *NPP_GetMIMEDescription();
---
> //char *NPP_GetMIMEDescription();
84c86
< char *
---
> const char *
95a98,99
> NPError NPP_Initialize(void);
> 
164,173c168,177
<   pluginFuncs->newp       = NewNPP_NewProc(NPP_New);
<   pluginFuncs->destroy    = NewNPP_DestroyProc(NPP_Destroy);
<   pluginFuncs->setwindow  = NewNPP_SetWindowProc(NPP_SetWindow);
<   pluginFuncs->newstream  = NewNPP_NewStreamProc(NPP_NewStream);
<   pluginFuncs->destroystream = NewNPP_DestroyStreamProc(NPP_DestroyStream);
<   pluginFuncs->asfile     = NewNPP_StreamAsFileProc(NPP_StreamAsFile);
<   pluginFuncs->writeready = NewNPP_WriteReadyProc(NPP_WriteReady);
<   pluginFuncs->write      = NewNPP_WriteProc(NPP_Write);
<   pluginFuncs->print      = NewNPP_PrintProc(NPP_Print);
<   pluginFuncs->urlnotify  = NewNPP_URLNotifyProc(NPP_URLNotify);
---
>   pluginFuncs->newp       = NPP_New;
>   pluginFuncs->destroy    = NPP_Destroy;
>   pluginFuncs->setwindow  = NPP_SetWindow;
>   pluginFuncs->newstream  = NPP_NewStream;
>   pluginFuncs->destroystream = NPP_DestroyStream;
>   pluginFuncs->asfile     = NPP_StreamAsFile;
>   pluginFuncs->writeready = NPP_WriteReady;
>   pluginFuncs->write      = NPP_Write;
>   pluginFuncs->print      = NPP_Print;
>   pluginFuncs->urlnotify  = NPP_URLNotify;
175c179
<   pluginFuncs->getvalue   = NewNPP_GetValueProc(NPP_GetValue);
---
>   pluginFuncs->getvalue   = NPP_GetValue;
Index: npn_gate.cpp
===================================================================
RCS file: /cvsroot/mozilla/modules/plugin/samples/npruntime/npn_gate.cpp,v
retrieving revision 1.1
diff -r1.1 npn_gate.cpp
43c43,46
< #include "npupp.h"
---
> #include "npfunctions.h"
> 
> typedef uint32_t uint32;
> typedef int32_t int32;
182,195d184
< JRIEnv* NPN_GetJavaEnv(void)
< {
<   JRIEnv * rv = NULL;
< 	rv = NPNFuncs.getJavaEnv();
<   return rv;
< }
< 
< jref NPN_GetJavaPeer(NPP instance)
< {
<   jref rv;
< 	rv = NPNFuncs.getJavaPeer(instance);
<   return rv;
< }
< 
Index: npp_gate.cpp
===================================================================
RCS file: /cvsroot/mozilla/modules/plugin/samples/npruntime/npp_gate.cpp,v
retrieving revision 1.1
diff -r1.1 npp_gate.cpp
45c45,48
< char*
---
> typedef uint16_t uint16;
> typedef int32_t int32;
> 
> const char*
169c172
<     *((char **)value) = "NPRuntimeTest";
---
>     *((char **)value) = (char*)"NPRuntimeTest";
172c175
<     *((char **)value) = "NPRuntime scriptability API test plugin";
---
>     *((char **)value) = (char*)"NPRuntime scriptability API test plugin";
264,268d266
< jref NPP_GetJavaClass (void)
< {
<   return NULL;
< }
< 
Index: plugin.cpp
===================================================================
RCS file: /cvsroot/mozilla/modules/plugin/samples/npruntime/plugin.cpp,v
retrieving revision 1.1
diff -r1.1 plugin.cpp
56c56,62
< #include "npupp.h"
---
> 
> #define PR_TRUE true
> #define PR_FALSE false
> #define TRUE true
> #define FALSE false
> 
> typedef uint16_t uint16;
510,511c516,517
<     str.utf8characters = "alert('NPN_IdentifierIsString() test failed!');";
<     str.utf8length = strlen(str.utf8characters);
---
>     str.UTF8Characters = "alert('NPN_IdentifierIsString() test failed!');";
>     str.UTF8Length = strlen(str.UTF8Characters);
526c532
<       printf ("title = %s\n", NPVARIANT_TO_STRING(rval).utf8characters);
---
>       printf ("title = %s\n", NPVARIANT_TO_STRING(rval).UTF8Characters);
537,538c543,544
<     str.utf8characters = "document.getElementById('result').innerHTML += '<p>' + 'NPN_Evaluate() test, document = ' + this + '</p>';";
<     str.utf8length = strlen(str.utf8characters);
---
>     str.UTF8Characters = "document.getElementById('result').innerHTML += '<p>' + 'NPN_Evaluate() test, document = ' + this + '</p>';";
>     str.UTF8Length = strlen(str.UTF8Characters);
575c581
<     printf ("prompt returned '%s'\n", NPVARIANT_TO_STRING(rval).utf8characters);
---
>     printf ("prompt returned '%s'\n", NPVARIANT_TO_STRING(rval).UTF8characters);
Index: plugin.h
===================================================================
RCS file: /cvsroot/mozilla/modules/plugin/samples/npruntime/plugin.h,v
retrieving revision 1.1
diff -r1.1 plugin.h
43a44,45
> typedef int16_t int16;
>

6 테스트[ | ]

빌드된 결과물은 npruntime.so 파일 이다. 플러그인 파일을 firefox plugin 디렉토리에 복사하고 firefox를 실행하여 npruntime 샘플 소스에 포함되어 있는 test.html 파일을 open하여 동작을 확인한다.

sudo cp npruntime.so /usr/lib/mozilla/plugins
firefox &

참고로 firefox를 콘솔을 통해 실행할 경우, 플러그인에서 printf 등을 이용해 stdout에 출력하는 로그를 확인할 수 있다.

7 같이 보기[ | ]

8 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}