<webview>
태그
주의 사항
Electron의 <webview>
태그는 Chromium의 webview
를 기반으로 한다. 현재 이 기술은 구조적으로 큰 변화를 겪고 있다. 이로 인해 렌더링, 네비게이션, 이벤트 라우팅 등 <webview>
의 안정성에 영향을 미치고 있다. 따라서 현재로서는 <webview>
태그를 사용하지 않는 것을 권장하며, 대안으로 iframe
, WebContentsView
, 또는 임베디드 콘텐츠를 아예 사용하지 않는 구조를 고려해 보는 것이 좋다.
활성화
Electron 5 이상 버전에서는 기본적으로 webview
태그가 비활성화되어 있다. BrowserWindow
를 생성할 때 webPreferences
옵션에서 webviewTag
를 설정해 태그를 활성화해야 한다. 자세한 내용은 BrowserWindow 생성자 문서를 참고한다.
개요
외부 웹 콘텐츠를 격리된 프레임과 프로세스에서 표시한다.
프로세스: 렌더러 프로세스
이 클래스는 'electron'
모듈에서 직접 내보내지 않는다. Electron API의 다른 메서드의 반환값으로만 사용할 수 있다.
Electron 앱에서 '게스트' 콘텐츠(예: 웹 페이지)를 포함하려면 webview
태그를 사용한다. 게스트 콘텐츠는 webview
컨테이너 안에 포함된다. 앱 내에 포함된 페이지는 게스트 콘텐츠의 레이아웃과 렌더링 방식을 제어한다.
iframe
과 달리, webview
는 앱과 별도의 프로세스에서 실행된다. 웹 페이지와 동일한 권한을 가지지 않으며, 앱과 포함된 콘텐츠 간의 모든 상호작용은 비동기적으로 처리된다. 이는 앱을 포함된 콘텐츠로부터 안전하게 보호한다. 참고: 호스트 페이지에서 webview
에 대해 호출하는 대부분의 메서드는 메인 프로세스에 대한 동기 호출이 필요하다.
예제
앱에 웹 페이지를 포함시키려면, 앱의 임베더 페이지(게스트 콘텐츠를 표시할 앱 페이지)에 webview
태그를 추가한다. 가장 기본적인 형태로, webview
태그는 웹 페이지의 src
와 webview
컨테이너의 외관을 제어하는 CSS 스타일을 포함한다:
<webview id="foo" src="https://www.github.com/" style="display:inline-flex; width:640px; height:480px"></webview>
게스트 콘텐츠를 제어하려면, webview
이벤트를 수신하고 해당 이벤트에 반응하는 JavaScript를 작성할 수 있다. 다음은 두 개의 이벤트 리스너를 포함한 예제 코드다: 하나는 웹 페이지 로딩이 시작될 때, 다른 하나는 웹 페이지 로딩이 중지될 때를 감지하며, 로딩 중에는 "loading..." 메시지를 표시한다:
<script>
onload = () => {
const webview = document.querySelector('webview')
const indicator = document.querySelector('.indicator')
const loadstart = () => {
indicator.innerText = 'loading...'
}
const loadstop = () => {
indicator.innerText = ''
}
webview.addEventListener('did-start-loading', loadstart)
webview.addEventListener('did-stop-loading', loadstop)
}
</script>
내부 구현
webview
는 내부적으로 Out-of-Process iframes (OOPIFs)를 기반으로 구현된다. webview
태그는 기본적으로 섀도우 DOM을 사용해 iframe
엘리먼트를 감싸는 커스텀 엘리먼트다.
따라서 webview
의 동작은 크로스 도메인 iframe
과 매우 유사하다. 예를 들면 다음과 같다:
webview
를 클릭하면 페이지 포커스가 임베더 프레임에서webview
로 이동한다.webview
에 키보드, 마우스, 스크롤 이벤트 리스너를 추가할 수 없다.- 임베더 프레임과
webview
간의 모든 상호작용은 비동기적으로 처리된다.
CSS 스타일링 노트
webview
태그의 스타일은 내부적으로 display:flex;
를 사용한다. 이는 전통적인 레이아웃과 플렉스 박스 레이아웃을 사용할 때 자식 iframe
엘리먼트가 webview
컨테이너의 전체 높이와 너비를 채우도록 보장하기 위함이다. 기본 display:flex;
CSS 속성을 덮어쓰지 않도록 주의한다. 단, 인라인 레이아웃을 위해 display:inline-flex;
를 지정하는 경우는 예외이다.
태그 속성
webview
태그는 다음과 같은 속성을 가진다:
src
<webview src="https://www.github.com/"></webview>
src
는 현재 보이는 URL을 나타내는 문자열이다. 이 속성에 값을 할당하면 최상위 네비게이션이 시작된다.
src
에 현재 값과 동일한 값을 다시 할당하면 현재 페이지를 리로드한다.
src
속성은 data:text/plain,Hello, world!
와 같은 데이터 URL도 받아들일 수 있다.
nodeintegration
<webview src="https://www.google.com/" nodeintegration></webview>
boolean
타입의 속성이다. 이 속성이 존재하면 webview
내의 게스트 페이지는 Node.js 통합을 가지게 되며, require
와 process
같은 Node.js API를 사용해 시스템의 저수준 리소스에 접근할 수 있다. 기본적으로 게스트 페이지에서는 Node.js 통합이 비활성화되어 있다.
nodeintegrationinsubframes
<webview src="https://www.google.com/" nodeintegrationinsubframes></webview>
nodeintegrationinsubframes
는 webview
내부의 iframe과 같은 하위 프레임에서 NodeJS 지원을 활성화하는 실험적인 옵션이다. 이 옵션을 사용하면 모든 iframe에 대해 사전 로드(preload)가 적용된다. process.isMainFrame
을 사용해 현재 프레임이 메인 프레임인지 여부를 확인할 수 있다. 이 옵션은 기본적으로 게스트 페이지에서 비활성화되어 있다.
plugins
속성
<webview src="https://www.github.com/" plugins></webview>
boolean
타입의 속성이다. 이 속성이 존재하면 webview
내부의 게스트 페이지에서 브라우저 플러그인을 사용할 수 있다. 기본적으로 플러그인은 비활성화되어 있다.
preload
<!-- 파일에서 로드 -->
<webview src="https://www.github.com/" preload="./test.js"></webview>
<!-- 또는 asar 아카이브에서 로드 -->
<webview src="https://www.github.com/" preload="./app.asar/test.js"></webview>
preload
는 게스트 페이지에서 다른 스크립트가 실행되기 전에 로드될 스크립트를 지정하는 문자열이다. 스크립트의 URL 프로토콜은 file:
이어야 한다. (asar:
아카이브를 사용하는 경우에도 마찬가지다.) 이는 내부적으로 Node의 require
를 통해 로드되기 때문이며, require
는 asar:
아카이브를 가상 디렉토리로 취급한다.
게스트 페이지에 Node 통합이 없더라도 이 스크립트는 모든 Node API에 접근할 수 있다. 하지만 Node가 주입한 전역 객체는 스크립트 실행이 끝난 후 삭제된다.
httpreferrer
<webview src="https://www.github.com/" httpreferrer="https://example.com/"></webview>
string
타입의 값으로, 게스트 페이지의 리퍼러(referrer) URL을 설정한다.
useragent
<webview src="https://www.github.com/" useragent="Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko"></webview>
useragent
는 게스트 페이지가 네비게이션되기 전에 사용자 에이전트를 설정하는 문자열이다. 페이지가 로드된 후에는 setUserAgent
메서드를 사용해 사용자 에이전트를 변경할 수 있다.
disablewebsecurity
<webview src="https://www.github.com/" disablewebsecurity></webview>
boolean
타입의 속성이다. 이 속성이 존재하면 게스트 페이지에서 웹 보안이 비활성화된다. 웹 보안은 기본적으로 활성화되어 있다.
이 값은 첫 번째 네비게이션 이전에만 수정할 수 있다.
partition
<webview src="https://github.com" partition="persist:github"></webview>
<webview src="https://electronjs.org" partition="electron"></webview>
partition
은 페이지가 사용할 세션을 설정하는 문자열이다. partition
이 persist:
로 시작하면, 해당 페이지는 동일한 partition
을 가진 앱 내의 모든 페이지에서 사용할 수 있는 영구 세션을 사용한다. persist:
접두사가 없으면, 페이지는 메모리 내 세션을 사용한다. 동일한 partition
을 할당하면 여러 페이지가 같은 세션을 공유할 수 있다. partition
이 설정되지 않으면 앱의 기본 세션이 사용된다.
이 값은 첫 번째 네비게이션 전에만 수정할 수 있다. 활성화된 렌더러 프로세스의 세션은 변경할 수 없기 때문이다. 이후에 이 값을 수정하려고 하면 DOM 예외가 발생한다.
allowpopups
<webview src="https://www.github.com/" allowpopups></webview>
boolean
타입의 속성이다. 이 속성이 있으면 게스트 페이지에서 새 창을 열 수 있다. 기본적으로 팝업은 비활성화되어 있다.
webpreferences
<webview src="https://github.com" webpreferences="allowRunningInsecureContent, javascript=no"></webview>
webpreferences
는 string
타입이며, 웹뷰에 설정할 웹 환경설정을 지정하는 쉼표로 구분된 문자열 목록이다. 지원되는 모든 환경설정 문자열 목록은 BrowserWindow에서 확인할 수 있다.
이 문자열은 window.open
의 기능 문자열과 동일한 형식을 따른다. 이름만 지정하면 true
불리언 값으로 설정된다. =
뒤에 값을 추가하면 해당 환경설정을 특정 값으로 설정할 수 있다. yes
와 1
은 true
로 해석되며, no
와 0
은 false
로 해석된다.
enableblinkfeatures
<webview src="https://www.github.com/" enableblinkfeatures="PreciseMemoryInfo, CSSVariables"></webview>
enableblinkfeatures
는 ,
로 구분된 문자열 리스트를 값으로 받는다. 이 속성은 활성화할 Blink 기능을 지정한다.
지원되는 전체 기능 리스트는 RuntimeEnabledFeatures.json5 파일에서 확인할 수 있다.
disableblinkfeatures
<webview src="https://www.github.com/" disableblinkfeatures="PreciseMemoryInfo, CSSVariables"></webview>
disableblinkfeatures
는 비활성화할 Blink 기능을 지정하는 문자열 속성이다. 이 속성은 쉼표로 구분된 문자열 리스트를 값으로 받는다. 지원되는 모든 기능 문자열은 RuntimeEnabledFeatures.json5 파일에서 확인할 수 있다.
메서드
webview
태그는 다음과 같은 메서드를 제공한다.
참고: webview 엘리먼트는 메서드를 사용하기 전에 반드시 로드되어야 한다.
예제
const webview = document.querySelector('webview')
webview.addEventListener('dom-ready', () => {
webview.openDevTools()
})
<webview>.loadURL(url[, options])
url
URL
Promise<void>
를 반환 - 페이지 로드가 완료되면 프로미스가 이행된다 (did-finish-load
참조). 페이지 로드에 실패하면 프로미스가 거부된다 (did-fail-load
참조).
webview
에 url
을 로드한다. url
은 반드시 프로토콜 접두사(예: http://
또는 file://
)를 포함해야 한다.
<webview>.downloadURL(url[, options])
url
string
url
에 위치한 리소스를 다운로드하지만, 페이지 이동은 발생하지 않는다.
<webview>.getURL()
은 게스트 페이지의 URL을 문자열로 반환한다.
<webview>.getTitle()
string
타입의 값을 반환한다. 이 값은 게스트 페이지의 제목을 나타낸다.
<webview>.isLoading()
boolean
타입을 반환한다. 게스트 페이지가 여전히 리소스를 로딩 중인지 여부를 나타낸다.
<webview>.isLoadingMainFrame()
boolean
를 반환한다. 메인 프레임(내부의 iframe이나 프레임이 아닌)이 여전히 로딩 중인지 여부를 나타낸다.
<webview>.isWaitingForResponse()
boolean
을 반환한다. 게스트 페이지가 페이지의 주요 리소스에 대한 첫 번째 응답을 기다리고 있는지 여부를 나타낸다.
<webview>.stop()
보류 중인 모든 네비게이션을 중지한다.
<webview>.reload()
게스트 페이지를 다시 로드한다.
<webview>.reloadIgnoringCache()
게스트 페이지를 캐시를 무시하고 다시 로드한다.
<webview>.canGoBack()
는 boolean
값을 반환하며, 게스트 페이지가 뒤로 갈 수 있는지 여부를 나타낸다.
<webview>.canGoForward()
는 boolean
값을 반환한다. 이 값은 게스트 페이지가 앞으로 이동할 수 있는지 여부를 나타낸다.
<webview>.canGoToOffset(offset)
offset
Integer
boolean
을 반환한다. 게스트 페이지가 지정한 offset
으로 이동할 수 있는지 여부를 나타낸다.
<webview>.clearHistory()
네비게이션 기록을 모두 지운다.
<webview>.goBack()
게스트 페이지를 뒤로 이동시킨다.
<webview>.goForward()
게스트 페이지를 앞으로 이동시킨다.
<webview>.goToIndex(index)
index
Integer
지정된 절대 인덱스로 이동한다.
<webview>.goToOffset(offset)
offset
Integer
현재 항목에서 지정된 오프셋으로 이동한다.
<webview>.isCrashed()
boolean
을 반환한다. 렌더러 프로세스가 비정상 종료되었는지 여부를 나타낸다.
<webview>.setUserAgent(userAgent)
userAgent
string
게스트 페이지의 사용자 에이전트(user agent)를 재정의한다.
<webview>.getUserAgent()
는 게스트 페이지의 사용자 에이전트를 문자열로 반환한다.
<webview>.insertCSS(css)
css
string
Promise<string>
을 반환한다. 이 Promise는 나중에 <webview>.removeInsertedCSS(key)
를 통해 CSS를 제거할 때 사용할 수 있는 고유 키로 해결된다.
현재 웹 페이지에 CSS를 주입하고, 삽입된 스타일시트에 대한 고유 키를 반환한다.
<webview>.removeInsertedCSS(key)
key
string
Promise<void>
를 반환한다. CSS 제거가 성공하면 이 Promise가 이행된다.
현재 웹 페이지에 삽입된 CSS를 제거한다. 스타일시트는 <webview>.insertCSS(css)
에서 반환된 키로 식별된다.
<webview>.executeJavaScript(code[, userGesture])
code
stringuserGesture
boolean (선택 사항) - 기본값false
.
반환값: Promise<any>
- 실행된 코드의 결과로 resolve되거나, 코드의 결과가 rejected promise인 경우 reject되는 Promise
페이지에서 code
를 실행한다. userGesture
가 설정된 경우, 페이지에 사용자 제스처 컨텍스트를 생성한다. requestFullScreen
과 같은 사용자 동작이 필요한 HTML API는 이 옵션을 통해 자동화할 수 있다.
<webview>.openDevTools()
게스트 페이지의 DevTools 창을 연다.
<webview>.closeDevTools()
는 게스트 페이지의 개발자 도구(DevTools) 윈도우를 닫는다.
<webview>.isDevToolsOpened()
boolean
을 반환한다. 게스트 페이지에 DevTools 윈도우가 연결되어 있는지 여부를 나타낸다.
<webview>.isDevToolsFocused()
는 게스트 페이지의 DevTools 윈도우가 현재 포커스되었는지 여부를 나타내는 불리언 값을 반환한다.
<webview>.inspectElement(x, y)
x
Integery
Integer
게스트 페이지의 (x
, y
) 위치에 있는 엘리먼트를 검사하기 시작한다.
<webview>.inspectSharedWorker()
게스트 페이지에 있는 공유 워커(Shared Worker) 컨텍스트의 개발자 도구(DevTools)를 연다.
<webview>.inspectServiceWorker()
게스트 페이지에 있는 서비스 워커 컨텍스트의 DevTools를 연다.
<webview>.setAudioMuted(muted)
muted
boolean
게스트 페이지의 음소거 상태를 설정한다.
<webview>.isAudioMuted()
boolean
을 반환한다. 게스트 페이지의 음소거 여부를 나타낸다.
<webview>.isCurrentlyAudible()
boolean
값을 반환한다. 현재 오디오가 재생 중인지 여부를 나타낸다.
<webview>.undo()
페이지에서 편집 명령어 undo
를 실행한다.
<webview>.redo()
페이지 내에서 편집 명령어 redo
를 실행한다.
<webview>.cut()
페이지 내에서 편집 커맨드 cut
을 실행한다.
<webview>.copy()
페이지 내에서 편집 커맨드 copy
를 실행한다.
<webview>.centerSelection()
현재 페이지에서 선택한 텍스트를 가운데로 정렬한다.
<webview>.paste()
는 페이지 내에서 편집 명령어 paste
를 실행한다.
<webview>.pasteAndMatchStyle()
는 페이지 내에서 pasteAndMatchStyle
편집 명령을 실행한다. 이 메서드를 사용하면 스타일을 유지하면서 내용을 붙여넣을 수 있다.
<webview>.delete()
페이지에서 delete
편집 커맨드를 실행한다.
<webview>.selectAll()
은 페이지 내에서 편집 명령어 selectAll
을 실행한다.
<webview>.unselect()
페이지에서 편집 커맨드 unselect
를 실행한다.
<webview>.scrollToTop()
현재 <webview>
의 맨 위로 스크롤한다.
<webview>.scrollToBottom()
현재 <webview>
의 맨 아래로 스크롤한다.
<webview>.adjustSelection(options)
포커스된 프레임에서 현재 텍스트 선택 영역의 시작점과 끝점을 주어진 크기만큼 조정한다. 음수 값을 사용하면 선택 영역이 문서의 시작 방향으로 이동하고, 양수 값을 사용하면 선택 영역이 문서의 끝 방향으로 이동한다.
예제는 webContents.adjustSelection
을 참조한다.
<webview>.replace(text)
text
string
페이지에서 replace
편집 커맨드를 실행한다.
<webview>.replaceMisspelling(text)
text
string
페이지에서 replaceMisspelling
편집 커맨드를 실행한다.
<webview>.insertText(text)
text
string
Promise<void>
를 반환한다.
포커스된 엘리먼트에 text
를 삽입한다.
<webview>.findInPage(text[, options])
text
string - 검색할 내용으로, 비어 있으면 안 된다.
Integer
를 반환한다. 요청에 사용된 요청 ID이다.
웹 페이지에서 text
와 일치하는 모든 항목을 찾기 위한 요청을 시작한다. 요청 결과는 found-in-page
이벤트를 구독하여 얻을 수 있다.
<webview>.stopFindInPage(action)
action
string -<webview>.findInPage
요청을 종료할 때 수행할 동작을 지정한다.clearSelection
- 선택 영역을 지운다.keepSelection
- 선택 영역을 일반 선택으로 변환한다.activateSelection
- 선택된 노드에 포커스를 맞추고 클릭한다.
제공된 action
으로 webview
의 모든 findInPage
요청을 중단한다.
<webview>.print([options])
반환값: Promise<void>
webview
의 웹 페이지를 인쇄한다. webContents.print([options])
와 동일한 기능을 수행한다.
<webview>.printToPDF(options)
반환값 Promise<Uint8Array>
- 생성된 PDF 데이터로 해결됨.
webview
의 웹 페이지를 PDF로 출력함. webContents.printToPDF(options)
와 동일함.
<webview>.capturePage([rect])
rect
Rectangle (선택 사항) - 캡처할 페이지의 영역.
반환값: Promise<NativeImage>
- NativeImage로 resolve된다.
rect
로 지정한 영역 내의 페이지 스냅샷을 캡처한다. rect
를 생략하면 현재 보이는 전체 페이지를 캡처한다.
<webview>.send(channel, ...args)
channel
string...args
any[]
Promise<void>
를 반환한다.
channel
을 통해 렌더러 프로세스로 비동기 메시지를 보낸다. 추가로 임의의 인자를 전달할 수 있다. 렌더러 프로세스는 ipcRenderer
모듈을 사용해 channel
이벤트를 수신하여 메시지를 처리할 수 있다.
예제는 webContents.send를 참고한다.
<webview>.sendToFrame(frameId, channel, ...args)
frameId
[number, number] -[processId, frameId]
channel
string...args
any[]
Promise<void>
를 반환한다.
channel
을 통해 렌더러 프로세스로 비동기 메시지를 보낸다. 임의의 인자도 함께 전달할 수 있다. 렌더러 프로세스는 ipcRenderer
모듈을 사용해 channel
이벤트를 수신함으로써 이 메시지를 처리할 수 있다.
예제는 webContents.sendToFrame을 참고한다.
<webview>.sendInputEvent(event)
Promise<void>
를 반환한다.
페이지에 입력 event
를 전송한다.
event
객체에 대한 자세한 설명은 webContents.sendInputEvent를 참고한다.
<webview>.setZoomFactor(factor)
factor
number - 확대 비율
지정된 확대 비율로 화면을 조정한다. 확대 비율은 퍼센트 값을 100으로 나눈 값이다. 예를 들어 300%는 3.0에 해당한다.
<webview>.setZoomLevel(level)
level
number - 줌 레벨
지정된 레벨로 줌 레벨을 변경한다. 원본 크기는 0이며, 이 값을 기준으로 위아래로 증가할 때마다 각각 기본 크기의 20%씩 확대 또는 축소된다. 기본 제한은 원본 크기의 300%와 50%이다. 이 계산은 scale := 1.2 ^ level
공식을 따른다.
참고: 크로미움 레벨에서의 줌 정책은 동일 출처(same-origin)를 기반으로 한다. 즉, 특정 도메인의 줌 레벨은 동일 도메인을 가진 모든 윈도우 인스턴스에 전파된다. 윈도우 URL을 다르게 설정하면 윈도우별로 줌이 작동한다.
<webview>.getZoomFactor()
는 현재 줌 배율을 숫자로 반환한다.
<webview>.getZoomLevel()
현재 확대/축소 수준을 나타내는 number
타입의 값을 반환한다.
<webview>.setVisualZoomLevelLimits(minimumLevel, maximumLevel)
minimumLevel
numbermaximumLevel
number
Returns Promise<void>
핀치 투 줌의 최소 및 최대 확대/축소 레벨을 설정한다.
<webview>.showDefinitionForSelection()
macOS
페이지에서 선택한 단어를 검색하는 팝업 사전을 표시한다.
<webview>.getWebContentsId()
number
타입을 반환한다. 이 webview
의 WebContents ID를 가져온다.
DOM 이벤트
webview
태그에서 사용할 수 있는 DOM 이벤트는 다음과 같다:
이벤트: 'load-commit'
반환값:
url
stringisMainFrame
boolean
이 이벤트는 로드가 완료되었을 때 발생한다. 현재 문서 내의 네비게이션과 서브프레임 문서 수준의 로드를 포함하지만, 비동기 리소스 로드는 포함하지 않는다.
이벤트: 'did-finish-load'
네비게이션이 완료되면 발생하는 이벤트이다. 탭의 스피너가 멈추고, onload
이벤트가 실행된다.
이벤트: 'did-fail-load'
반환값:
errorCode
IntegererrorDescription
stringvalidatedURL
stringisMainFrame
boolean
이 이벤트는 did-finish-load
와 유사하지만, 페이지 로드가 실패하거나 취소되었을 때 발생한다. 예를 들어, window.stop()
이 호출된 경우에 이 이벤트가 실행된다.
이벤트: 'did-frame-finish-load'
반환값:
isMainFrame
boolean
프레임의 네비게이션이 완료되었을 때 발생한다.
이벤트: 'did-start-loading'
이 이벤트는 탭의 스피너가 회전하기 시작하는 시점에 발생한다.
이벤트: 'did-stop-loading'
이 이벤트는 탭의 스피너가 회전을 멈추는 시점에 해당한다.
이벤트: 'did-attach'
임베더 웹 콘텐츠에 부착되었을 때 발생한다.
이벤트: 'dom-ready'
주어진 프레임 내의 문서가 로드되면 발생한다.
이벤트: 'page-title-updated'
반환값:
title
stringexplicitSet
boolean
페이지 제목이 네비게이션 중에 설정될 때 발생한다. explicitSet
은 파일 URL에서 제목이 합성된 경우 false가 된다.
이벤트: 'page-favicon-updated'
반환값:
favicons
string[] - URL 배열
페이지가 파비콘 URL을 받았을 때 발생하는 이벤트.
이벤트: 'enter-html-full-screen'
HTML API에 의해 페이지가 전체 화면 모드로 전환될 때 발생한다.
이벤트: 'leave-html-full-screen'
HTML API에 의해 페이지가 전체 화면 모드를 종료할 때 발생하는 이벤트이다.
이벤트: 'console-message'
반환값:
level
Integer - 로그 레벨. 0부터 3까지의 값을 가지며, 각각verbose
,info
,warning
,error
에 대응한다.message
string - 실제 콘솔 메시지line
Integer - 이 콘솔 메시지를 발생시킨 소스 코드의 라인 번호sourceId
string
게스트 윈도우에서 콘솔 메시지를 기록할 때 발생한다.
다음 예제 코드는 로그 레벨이나 기타 속성에 상관없이 모든 로그 메시지를 임베더의 콘솔로 전달한다.
const webview = document.querySelector('webview')
webview.addEventListener('console-message', (e) => {
console.log('Guest page logged a message:', e.message)
})
이벤트: 'found-in-page'
반환값:
result
객체requestId
정수activeMatchOrdinal
정수 - 현재 일치하는 항목의 위치matches
정수 - 일치하는 항목의 총 개수selectionArea
Rectangle - 첫 번째 일치 영역의 좌표finalUpdate
boolean - 최종 업데이트 여부
webview.findInPage
요청에 대한 결과가 준비되면 이 이벤트가 발생한다.
const webview = document.querySelector('webview')
webview.addEventListener('found-in-page', (e) => {
webview.stopFindInPage('keepSelection')
})
const requestId = webview.findInPage('test')
console.log(requestId)
이벤트: 'will-navigate'
반환값:
url
string
사용자 또는 페이지가 네비게이션을 시작하려고 할 때 발생한다. window.location
객체가 변경되거나 사용자가 페이지 내 링크를 클릭할 때 이 이벤트가 발생할 수 있다.
<webview>.loadURL
이나 <webview>.back
같은 API를 사용해 프로그래밍 방식으로 네비게이션을 시작할 때는 이 이벤트가 발생하지 않는다.
또한, 앵커 링크를 클릭하거나 window.location.hash
를 업데이트하는 경우와 같은 페이지 내 네비게이션 중에도 이 이벤트는 발생하지 않는다. 이러한 경우에는 did-navigate-in-page
이벤트를 사용한다.
event.preventDefault()
를 호출해도 아무런 효과가 없다.
이벤트: 'will-frame-navigate'
반환값:
url
stringisMainFrame
booleanframeProcessId
IntegerframeRoutingId
Integer
이 이벤트는 사용자 또는 페이지가 <webview>
내부 또는 임베드된 프레임에서 네비게이션을 시작하려고 할 때 발생한다. window.location
객체가 변경되거나 사용자가 페이지 내 링크를 클릭할 때 트리거될 수 있다.
이 이벤트는 <webview>.loadURL
이나 <webview>.back
과 같은 API를 통해 프로그래밍적으로 네비게이션이 시작될 때는 발생하지 않는다.
또한, 앵커 링크를 클릭하거나 window.location.hash
를 업데이트하는 등의 페이지 내 네비게이션 중에는 이벤트가 발생하지 않는다. 이러한 경우에는 did-navigate-in-page
이벤트를 사용한다.
event.preventDefault()
를 호출해도 아무런 효과가 없다.
이벤트: 'did-start-navigation'
반환값:
url
stringisInPlace
booleanisMainFrame
booleanframeProcessId
IntegerframeRoutingId
Integer
메인 프레임을 포함한 모든 프레임이 네비게이션을 시작할 때 발생한다. 페이지 내 네비게이션의 경우 isInPlace
는 true
가 된다.
이벤트: 'did-redirect-navigation'
반환값:
url
stringisInPlace
booleanisMainFrame
booleanframeProcessId
IntegerframeRoutingId
Integer
네비게이션 중 서버 측 리다이렉트가 발생한 후에 이 이벤트가 발생한다. 예를 들어 302 리다이렉트가 있을 때 이 이벤트가 트리거된다.
이벤트: 'did-navigate'
반환값:
url
string
네비게이션이 완료되었을 때 발생한다.
이 이벤트는 앵커 링크를 클릭하거나 window.location.hash
를 업데이트하는 등의 페이지 내 네비게이션에는 발생하지 않는다. 이러한 경우에는 did-navigate-in-page
이벤트를 사용해야 한다.
이벤트: 'did-frame-navigate'
반환값:
url
stringhttpResponseCode
Integer - HTTP가 아닌 네비게이션의 경우 -1httpStatusText
string - HTTP가 아닌 네비게이션의 경우 빈 문자열isMainFrame
booleanframeProcessId
IntegerframeRoutingId
Integer
어떤 프레임의 네비게이션이 완료되었을 때 발생한다.
이 이벤트는 앵커 링크를 클릭하거나 window.location.hash
를 업데이트하는 등의 페이지 내 네비게이션에는 발생하지 않는다. 이러한 경우에는 did-navigate-in-page
이벤트를 사용한다.
이벤트: 'did-navigate-in-page'
반환값:
isMainFrame
booleanurl
string
페이지 내부에서 네비게이션이 발생했을 때 이벤트가 발생한다.
페이지 내부 네비게이션은 페이지 URL이 변경되지만, 페이지 외부로의 네비게이션을 유발하지 않는다. 이는 앵커 링크를 클릭하거나 DOM의 hashchange
이벤트가 트리거될 때와 같은 상황에서 발생한다.
이벤트: 'close'
게스트 페이지가 스스로 닫으려고 시도할 때 발생한다.
아래 예제 코드는 게스트가 닫으려고 할 때 webview
를 about:blank
로 이동시킨다.
const webview = document.querySelector('webview')
webview.addEventListener('close', () => {
webview.src = 'about:blank'
})
이벤트: 'ipc-message'
반환값:
frameId
[number, number] -[processId, frameId]
쌍channel
stringargs
any[]
게스트 페이지가 임베더 페이지로 비동기 메시지를 보낼 때 발생한다.
sendToHost
메서드와 ipc-message
이벤트를 사용해 게스트 페이지와 임베더 페이지 간 통신이 가능하다:
// 임베더 페이지에서
const webview = document.querySelector('webview')
webview.addEventListener('ipc-message', (event) => {
console.log(event.channel)
// "pong" 출력
})
webview.send('ping')
// 게스트 페이지에서
const { ipcRenderer } = require('electron')
ipcRenderer.on('ping', () => {
ipcRenderer.sendToHost('pong')
})
이벤트: 'render-process-gone'
반환값:
details
RenderProcessGoneDetails
렌더러 프로세스가 예기치 않게 종료될 때 발생한다. 일반적으로 프로세스가 충돌하거나 강제 종료된 경우에 이 이벤트가 발생한다.
이벤트: 'plugin-crashed'
반환값:
name
stringversion
string
플러그인 프로세스가 비정상 종료될 때 발생한다.
이벤트: 'destroyed'
WebContents가 파괴될 때 발생한다.
이벤트: 'media-started-playing'
미디어 재생이 시작될 때 발생한다.
이벤트: 'media-paused'
미디어가 일시 중지되거나 재생이 완료되었을 때 발생한다.
이벤트: 'did-change-theme-color'
반환값:
themeColor
string
페이지의 테마 색상이 변경될 때 발생하는 이벤트. 일반적으로 다음과 같은 메타 태그를 만났을 때 트리거된다:
<meta name='theme-color' content='#ff0000'>
이벤트: 'update-target-url'
반환값:
url
string
마우스가 링크 위로 이동하거나 키보드로 링크에 포커스가 이동할 때 발생한다.
이벤트: 'devtools-open-url'
반환값:
url
string - 클릭하거나 선택한 링크의 URL
DevTools에서 링크를 클릭하거나 컨텍스트 메뉴에서 '새 탭에서 열기'를 선택했을 때 발생한다.
이벤트: 'devtools-search-query'
반환값:
event
Eventquery
string - 검색할 텍스트
컨텍스트 메뉴에서 '검색'을 선택했을 때 발생하는 이벤트다.
Event: 'devtools-opened'
DevTools가 열릴 때 발생하는 이벤트다.
이벤트: 'devtools-closed'
DevTools가 닫힐 때 발생한다.
이벤트: 'devtools-focused'
DevTools가 포커스되거나 열릴 때 발생한다.
이벤트: 'context-menu'
반환값:
params
객체x
정수 - x 좌표.y
정수 - y 좌표.linkURL
문자열 - 컨텍스트 메뉴가 호출된 노드를 감싸는 링크의 URL.linkText
문자열 - 링크와 관련된 텍스트. 링크 내용이 이미지인 경우 빈 문자열일 수 있음.pageURL
문자열 - 컨텍스트 메뉴가 호출된 최상위 페이지의 URL.frameURL
문자열 - 컨텍스트 메뉴가 호출된 서브프레임의 URL.srcURL
문자열 - 컨텍스트 메뉴가 호출된 엘리먼트의 소스 URL. 소스 URL을 가진 엘리먼트는 이미지, 오디오, 비디오 등이 있음.mediaType
문자열 - 컨텍스트 메뉴가 호출된 노드의 타입.none
,image
,audio
,video
,canvas
,file
,plugin
중 하나.hasImageContents
불리언 - 컨텍스트 메뉴가 비어 있지 않은 내용을 가진 이미지에서 호출되었는지 여부.isEditable
불리언 - 컨텍스트가 편집 가능한지 여부.selectionText
문자열 - 컨텍스트 메뉴가 호출된 선택 영역의 텍스트.titleText
문자열 - 컨텍스트 메뉴가 호출된 선택 영역의 제목 텍스트.altText
문자열 - 컨텍스트 메뉴가 호출된 선택 영역의 대체 텍스트.suggestedFilename
문자열 - 컨텍스트 메뉴의 '다른 이름으로 링크 저장' 옵션을 통해 파일을 저장할 때 사용할 제안된 파일명.selectionRect
Rectangle - 문서 공간에서 선택 영역의 좌표를 나타내는 사각형.selectionStartOffset
숫자 - 선택 텍스트의 시작 위치.referrerPolicy
Referrer - 메뉴가 호출된 프레임의 리퍼러 정책.misspelledWord
문자열 - 커서 아래의 잘못된 단어, 존재하는 경우.dictionarySuggestions
문자열[] -misspelledWord
를 대체하기 위해 사용자에게 보여줄 제안된 단어 배열. 오타가 있고 맞춤법 검사기가 활성화된 경우에만 사용 가능.frameCharset
문자열 - 메뉴가 호출된 프레임의 문자 인코딩.formControlType
문자열 - 컨텍스트 메뉴가 호출된 소스. 가능한 값은none
,button-button
,field-set
,input-button
,input-checkbox
,input-color
,input-date
,input-datetime-local
,input-email
,input-file
,input-hidden
,input-image
,input-month
,input-number
,input-password
,input-radio
,input-range
,input-reset
,input-search
,input-submit
,input-telephone
,input-text
,input-time
,input-url
,input-week
,output
,reset-button
,select-list
,select-list
,select-multiple
,select-one
,submit-button
,text-area
등이 있음.spellcheckEnabled
불리언 - 컨텍스트가 편집 가능한 경우, 맞춤법 검사가 활성화되었는지 여부.menuSourceType
문자열 - 컨텍스트 메뉴를 호출한 입력 소스. 가능한 값은none
,mouse
,keyboard
,touch
,touchMenu
,longPress
,longTap
,touchHandle
,stylus
,adjustSelection
,adjustSelectionReset
등이 있음.mediaFlags
객체 - 컨텍스트 메뉴가 호출된 미디어 엘리먼트의 플래그.inError
불리언 - 미디어 엘리먼트가 충돌했는지 여부.isPaused
불리언 - 미디어 엘리먼트가 일시 중지되었는지 여부.isMuted
불리언 - 미디어 엘리먼트가 음소거되었는지 여부.hasAudio
불리언 - 미디어 엘리먼트에 오디오가 있는지 여부.isLooping
불리언 - 미디어 엘리먼트가 반복 재생 중인지 여부.isControlsVisible
불리언 - 미디어 엘리먼트의 컨트롤이 보이는지 여부.canToggleControls
불리언 - 미디어 엘리먼트의 컨트롤을 토글할 수 있는지 여부.canPrint
불리언 - 미디어 엘리먼트를 인쇄할 수 있는지 여부.canSave
불리언 - 미디어 엘리먼트를 다운로드할 수 있는지 여부.canShowPictureInPicture
불리언 - 미디어 엘리먼트가 Picture-in-Picture를 보여줄 수 있는지 여부.isShowingPictureInPicture
불리언 - 미디어 엘리먼트가 현재 Picture-in-Picture를 보여주고 있는지 여부.canRotate
불리언 - 미디어 엘리먼트를 회전할 수 있는지 여부.canLoop
불리언 - 미디어 엘리먼트를 반복할 수 있는지 여부.
editFlags
객체 - 렌더러가 해당 작업을 수행할 수 있다고 판단하는지 여부를 나타내는 플래그.canUndo
불리언 - 렌더러가 실행 취소를 할 수 있다고 판단하는지 여부.canRedo
불리언 - 렌더러가 다시 실행을 할 수 있다고 판단하는지 여부.canCut
불리언 - 렌더러가 잘라내기를 할 수 있다고 판단하는지 여부.canCopy
불리언 - 렌더러가 복사를 할 수 있다고 판단하는지 여부.canPaste
불리언 - 렌더러가 붙여넣기를 할 수 있다고 판단하는지 여부.canDelete
불리언 - 렌더러가 삭제를 할 수 있다고 판단하는지 여부.canSelectAll
불리언 - 렌더러가 전체 선택을 할 수 있다고 판단하는지 여부.canEditRichly
불리언 - 렌더러가 텍스트를 풍부하게 편집할 수 있다고 판단하는지 여부.
처리해야 할 새로운 컨텍스트 메뉴가 있을 때 발생한다.