on_load_script_injector.cc 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright 2018 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/on_load_script_injector/renderer/on_load_script_injector.h"
  5. #include <utility>
  6. #include <vector>
  7. #include "base/bind.h"
  8. #include "base/strings/utf_string_conversions.h"
  9. #include "content/public/renderer/render_frame.h"
  10. #include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
  11. namespace on_load_script_injector {
  12. OnLoadScriptInjector::OnLoadScriptInjector(content::RenderFrame* frame)
  13. : RenderFrameObserver(frame), weak_ptr_factory_(this) {
  14. render_frame()
  15. ->GetAssociatedInterfaceRegistry()
  16. ->AddInterface<mojom::OnLoadScriptInjector>(
  17. base::BindRepeating(&OnLoadScriptInjector::BindToReceiver,
  18. weak_ptr_factory_.GetWeakPtr()));
  19. }
  20. OnLoadScriptInjector::~OnLoadScriptInjector() {}
  21. void OnLoadScriptInjector::BindToReceiver(
  22. mojo::PendingAssociatedReceiver<mojom::OnLoadScriptInjector> receiver) {
  23. receivers_.Add(this, std::move(receiver));
  24. }
  25. void OnLoadScriptInjector::DidCommitProvisionalLoad(
  26. ui::PageTransition transition) {
  27. // Don't inject anything for subframes.
  28. if (!render_frame()->IsMainFrame())
  29. return;
  30. for (base::ReadOnlySharedMemoryRegion& script : on_load_scripts_) {
  31. // Crude check to see this is UTF-16.
  32. DCHECK_EQ(script.GetSize() % sizeof(char16_t), 0u);
  33. auto mapping = script.Map();
  34. std::u16string script_converted(mapping.GetMemoryAs<char16_t>(),
  35. script.GetSize() / sizeof(char16_t));
  36. render_frame()->ExecuteJavaScript(script_converted);
  37. }
  38. }
  39. void OnLoadScriptInjector::AddOnLoadScript(
  40. base::ReadOnlySharedMemoryRegion script) {
  41. on_load_scripts_.push_back(std::move(script));
  42. }
  43. void OnLoadScriptInjector::ClearOnLoadScripts() {
  44. on_load_scripts_.clear();
  45. }
  46. void OnLoadScriptInjector::OnDestruct() {
  47. delete this;
  48. }
  49. } // namespace on_load_script_injector