SlideShare a Scribd company logo
PROTOCOL HANDLER
in Gecko
Tommy Kuo [:KuoE0]
kuoe0@mozilla.com
2015.03.03 @Mozilla Taiwan
Outline
• What Protocol Handlers Can Do
• The Walkthrough from Awesome Bar to Protocol
Handlers
• The Brief Introduction to Channels
What Protocol Handlers
Can Do
URI Syntax
<scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ]
http : //google.com/search ? q=Mozilla
https : //www.facebook.com/pages/郝神好神/871866229523862
file : ///Downloads/郝神好帥.jpg
about : config
mailto : kuoe0@mozilla.com
chrome : //browser/skin/Info.png
line : //shop/detail/xxx
Protocol Handler
Format the URI Create the channel Get flags
NewChannel2(…)
NewProxiedChannel2(…)
NewURI(…) GetProtocolFlags(…)
nsresult
nsIOService::NewURI(const nsACString &aSpec, const char *aCharset, nsIURI *aBaseURI,
nsIURI **result)
{
NS_ASSERTION(NS_IsMainThread(), "wrong thread");
static uint32_t recursionCount = 0;
if (recursionCount >= MAX_RECURSION_COUNT)
return NS_ERROR_MALFORMED_URI;
AutoIncrement inc(&recursionCount);
nsAutoCString scheme;
nsresult rv = ExtractScheme(aSpec, scheme);
if (NS_FAILED(rv)) {
// then aSpec is relative
if (!aBaseURI)
return NS_ERROR_MALFORMED_URI;
rv = aBaseURI->GetScheme(scheme);
if (NS_FAILED(rv)) return rv;
}
// now get the handler for this scheme
nsCOMPtr<nsIProtocolHandler> handler;
rv = GetProtocolHandler(scheme.get(), getter_AddRefs(handler));
if (NS_FAILED(rv)) return rv;
return handler->NewURI(aSpec, aCharset, aBaseURI, result);
}
nsIOService::NewURI
(netwerk/base/nsIOService.cpp)
nsCOMPtr<nsIProtocolHandler> handler;
rv = GetProtocolHandler(scheme.get(), getter_AddRefs(handler));
if (NS_FAILED(rv))
return rv;
uint32_t protoFlags;
rv = handler->GetProtocolFlags(&protoFlags);
if (NS_FAILED(rv))
return rv;
bool newChannel2Succeeded = true;
nsCOMPtr<nsIProxiedProtocolHandler> pph = do_QueryInterface(handler);
if (pph) {
rv = pph->NewProxiedChannel2(aURI, nullptr, aProxyFlags, aProxyURI, aLoadInfo, result);
// if calling NewProxiedChannel2() fails we try to fall back to
// creating a new proxied channel by calling NewProxiedChannel().
if (NS_FAILED(rv)) {
newChannel2Succeeded = false;
rv = pph->NewProxiedChannel(aURI, nullptr, aProxyFlags, aProxyURI, result);
}
}
else {
rv = handler->NewChannel2(aURI, aLoadInfo, result);
// if calling newChannel2() fails we try to fall back to
// creating a new channel by calling NewChannel().
if (NS_FAILED(rv)) {
newChannel2Succeeded = false;
rv = handler->NewChannel(aURI, result);
}
}
nsIOService::NewChannelFromURIWithProxyFlagsInternal
(netwerk/base/nsIOService.cpp)
nsCOMPtr<nsIProtocolHandler> handler;
rv = GetProtocolHandler(scheme.get(), getter_AddRefs(handler));
if (NS_FAILED(rv))
return rv;
uint32_t protoFlags;
rv = handler->GetProtocolFlags(&protoFlags);
if (NS_FAILED(rv))
return rv;
bool newChannel2Succeeded = true;
nsCOMPtr<nsIProxiedProtocolHandler> pph = do_QueryInterface(handler);
if (pph) {
rv = pph->NewProxiedChannel2(aURI, nullptr, aProxyFlags, aProxyURI, aLoadInfo, result);
// if calling NewProxiedChannel2() fails we try to fall back to
// creating a new proxied channel by calling NewProxiedChannel().
if (NS_FAILED(rv)) {
newChannel2Succeeded = false;
rv = pph->NewProxiedChannel(aURI, nullptr, aProxyFlags, aProxyURI, result);
}
}
else {
rv = handler->NewChannel2(aURI, aLoadInfo, result);
// if calling newChannel2() fails we try to fall back to
// creating a new channel by calling NewChannel().
if (NS_FAILED(rv)) {
newChannel2Succeeded = false;
rv = handler->NewChannel(aURI, result);
}
}
nsIOService::NewChannelFromURIWithProxyFlagsInternal
(netwerk/base/nsIOService.cpp)
Create An Protocol Handler
• Implementation
• NewURI
• NewChannel2 / NewChannel (not recommended)
• GetProtocolFlags
• Registration
• See 謀智菜逼⼋八談 XPCOM 實務⼊入⾨門
./extensions/gnomevfs/nsGnomeVFSProtocolHandler.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MOZ_GNOMEVFS_SCHEME,
&kNS_GNOMEVFSPROTOCOLHANDLER_CID },
./extensions/gio/nsGIOProtocolHandler.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MOZ_GIO_SCHEME,
&kNS_GIOPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "file", &kNS_FILEPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "http", &kNS_HTTPPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "https", &kNS_HTTPSPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ftp", &kNS_FTPPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "resource", &kNS_RESPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "about", &kNS_ABOUTPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-safe-about",
&kNS_SAFEABOUTPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "app", &kNS_APPPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "data", &kNS_DATAPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-device",
&kNS_DEVICEPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "view-source",
&kNS_VIEWSOURCEHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "wyciwyg",
&kNS_WYCIWYGPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ws", &kNS_WEBSOCKETPROTOCOLHANDLER_CID },
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "wss", &kNS_WEBSOCKETSSLPROTOCOLHANDLER_CID
},
./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "rtsp", &kNS_RTSPPROTOCOLHANDLER_CID },
./image/decoders/icon/nsIconModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-icon", &kNS_ICONPROTOCOL_CID },
./xpcom/build/XPCOMInit.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "chrome", &kNS_CHROMEPROTOCOLHANDLER_CID },
./toolkit/components/places/nsPlacesModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-anno",
&kNS_ANNOPROTOCOLHANDLER_CID },
./widget/android/nsWidgetFactory.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "android",
&kNS_ANDROIDPROTOCOLHANDLER_CID },
./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX BLOBURI_SCHEME,
&kNS_BLOBPROTOCOLHANDLER_CID },
./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MEDIASTREAMURI_SCHEME,
&kNS_MEDIASTREAMPROTOCOLHANDLER_CID },
./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MEDIASOURCEURI_SCHEME,
&kNS_MEDIASOURCEPROTOCOLHANDLER_CID },
./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX FONTTABLEURI_SCHEME,
&kNS_FONTTABLEPROTOCOLHANDLER_CID },
./modules/libjar/nsJARFactory.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "jar", &kNS_JARPROTOCOLHANDLER_CID },
$ grep -ir -E "{ NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX [^,]+,[^}]+ }" .
Awesome Bar to
Protocol Handlers
Protocol handler in Gecko
http://google.com/
http://google.com/
How to interact to HTTP protocol?
handleCommand
openUILinkIn
openLinkIn
loadURIWithFlags (tabbrowser)
loadURIWithFlags (browser)
LoadURI(char16_t*, …)
LoadURIWithBase
LoadURI(nsIURI*, …)
InternalLoad
DoURILoad
DoChannelLoad
NS_NewURI
NS_NewChannelInternal
Browser UI
(XUL)
DocShell Necko
GetProtocolHandler
GetProtocolHandler
nsIURI
nsIChannel
NewURI
NewChannel2
Browser UI
<textbox id=“urlbar"></text>
browser/base/content/browser.xul
<tabbrowser />
<textbox id="urlbar" flex="1"
placeholder="&urlbar.placeholder2;"
type="autocomplete"
autocompletesearch="urlinline history"
autocompletesearchparam="enable-actions"
autocompletepopup="PopupAutoCompleteRichResult"
completeselectedindex="true"
tabscrolling="true"
showcommentcolumn="true"
showimagecolumn="true"
enablehistory="true"
maxrows="6"
newlines="stripsurroundingwhitespace"
ontextentered="this.handleCommand(param);"
ontextreverted="return this.handleRevert();"
pageproxystate="invalid"
onfocus="document.getElementById('identity-
box').style.MozUserFocus= 'normal'"
onblur="setTimeout(() =>
{ document.getElementById('identity-box').style.MozUserFocus = ''; }, 0);”>
. . . . . .
</textbox>
browser/base/content/urlbarBindings.xml
handleCommand
1.Canonize URI
2.Detect target in the current tab or a new tab
3.Call openUILinkIn
browser/base/content/urlbarBindings.xml
google mozilla https://www.google.com.tw/search?q=mozilla search engine
tv http://tv.atmovies.com.tw/tv/attv.cfm?action=todaytime bookmark keyword
google http://www.google.com
hotkey
(Ctrl/Cmd+Enter)
google http://www.google.net
hotkey
(Shift+Enter)
openUILinkIn
1. Set parameters
• third-party fix-up permission
• post data
• referrer URI
2. Call openLinkIn
browser/base/content/utilityOverlay.js
openLinkIn
1. Set target to open URI
• current tab
• new tab
• new window
2. Call loadURIWithFlags (tabbrowser)
browser/base/content/utilityOverlay.js
loadURIWithFlags (tabbrowser)
1. Call loadURIWithFlags of its member browser
object
browser/base/content/tabbrowser.xml
loadURIWithFlags (browser)
1. Set “about:blank” for empty URI
2. Call loadURI
• Call nsDocShell::LoadURI actually
source/toolkit/content/widgets/browser.xml
DocShell
LoadURI(char16_t*, …)
1. Call LoadURIWithBase
docshell/base/nsDocShell.cpp
LoadURIWithBase
1. Check navigatable or not
2. Call NS_NewURI to create an instance of nsIURI
3. Fix up URI if allowed
4. Call LoadURI
docshell/base/nsDocShell.cpp
ttp → http
ps → https
le → file
LoadURI(nsIURI*, …)
1. Check navigatable or not
2. Redirect if needed
3. Call LoadHistoryEntry to load from history if
shEntry exists
4. Call InternalLoad
docshell/base/nsDocShell.cpp
session history
InternalLoad
1. Get content policy
2. Decide to load or not according to the content policy
3. Do shortcut loading if only hash tags are different
4. Call DoURILoad
docshell/base/nsDocShell.cpp
DoURILoad
1. URI is not a source document
• Call NS_NewChannelInternal to create channel
2. URI is a source document
• Get “view-source” channel if protocol is “view-source”
• Call NS_NewInputStreamChannelInternal to create
channel for “text/html”
3. Setup some data for specific protocols
4. Call DoChannelLoad to load channel
docshell/base/nsDocShell.cpp
Necko
NS_NewURI NS_NewChannelInternal (7 parameter)
nsIOService::NewURI
GetProtocolHandler
NS_NewChannelInternal (11 parameter)
NewChannelFromURI2
NewChannelFromURIWithProxyFlagsInternal
GetProtocolHandler
DoURILoadLoadURIWithBase
Call Stack
GetProtocolHandler
1.Return protocol handler if the protocol handler was
cached
2.For internal protocol
• Cache the protocol handler and return
3.For external protocol
• Get default external protocol handler for external
protocol
netwerk/base/nsIOService.cpp
Protocols are not provided in gecko.
Protocol handler in Gecko
The Brief Introduction to
Channels
Channel (nsIChannel)
AsyncOpen() (Non-blocking IO)
Asynchronously open this channel. Data is fed to the
specified stream listener as it becomes available.
Open() (Blocking IO)
Synchronously open the channel.
Listener (nsIStreamListener)
OnStartRequest()
Called to signify the beginning of an asynchronous request.
OnStopRequest()
Called to signify the end of an asynchronous request.
OnDataAvailable()
Called when the next chunk of data may be read without
blocking the calling thread.
nsDocShell::DoChannelLoad
nsURILoader::OpenURI nsDocumentOpenInfo
nsIChannel::AsyncOpen
nsIChannel
create
call
call
nsIAsyncInputStream
create
nsInputStreamPump::AsyncRead
call
nsDocShell
nsIChannel
nsIAsyncStream
listen by nsDocmentOpenInfo
listen by self (nsIChannel)
nsDocShell nsIChannel nsIAsyncStream
OnStartRequest
OnDataAvailable
OnStopRequest
OnStartRequest
OnDataAvailable
OnStopRequest
Read
Thank you!

