forked from mozilla-mobile/android-components
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Closes mozilla-mobile#2243: Add engine API for WebExtension messaging
- Loading branch information
Showing
19 changed files
with
672 additions
and
99 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
30 changes: 30 additions & 0 deletions
30
...a/src/main/java/mozilla/components/browser/engine/gecko/webextension/GeckoWebExtension.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
package mozilla.components.browser.engine.gecko.webextension | ||
|
||
import mozilla.components.concept.engine.EngineSession | ||
import mozilla.components.concept.engine.webextension.MessageHandler | ||
import mozilla.components.concept.engine.webextension.WebExtension | ||
import org.mozilla.geckoview.WebExtension as GeckoNativeWebExtension | ||
|
||
/** | ||
* Gecko-based implementation of [WebExtension], wrapping the native web | ||
* extension object provided by GeckoView. | ||
*/ | ||
class GeckoWebExtension( | ||
id: String, | ||
url: String, | ||
val nativeExtension: GeckoNativeWebExtension = GeckoNativeWebExtension(url, id) | ||
) : WebExtension(id, url) { | ||
|
||
// Not supported in beta | ||
override fun registerContentMessageHandler( | ||
session: EngineSession, | ||
name: String, | ||
messageHandler: MessageHandler | ||
) = Unit | ||
|
||
// Not supported in beta | ||
override fun registerBackgroundMessageHandler(name: String, messageHandler: MessageHandler) = Unit | ||
|
||
// Not supported in beta | ||
override fun hasContentMessageHandler(session: EngineSession, name: String): Boolean = false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
...c/test/java/mozilla/components/browser/engine/gecko/webextension/GeckoWebExtensionTest.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
/* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | ||
|
||
package mozilla.components.browser.engine.gecko.prompt | ||
|
||
import mozilla.components.browser.engine.gecko.webextension.GeckoWebExtension | ||
import mozilla.components.concept.engine.EngineSession | ||
import mozilla.components.concept.engine.webextension.MessageHandler | ||
import mozilla.components.support.test.mock | ||
import org.junit.Assert.assertFalse | ||
import org.junit.Test | ||
import org.junit.runner.RunWith | ||
import org.robolectric.RobolectricTestRunner | ||
|
||
@RunWith(RobolectricTestRunner::class) | ||
class GeckoWebExtensionTest { | ||
|
||
// There is not much to test here in beta. All functionality is in nightly only. | ||
@Test | ||
fun `create gecko web extension`() { | ||
val session: EngineSession = mock() | ||
val contentMessageHandler: MessageHandler = mock() | ||
val backgroundMessageHandler: MessageHandler = mock() | ||
val appName = "mozac-test" | ||
|
||
val ext = GeckoWebExtension(appName, "url") | ||
|
||
ext.registerBackgroundMessageHandler(appName, backgroundMessageHandler) | ||
ext.registerContentMessageHandler(session, appName, contentMessageHandler) | ||
assertFalse(ext.hasContentMessageHandler(session, appName)) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
104 changes: 104 additions & 0 deletions
104
...y/src/main/java/mozilla/components/browser/engine/gecko/webextension/GeckoWebExtension.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
package mozilla.components.browser.engine.gecko.webextension | ||
|
||
import mozilla.components.browser.engine.gecko.GeckoEngineSession | ||
import mozilla.components.concept.engine.EngineSession | ||
import mozilla.components.concept.engine.webextension.MessageHandler | ||
import mozilla.components.concept.engine.webextension.Port | ||
import mozilla.components.concept.engine.webextension.WebExtension | ||
import org.json.JSONObject | ||
import org.mozilla.geckoview.GeckoResult | ||
import org.mozilla.geckoview.WebExtension as GeckoNativeWebExtension | ||
|
||
/** | ||
* Gecko-based implementation of [WebExtension], wrapping the native web | ||
* extension object provided by GeckoView. | ||
*/ | ||
class GeckoWebExtension( | ||
id: String, | ||
url: String, | ||
allowContentMessaging: Boolean = true, | ||
val nativeExtension: GeckoNativeWebExtension = GeckoNativeWebExtension(url, id, allowContentMessaging) | ||
) : WebExtension(id, url) { | ||
|
||
/** | ||
* See [WebExtension.registerBackgroundMessageHandler]. | ||
*/ | ||
override fun registerBackgroundMessageHandler(name: String, messageHandler: MessageHandler) { | ||
val portDelegate = object : GeckoNativeWebExtension.PortDelegate { | ||
|
||
override fun onPortMessage(message: Any, port: GeckoNativeWebExtension.Port) { | ||
messageHandler.onPortMessage(message, GeckoPort(port)) | ||
} | ||
|
||
override fun onDisconnect(port: GeckoNativeWebExtension.Port) { | ||
messageHandler.onPortDisconnected(GeckoPort(port)) | ||
} | ||
} | ||
|
||
val messageDelegate = object : GeckoNativeWebExtension.MessageDelegate { | ||
|
||
override fun onConnect(port: GeckoNativeWebExtension.Port) { | ||
port.setDelegate(portDelegate) | ||
messageHandler.onPortConnected(GeckoPort(port)) | ||
} | ||
|
||
override fun onMessage(message: Any, sender: GeckoNativeWebExtension.MessageSender): GeckoResult<Any>? { | ||
return GeckoResult.fromValue(messageHandler.onMessage(message, null)) | ||
} | ||
} | ||
|
||
nativeExtension.setMessageDelegate(messageDelegate, name) | ||
} | ||
|
||
/** | ||
* See [WebExtension.registerContentMessageHandler]. | ||
*/ | ||
override fun registerContentMessageHandler(session: EngineSession, name: String, messageHandler: MessageHandler) { | ||
val portDelegate = object : GeckoNativeWebExtension.PortDelegate { | ||
|
||
override fun onPortMessage(message: Any, port: GeckoNativeWebExtension.Port) { | ||
messageHandler.onPortMessage(message, GeckoPort(port, session)) | ||
} | ||
|
||
override fun onDisconnect(port: GeckoNativeWebExtension.Port) { | ||
messageHandler.onPortDisconnected(GeckoPort(port, session)) | ||
} | ||
} | ||
|
||
val messageDelegate = object : GeckoNativeWebExtension.MessageDelegate { | ||
|
||
override fun onConnect(port: GeckoNativeWebExtension.Port) { | ||
port.setDelegate(portDelegate) | ||
messageHandler.onPortConnected(GeckoPort(port, session)) | ||
} | ||
|
||
override fun onMessage(message: Any, sender: GeckoNativeWebExtension.MessageSender): GeckoResult<Any>? { | ||
return GeckoResult.fromValue(messageHandler.onMessage(message, session)) | ||
} | ||
} | ||
|
||
val geckoSession = (session as GeckoEngineSession).geckoSession | ||
geckoSession.setMessageDelegate(messageDelegate, name) | ||
} | ||
|
||
/** | ||
* See [WebExtension.hasContentMessageHandler]. | ||
*/ | ||
override fun hasContentMessageHandler(session: EngineSession, name: String): Boolean { | ||
val geckoSession = (session as GeckoEngineSession).geckoSession | ||
return geckoSession.getMessageDelegate(name) != null | ||
} | ||
} | ||
|
||
/** | ||
* Gecko-based implementation of [Port], wrapping the native port provided by GeckoView. | ||
*/ | ||
class GeckoPort( | ||
internal val nativePort: GeckoNativeWebExtension.Port, | ||
engineSession: EngineSession? = null | ||
) : Port(engineSession) { | ||
|
||
override fun postMessage(message: Any) { | ||
nativePort.postMessage(message as JSONObject) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.