From d0f108c8898c2307ae00d1aa876b10529feb2ca1 Mon Sep 17 00:00:00 2001 From: Landon Fuller Date: Sat, 29 Apr 2017 16:48:00 -0600 Subject: [PATCH] Add content_script manifest support. --- examples/build.sbt | 6 ++++++ examples/extension/src/main/scala/Main.scala | 9 ++++++-- .../main/scala/net/lullabyte/JsonCodecs.scala | 21 +++++++++++++++++++ shared/src/main/scala/chrome/Manifest.scala | 19 +++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/examples/build.sbt b/examples/build.sbt index 414b9a0..2d1a856 100644 --- a/examples/build.sbt +++ b/examples/build.sbt @@ -75,6 +75,12 @@ lazy val extension = project.in(file("extension")) val background = Background( scripts = Chrome.defaultScripts ) + override val contentScripts = List( + ContentScript( + matches = Set("https://www.example.org/*"), + js = Chrome.defaultScripts + ) + ) val name = Keys.name.value val version = Keys.version.value override val icons = Chrome.icons( diff --git a/examples/extension/src/main/scala/Main.scala b/examples/extension/src/main/scala/Main.scala index d1ca982..c0a5034 100644 --- a/examples/extension/src/main/scala/Main.scala +++ b/examples/extension/src/main/scala/Main.scala @@ -1,11 +1,16 @@ +import scala.scalajs.js import scala.scalajs.js.JSApp object Main extends JSApp { def main(): Unit = { - chrome.tabs.Tabs.onCreated.listen { tab => - println(s"Tab created: ${tab.url}") + if (!js.isUndefined(js.Dynamic.global.chrome.tabs)) { + /* Running as background script */ + chrome.tabs.Tabs.onCreated.listen { tab => + println(s"Tab created: ${tab.url}") + } } + println("Hello World!") } diff --git a/sbt-plugin/src/main/scala/net/lullabyte/JsonCodecs.scala b/sbt-plugin/src/main/scala/net/lullabyte/JsonCodecs.scala index 988dcea..e6fe843 100644 --- a/sbt-plugin/src/main/scala/net/lullabyte/JsonCodecs.scala +++ b/sbt-plugin/src/main/scala/net/lullabyte/JsonCodecs.scala @@ -39,6 +39,26 @@ object JsonCodecs { ) } + implicit val runAtEncoder = Encoder.instance[chrome.RunAt] { + case RunAt.DocumentStart => Json.fromString("document_start") + case RunAt.DocumentEnd => Json.fromString("document_end") + case RunAt.DocumentIdle => Json.fromString("document_idle") + } + + implicit val contentScriptEncoder = Encoder.instance[chrome.ContentScript] { cs => + Json.obj( + ("matches", Json.fromValues(cs.matches.map(Json.fromString))), + ("exclude_matches", omitIfEmpty(cs.excludeMatches)(Json.fromString)), + ("match_about_blank", cs.matchAboutBlank.asJson), + ("css", omitIfEmpty(cs.css)(Json.fromString)), + ("js", omitIfEmpty(cs.js)(Json.fromString)), + ("run_at", cs.runAt.asJson), + ("all_frames", cs.allFrames.asJson), + ("include_globs", omitIfEmpty(cs.includeGlobs)(Json.fromString)), + ("exclude_globs", omitIfEmpty(cs.css)(Json.fromString)) + ) + } + implicit val omniboxEncoder = Encoder.instance[chrome.Omnibox] { omnibox => Json.obj( ("keyword", Json.fromString(omnibox.keyword)) @@ -177,6 +197,7 @@ object JsonCodecs { val commonValues = manifest2json(manifest) val extValues = Seq( ("background", manifest.background.asJson), + ("content_scripts", omitIfEmpty(manifest.contentScripts)(_.asJson)), ("omnibox", manifest.omnibox.asJson), ("options_ui", manifest.optionsUI.asJson), ("browser_action", manifest.browserAction.asJson), diff --git a/shared/src/main/scala/chrome/Manifest.scala b/shared/src/main/scala/chrome/Manifest.scala index fea9b06..3cee89e 100644 --- a/shared/src/main/scala/chrome/Manifest.scala +++ b/shared/src/main/scala/chrome/Manifest.scala @@ -26,6 +26,24 @@ sealed trait Manifest { case class Background(scripts: List[String]) case class App(background: Background) +case class ContentScript( + matches: Set[String], + excludeMatches: Set[String] = Set.empty, + matchAboutBlank: Option[Boolean] = None, + css: List[String] = List.empty, + js: List[String] = List.empty, + runAt: Option[RunAt] = None, + allFrames: Option[Boolean] = None, + includeGlobs: Set[String] = Set.empty, + excludeGlobs: Set[String] = Set.empty +) + +sealed trait RunAt +object RunAt { + case object DocumentStart extends RunAt + case object DocumentEnd extends RunAt + case object DocumentIdle extends RunAt +} case class BrowserAction( icon: Map[Int, String] = Map.empty, @@ -94,6 +112,7 @@ trait AppManifest extends chrome.Manifest { trait ExtensionManifest extends chrome.Manifest { val background: Background + val contentScripts: List[ContentScript] = List.empty val browserAction: Option[BrowserAction] = None val omnibox: Option[Omnibox] = None val optionsUI: Option[OptionsUI] = None