More Related Content

What's hot (20)

PPT
Whats new in_csharp4
Abed Bukhari
 
PDF
Metaprogramming and Reflection in Common Lisp
Damien Cassou
 
PDF
Understanding greenlet
Saúl Ibarra Corretgé
 
PDF
The Ring programming language version 1.5.3 book - Part 25 of 184
Mahmoud Samir Fayed
 
PDF
Python Coroutines, Present and Future
emptysquare
 
PDF
Clang tidy
Yury Yafimachau
 
PPT
bluespec talk
Suman Karumuri
 
PDF
Qt Rest Server
Vasiliy Sorokin
 
PDF
Rust concurrency tutorial 2015 12-02
nikomatsakis
 
PPTX
All you need to know about the JavaScript event loop
Saša Tatar
 
PDF
Rust Mozlando Tutorial
nikomatsakis
 
PPTX
Grand Central Dispatch in Objective-C
Pavel Albitsky
 
PDF
TensorFlow XLA RPC
Mr. Vengineer
 
PDF
A deep dive into PEP-3156 and the new asyncio module
Saúl Ibarra Corretgé
 
PDF
Python opcodes
alexgolec
 
PDF
4. Обработка ошибок, исключения, отладка
DEVTYPE
 
DOCX
Ns2programs
Meenakshi Devi
 
