File: ScriptCacheActors.cpp

package info (click to toggle)
firefox 147.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,320 kB
  • sloc: cpp: 7,607,359; javascript: 6,533,295; ansic: 3,775,223; python: 1,415,500; xml: 634,561; asm: 438,949; java: 186,241; sh: 62,752; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (98 lines) | stat: -rw-r--r-- 2,956 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */

#include "mozilla/ScriptPreloader.h"
#include "ScriptPreloader-inl.h"
#include "mozilla/loader/ScriptCacheActors.h"

#include "mozilla/dom/ContentParent.h"

namespace mozilla {
namespace loader {

void ScriptCacheChild::Init(const Maybe<FileDescriptor>& cacheFile,
                            bool wantCacheData) {
  AssertIsOnMainThread();
  mWantCacheData = wantCacheData;

  auto& cache = ScriptPreloader::GetChildSingleton();
  (void)cache.InitCache(cacheFile, this);

  if (!wantCacheData) {
    // If the parent process isn't expecting any cache data from us, we're
    // done.
    Send__delete__(this, AutoTArray<ScriptData, 0>());
  }
}

// Finalize the script cache for the content process, and send back data about
// any scripts executed up to this point.
void ScriptCacheChild::SendScriptsAndFinalize(
    ScriptPreloader::ScriptHash& scripts) {
  MOZ_ASSERT(mWantCacheData);

  auto matcher = ScriptPreloader::Match<ScriptPreloader::ScriptStatus::Saved>();

  JS::FrontendContext* fc = JS::NewFrontendContext();
  if (!fc) {
    return;
  }

  nsTArray<ScriptData> dataArray;
  for (auto& script : IterHash(scripts, matcher)) {
    if (!script->mSize && !script->XDREncode(fc)) {
      continue;
    }

    auto data = dataArray.AppendElement();

    data->url() = script->mURL;
    data->cachePath() = script->mCachePath;
    data->loadTime() = script->mLoadTime;

    if (script->HasBuffer()) {
      auto& xdrData = script->Buffer();
      data->xdrData().AppendElements(xdrData.begin(), xdrData.length());
      script->FreeData();
    }
  }

  JS::DestroyFrontendContext(fc);

  Send__delete__(this, dataArray);
}

void ScriptCacheChild::ActorDestroy(ActorDestroyReason aWhy) {
  auto& cache = ScriptPreloader::GetChildSingleton();
  cache.mChildActor = nullptr;
}

IPCResult ScriptCacheParent::Recv__delete__(nsTArray<ScriptData>&& scripts) {
  if (!mWantCacheData && scripts.Length()) {
    return IPC_FAIL(this, "UnexpectedScriptData");
  }

  // We don't want any more data from the process at this point.
  mWantCacheData = false;

  // Merge the child's script data with the parent's.
  auto parent = static_cast<dom::ContentParent*>(Manager());
  auto processType =
      ScriptPreloader::GetChildProcessType(parent->GetRemoteType());

  auto& cache = ScriptPreloader::GetChildSingleton();
  for (auto& script : scripts) {
    cache.NoteStencil(script.url(), script.cachePath(), processType,
                      std::move(script.xdrData()), script.loadTime());
  }

  return IPC_OK();
}

void ScriptCacheParent::ActorDestroy(ActorDestroyReason aWhy) {}

}  // namespace loader
}  // namespace mozilla