diff --git a/examples/build.sbt b/examples/build.sbt index fc34c68..3883432 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 2701ec2..13e8c11 100644 --- a/examples/extension/src/main/scala/Main.scala +++ b/examples/extension/src/main/scala/Main.scala @@ -1,3 +1,4 @@ +import scala.scalajs.js import scala.scalajs.js.JSApp object Main extends JSApp { diff --git a/sbt-plugin/src/main/scala/net/lullabyte/JsonCodecs.scala b/sbt-plugin/src/main/scala/net/lullabyte/JsonCodecs.scala index d73c0ab..830aa4f 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)) @@ -187,6 +207,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 18d86a0..ad9b367 100644 --- a/shared/src/main/scala/chrome/Manifest.scala +++ b/shared/src/main/scala/chrome/Manifest.scala @@ -28,6 +28,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, @@ -98,6 +116,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