PDF
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Sergey Platonov
 
PDF
Алексей Кутумов, Coroutines everywhere
Sergey Platonov
 
Whats new in_csharp4
Abed Bukhari
 
Metaprogramming and Reflection in Common Lisp
Damien Cassou
 
Understanding greenlet
Saúl Ibarra Corretgé
 
The Ring programming language version 1.5.3 book - Part 25 of 184
Mahmoud Samir Fayed
 
Python Coroutines, Present and Future
emptysquare
 
Clang tidy
Yury Yafimachau
 
bluespec talk
Suman Karumuri
 
Qt Rest Server
Vasiliy Sorokin
 
Rust concurrency tutorial 2015 12-02
nikomatsakis
 
All you need to know about the JavaScript event loop
Saša Tatar
 
Rust Mozlando Tutorial
nikomatsakis
 
Grand Central Dispatch in Objective-C
Pavel Albitsky
 
TensorFlow XLA RPC
Mr. Vengineer
 
A deep dive into PEP-3156 and the new asyncio module
Saúl Ibarra Corretgé
 
Python opcodes
alexgolec
 
4. Обработка ошибок, исключения, отладка
DEVTYPE
 
Ns2programs
Meenakshi Devi
 
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Sergey Platonov
 
Алексей Кутумов, Coroutines everywhere
Sergey Platonov
 

Viewers also liked (20)

PDF
軟體工程師的3大試煉-大安高工資訊科講座
bobo52310
 
PDF
Necko walkthrough
Chih-Hsuan Kuo
 
PDF
[WWW2012] analyzing spammers' social networks for fun and profit
Chih-Hsuan Kuo
 
PDF
Pocket Authentication with OAuth on Firefox OS
Chih-Hsuan Kuo
 
PDF
Use C++ to Manipulate mozSettings in Gecko
Chih-Hsuan Kuo
 
PDF
Everyone's An Influencer: Quantifying Influence on Twitter
Path of the Blue Eye Project
 
PDF
在開始工作以前,我以為我會寫扣。
Chih-Hsuan Kuo
 
PDF
面試面試面試,因為很重要所以要說三次!
Chih-Hsuan Kuo
 
PDF
KOHA the first open-source Integrated Library System (ILS): An overview of it...
AIMS (Agricultural Information Management Standards)
 
PPT
HTML
Doeun KOCH
 
PDF
Actividad semana 4 ova
counter123
 
PDF
Boletin no. 5 r.c. trujillo san andres
Rotary Club Trujillo San Andres
 
PDF
Optimizing Near-Synonym System
Siyuan Zhou
 
PDF
Pdf
w1w2w3w4w5
 
PPT
Thank You Boys! (Danke Jungs!)
Darryl Heron
 
KEY
Standard Bank Presentation - PLi 2010
petelaburn
 
PDF
Competecewhitepaper
MOtto Phongsuwan
 
PPTX
12121212
Etietop Demas
 
PDF
30 Lyriker
boell2.0
 
PDF
Mafia96
Avabanda
 
軟體工程師的3大試煉-大安高工資訊科講座
bobo52310
 
Necko walkthrough
Chih-Hsuan Kuo
 
[WWW2012] analyzing spammers' social networks for fun and profit
Chih-Hsuan Kuo
 
Pocket Authentication with OAuth on Firefox OS
Chih-Hsuan Kuo
 
Use C++ to Manipulate mozSettings in Gecko
Chih-Hsuan Kuo
 
Everyone's An Influencer: Quantifying Influence on Twitter
Path of the Blue Eye Project
 
在開始工作以前,我以為我會寫扣。
Chih-Hsuan Kuo
 
面試面試面試,因為很重要所以要說三次!
Chih-Hsuan Kuo
 
KOHA the first open-source Integrated Library System (ILS): An overview of it...
AIMS (Agricultural Information Management Standards)
 
Actividad semana 4 ova
counter123
 
Boletin no. 5 r.c. trujillo san andres
Rotary Club Trujillo San Andres
 
Optimizing Near-Synonym System
Siyuan Zhou
 
Thank You Boys! (Danke Jungs!)
Darryl Heron
 
Standard Bank Presentation - PLi 2010
petelaburn
 
Competecewhitepaper
MOtto Phongsuwan
 
12121212
Etietop Demas
 
30 Lyriker
boell2.0
 
Mafia96
Avabanda
 
Ad

Similar to Protocol handler in Gecko (20)

PDF
服务框架: Thrift & PasteScript
Qiangning Hong
 
PDF
Presto anatomy
Dongmin Yu
 
PDF
Fun Teaching MongoDB New Tricks
MongoDB
 
PDF
[232]TensorRT를 활용한 딥러닝 Inference 최적화
NAVER D2
 
PDF
[232] TensorRT를 활용한 딥러닝 Inference 최적화
NAVER D2
 
PDF
Protobuf & Code Generation + Go-Kit
Manfred Touron
 
PDF
[245] presto 내부구조 파헤치기
NAVER D2
 
PDF
Solr @ Etsy - Apache Lucene Eurocon
Giovanni Fernandez-Kincade
 
PDF
Microservices in GO - Massimiliano Dessì - Codemotion Rome 2017
Codemotion
 
PDF
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
KAI CHU CHUNG
 
ODP
Finagle and Java Service Framework at Pinterest
Pavan Chitumalla
 
PDF
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
PROIDEA
 
PDF
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
KAI CHU CHUNG
 
PPT
TopicMapReduceComet log analysis by using splunk
akashkale0756
 
PPT
Server side JavaScript: going all the way
Oleg Podsechin
 
PDF
What’s cool in the new and updated OSGi specs (DS, Cloud and more) - C Ziegel...
mfrancis
 
ODP
Jersey Guice AOP
Domenico Briganti
 
PDF
Clojure and the Web
nickmbailey
 
PDF
202107 - Orion introduction - COSCUP
Ronald Hsu
 
PDF
Extending functionality in nginx, with modules!
Trygve Vea
 
服务框架: Thrift & PasteScript
Qiangning Hong
 
Presto anatomy
Dongmin Yu
 
Fun Teaching MongoDB New Tricks
MongoDB
 
[232]TensorRT를 활용한 딥러닝 Inference 최적화
NAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
NAVER D2
 
Protobuf & Code Generation + Go-Kit
Manfred Touron
 
[245] presto 내부구조 파헤치기
NAVER D2
 
Solr @ Etsy - Apache Lucene Eurocon
Giovanni Fernandez-Kincade
 
Microservices in GO - Massimiliano Dessì - Codemotion Rome 2017
Codemotion
 
如何透過 Go-kit 快速搭建微服務架構應用程式實戰
KAI CHU CHUNG
 
Finagle and Java Service Framework at Pinterest
Pavan Chitumalla
 
4Developers 2018: Evolution of C++ Class Design (Mariusz Łapiński)
PROIDEA
 
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
KAI CHU CHUNG
 
TopicMapReduceComet log analysis by using splunk
akashkale0756
 
Server side JavaScript: going all the way
Oleg Podsechin
 
What’s cool in the new and updated OSGi specs (DS, Cloud and more) - C Ziegel...
mfrancis
 
Jersey Guice AOP
Domenico Briganti
 
Clojure and the Web
nickmbailey
 
202107 - Orion introduction - COSCUP
Ronald Hsu
 
Extending functionality in nginx, with modules!
Trygve Vea
 
Ad

More from Chih-Hsuan Kuo (20)

PDF
[Mozilla] content-select
Chih-Hsuan Kuo
 
PDF
應徵軟體工程師
Chih-Hsuan Kuo
 
PDF
面試心得分享
Chih-Hsuan Kuo
 
PDF
Windows 真的不好用...
Chih-Hsuan Kuo
 
PDF
Python @Wheel Lab
Chih-Hsuan Kuo
 
PDF
Introduction to VP8
Chih-Hsuan Kuo
 
PDF
Python @NCKU CSIE
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Tree Isomorphism
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Dinic's Algorithm
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Disjoint Set
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Traversal
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] UVa-10245
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Sort
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Efficient Algorithm
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Top-down & Bottom-up
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] About I/O
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Bipartite Matching
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Minimum Cut
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] Tree Isomorphism
Chih-Hsuan Kuo
 
PDF
[ACM-ICPC] 1 - Basic
Chih-Hsuan Kuo
 
[Mozilla] content-select
Chih-Hsuan Kuo
 
應徵軟體工程師
Chih-Hsuan Kuo
 
面試心得分享
Chih-Hsuan Kuo
 
Windows 真的不好用...
Chih-Hsuan Kuo
 
Python @Wheel Lab
Chih-Hsuan Kuo
 
Introduction to VP8
Chih-Hsuan Kuo
 
Python @NCKU CSIE
Chih-Hsuan Kuo
 
[ACM-ICPC] Tree Isomorphism
Chih-Hsuan Kuo
 
[ACM-ICPC] Dinic's Algorithm
Chih-Hsuan Kuo
 
[ACM-ICPC] Disjoint Set
Chih-Hsuan Kuo
 
[ACM-ICPC] Traversal
Chih-Hsuan Kuo
 
[ACM-ICPC] UVa-10245
Chih-Hsuan Kuo
 
[ACM-ICPC] Sort
Chih-Hsuan Kuo
 
[ACM-ICPC] Efficient Algorithm
Chih-Hsuan Kuo
 
[ACM-ICPC] Top-down & Bottom-up
Chih-Hsuan Kuo
 
[ACM-ICPC] About I/O
Chih-Hsuan Kuo
 
[ACM-ICPC] Bipartite Matching
Chih-Hsuan Kuo
 
[ACM-ICPC] Minimum Cut
Chih-Hsuan Kuo
 
[ACM-ICPC] Tree Isomorphism
Chih-Hsuan Kuo
 
[ACM-ICPC] 1 - Basic
Chih-Hsuan Kuo
 

Recently uploaded (20)

PDF
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
PPTX
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
PDF
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
PPTX
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
PDF
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
PPTX
Coefficient of Variance in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PPTX
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
PPTX
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
PDF
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
PDF
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
PPTX
Tally_Basic_Operations_Presentation.pptx
AditiBansal54083
 
PDF
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
PDF
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
PPTX
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
PPTX
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
PDF
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
PPTX
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
PPTX
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
PPTX
Tally software_Introduction_Presentation
AditiBansal54083
 
Open Chain Q2 Steering Committee Meeting - 2025-06-25
Shane Coughlan
 
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
SAP Firmaya İade ABAB Kodları - ABAB ile yazılmıl hazır kod örneği
Salih Küçük
 
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
MiniTool Partition Wizard Free Crack + Full Free Download 2025
bashirkhan333g
 
Coefficient of Variance in IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
Foundations of Marketo Engage - Powering Campaigns with Marketo Personalization
bbedford2
 
Help for Correlations in IBM SPSS Statistics.pptx
Version 1 Analytics
 
Automate Cybersecurity Tasks with Python
VICTOR MAESTRE RAMIREZ
 
Top Agile Project Management Tools for Teams in 2025
Orangescrum
 
Tally_Basic_Operations_Presentation.pptx
AditiBansal54083
 
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
vMix Pro 28.0.0.42 Download vMix Registration key Bundle
kulindacore
 
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
Homogeneity of Variance Test Options IBM SPSS Statistics Version 31.pptx
Version 1 Analytics
 
유니티에서 Burst Compiler+ThreadedJobs+SIMD 적용사례
Seongdae Kim
 
In From the Cold: Open Source as Part of Mainstream Software Asset Management
Shane Coughlan
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
Empowering Asian Contributions: The Rise of Regional User Groups in Open Sour...
Shane Coughlan
 
Tally software_Introduction_Presentation
AditiBansal54083
 

Protocol handler in Gecko

  • 1. PROTOCOL HANDLER in Gecko Tommy Kuo [:KuoE0] [email protected] 2015.03.03 @Mozilla Taiwan
  • 2. Outline • What Protocol Handlers Can Do • The Walkthrough from Awesome Bar to Protocol Handlers • The Brief Introduction to Channels
  • 4. URI Syntax <scheme name> : <hierarchical part> [ ? <query> ] [ # <fragment> ] http : //google.com/search ? q=Mozilla https : //www.facebook.com/pages/郝神好神/871866229523862 file : ///Downloads/郝神好帥.jpg about : config mailto : [email protected] chrome : //browser/skin/Info.png line : //shop/detail/xxx
  • 5. Protocol Handler Format the URI Create the channel Get flags NewChannel2(…) NewProxiedChannel2(…) NewURI(…) GetProtocolFlags(…)
  • 6. nsresult nsIOService::NewURI(const nsACString &aSpec, const char *aCharset, nsIURI *aBaseURI, nsIURI **result) { NS_ASSERTION(NS_IsMainThread(), "wrong thread"); static uint32_t recursionCount = 0; if (recursionCount >= MAX_RECURSION_COUNT) return NS_ERROR_MALFORMED_URI; AutoIncrement inc(&recursionCount); nsAutoCString scheme; nsresult rv = ExtractScheme(aSpec, scheme); if (NS_FAILED(rv)) { // then aSpec is relative if (!aBaseURI) return NS_ERROR_MALFORMED_URI; rv = aBaseURI->GetScheme(scheme); if (NS_FAILED(rv)) return rv; } // now get the handler for this scheme nsCOMPtr<nsIProtocolHandler> handler; rv = GetProtocolHandler(scheme.get(), getter_AddRefs(handler)); if (NS_FAILED(rv)) return rv; return handler->NewURI(aSpec, aCharset, aBaseURI, result); } nsIOService::NewURI (netwerk/base/nsIOService.cpp)
  • 7. nsCOMPtr<nsIProtocolHandler> handler; rv = GetProtocolHandler(scheme.get(), getter_AddRefs(handler)); if (NS_FAILED(rv)) return rv; uint32_t protoFlags; rv = handler->GetProtocolFlags(&protoFlags); if (NS_FAILED(rv)) return rv; bool newChannel2Succeeded = true; nsCOMPtr<nsIProxiedProtocolHandler> pph = do_QueryInterface(handler); if (pph) { rv = pph->NewProxiedChannel2(aURI, nullptr, aProxyFlags, aProxyURI, aLoadInfo, result); // if calling NewProxiedChannel2() fails we try to fall back to // creating a new proxied channel by calling NewProxiedChannel(). if (NS_FAILED(rv)) { newChannel2Succeeded = false; rv = pph->NewProxiedChannel(aURI, nullptr, aProxyFlags, aProxyURI, result); } } else { rv = handler->NewChannel2(aURI, aLoadInfo, result); // if calling newChannel2() fails we try to fall back to // creating a new channel by calling NewChannel(). if (NS_FAILED(rv)) { newChannel2Succeeded = false; rv = handler->NewChannel(aURI, result); } } nsIOService::NewChannelFromURIWithProxyFlagsInternal (netwerk/base/nsIOService.cpp)
  • 8. nsCOMPtr<nsIProtocolHandler> handler; rv = GetProtocolHandler(scheme.get(), getter_AddRefs(handler)); if (NS_FAILED(rv)) return rv; uint32_t protoFlags; rv = handler->GetProtocolFlags(&protoFlags); if (NS_FAILED(rv)) return rv; bool newChannel2Succeeded = true; nsCOMPtr<nsIProxiedProtocolHandler> pph = do_QueryInterface(handler); if (pph) { rv = pph->NewProxiedChannel2(aURI, nullptr, aProxyFlags, aProxyURI, aLoadInfo, result); // if calling NewProxiedChannel2() fails we try to fall back to // creating a new proxied channel by calling NewProxiedChannel(). if (NS_FAILED(rv)) { newChannel2Succeeded = false; rv = pph->NewProxiedChannel(aURI, nullptr, aProxyFlags, aProxyURI, result); } } else { rv = handler->NewChannel2(aURI, aLoadInfo, result); // if calling newChannel2() fails we try to fall back to // creating a new channel by calling NewChannel(). if (NS_FAILED(rv)) { newChannel2Succeeded = false; rv = handler->NewChannel(aURI, result); } } nsIOService::NewChannelFromURIWithProxyFlagsInternal (netwerk/base/nsIOService.cpp)
  • 9. Create An Protocol Handler • Implementation • NewURI • NewChannel2 / NewChannel (not recommended) • GetProtocolFlags • Registration • See 謀智菜逼⼋八談 XPCOM 實務⼊入⾨門
  • 10. ./extensions/gnomevfs/nsGnomeVFSProtocolHandler.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MOZ_GNOMEVFS_SCHEME, &kNS_GNOMEVFSPROTOCOLHANDLER_CID }, ./extensions/gio/nsGIOProtocolHandler.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MOZ_GIO_SCHEME, &kNS_GIOPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "file", &kNS_FILEPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "http", &kNS_HTTPPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "https", &kNS_HTTPSPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ftp", &kNS_FTPPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "resource", &kNS_RESPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "about", &kNS_ABOUTPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-safe-about", &kNS_SAFEABOUTPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "app", &kNS_APPPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "data", &kNS_DATAPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-device", &kNS_DEVICEPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "view-source", &kNS_VIEWSOURCEHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "wyciwyg", &kNS_WYCIWYGPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "ws", &kNS_WEBSOCKETPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "wss", &kNS_WEBSOCKETSSLPROTOCOLHANDLER_CID }, ./netwerk/build/nsNetModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "rtsp", &kNS_RTSPPROTOCOLHANDLER_CID }, ./image/decoders/icon/nsIconModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-icon", &kNS_ICONPROTOCOL_CID }, ./xpcom/build/XPCOMInit.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "chrome", &kNS_CHROMEPROTOCOLHANDLER_CID }, ./toolkit/components/places/nsPlacesModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "moz-anno", &kNS_ANNOPROTOCOLHANDLER_CID }, ./widget/android/nsWidgetFactory.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "android", &kNS_ANDROIDPROTOCOLHANDLER_CID }, ./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX BLOBURI_SCHEME, &kNS_BLOBPROTOCOLHANDLER_CID }, ./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MEDIASTREAMURI_SCHEME, &kNS_MEDIASTREAMPROTOCOLHANDLER_CID }, ./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX MEDIASOURCEURI_SCHEME, &kNS_MEDIASOURCEPROTOCOLHANDLER_CID }, ./layout/build/nsLayoutModule.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX FONTTABLEURI_SCHEME, &kNS_FONTTABLEPROTOCOLHANDLER_CID }, ./modules/libjar/nsJARFactory.cpp: { NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX "jar", &kNS_JARPROTOCOLHANDLER_CID }, $ grep -ir -E "{ NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX [^,]+,[^}]+ }" .
  • 15. handleCommand openUILinkIn openLinkIn loadURIWithFlags (tabbrowser) loadURIWithFlags (browser) LoadURI(char16_t*, …) LoadURIWithBase LoadURI(nsIURI*, …) InternalLoad DoURILoad DoChannelLoad NS_NewURI NS_NewChannelInternal Browser UI (XUL) DocShell Necko GetProtocolHandler GetProtocolHandler nsIURI nsIChannel NewURI NewChannel2
  • 18. <textbox id="urlbar" flex="1" placeholder="&urlbar.placeholder2;" type="autocomplete" autocompletesearch="urlinline history" autocompletesearchparam="enable-actions" autocompletepopup="PopupAutoCompleteRichResult" completeselectedindex="true" tabscrolling="true" showcommentcolumn="true" showimagecolumn="true" enablehistory="true" maxrows="6" newlines="stripsurroundingwhitespace" ontextentered="this.handleCommand(param);" ontextreverted="return this.handleRevert();" pageproxystate="invalid" onfocus="document.getElementById('identity- box').style.MozUserFocus= 'normal'" onblur="setTimeout(() => { document.getElementById('identity-box').style.MozUserFocus = ''; }, 0);”> . . . . . . </textbox> browser/base/content/urlbarBindings.xml
  • 19. handleCommand 1.Canonize URI 2.Detect target in the current tab or a new tab 3.Call openUILinkIn browser/base/content/urlbarBindings.xml google mozilla https://www.google.com.tw/search?q=mozilla search engine tv http://tv.atmovies.com.tw/tv/attv.cfm?action=todaytime bookmark keyword google http://www.google.com hotkey (Ctrl/Cmd+Enter) google http://www.google.net hotkey (Shift+Enter)
  • 20. openUILinkIn 1. Set parameters • third-party fix-up permission • post data • referrer URI 2. Call openLinkIn browser/base/content/utilityOverlay.js
  • 21. openLinkIn 1. Set target to open URI • current tab • new tab • new window 2. Call loadURIWithFlags (tabbrowser) browser/base/content/utilityOverlay.js
  • 22. loadURIWithFlags (tabbrowser) 1. Call loadURIWithFlags of its member browser object browser/base/content/tabbrowser.xml
  • 23. loadURIWithFlags (browser) 1. Set “about:blank” for empty URI 2. Call loadURI • Call nsDocShell::LoadURI actually source/toolkit/content/widgets/browser.xml
  • 25. LoadURI(char16_t*, …) 1. Call LoadURIWithBase docshell/base/nsDocShell.cpp
  • 26. LoadURIWithBase 1. Check navigatable or not 2. Call NS_NewURI to create an instance of nsIURI 3. Fix up URI if allowed 4. Call LoadURI docshell/base/nsDocShell.cpp ttp → http ps → https le → file
  • 27. LoadURI(nsIURI*, …) 1. Check navigatable or not 2. Redirect if needed 3. Call LoadHistoryEntry to load from history if shEntry exists 4. Call InternalLoad docshell/base/nsDocShell.cpp session history
  • 28. InternalLoad 1. Get content policy 2. Decide to load or not according to the content policy 3. Do shortcut loading if only hash tags are different 4. Call DoURILoad docshell/base/nsDocShell.cpp
  • 29. DoURILoad 1. URI is not a source document • Call NS_NewChannelInternal to create channel 2. URI is a source document • Get “view-source” channel if protocol is “view-source” • Call NS_NewInputStreamChannelInternal to create channel for “text/html” 3. Setup some data for specific protocols 4. Call DoChannelLoad to load channel docshell/base/nsDocShell.cpp
  • 30. Necko
  • 31. NS_NewURI NS_NewChannelInternal (7 parameter) nsIOService::NewURI GetProtocolHandler NS_NewChannelInternal (11 parameter) NewChannelFromURI2 NewChannelFromURIWithProxyFlagsInternal GetProtocolHandler DoURILoadLoadURIWithBase Call Stack
  • 32. GetProtocolHandler 1.Return protocol handler if the protocol handler was cached 2.For internal protocol • Cache the protocol handler and return 3.For external protocol • Get default external protocol handler for external protocol netwerk/base/nsIOService.cpp Protocols are not provided in gecko.
  • 34. The Brief Introduction to Channels
  • 35. Channel (nsIChannel) AsyncOpen() (Non-blocking IO) Asynchronously open this channel. Data is fed to the specified stream listener as it becomes available. Open() (Blocking IO) Synchronously open the channel.
  • 36. Listener (nsIStreamListener) OnStartRequest() Called to signify the beginning of an asynchronous request. OnStopRequest() Called to signify the end of an asynchronous request. OnDataAvailable() Called when the next chunk of data may be read without blocking the calling thread.