| Index: third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
|
| diff --git a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
|
| index 35ef84830b192da31368f7014bb89f2e2e6b94b8..00ac36ad37f368b93490a4b64a7c3e7ed0c45f12 100644
|
| --- a/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
|
| +++ b/third_party/WebKit/Source/web/WebLocalFrameImpl.cpp
|
| @@ -1558,26 +1558,23 @@ WebLocalFrameImpl* WebLocalFrameImpl::CreateProvisional(
|
| // When a core Frame is created with no owner, it attempts to set itself as
|
| // the main frame of the Page. However, this is a provisional frame, and may
|
| // disappear, so Page::m_mainFrame can't be updated just yet.
|
| - FrameOwner* temp_owner = DummyFrameOwner::Create();
|
| - // TODO(dcheng): This block is very similar to initializeCoreFrame. Try to
|
| - // reuse it here.
|
| - LocalFrame* frame = LocalFrame::Create(
|
| - web_frame->local_frame_client_impl_.Get(), *old_frame->GetPage(),
|
| - temp_owner, interface_provider, interface_registry);
|
| - frame->Tree().SetName(
|
| - ToWebRemoteFrameImpl(old_web_frame)->GetFrame()->Tree().GetName());
|
| - web_frame->SetCoreFrame(frame);
|
| -
|
| - frame->SetOwner(old_frame->Owner());
|
| -
|
| - if (frame->Owner() && frame->Owner()->IsRemote())
|
| - ToRemoteFrameOwner(frame->Owner())
|
| + // Note 2: Becuase the dummy owner is still the owner when the initial empty
|
| + // document is created, the initial empty document will not inherit the
|
| + // correct sandbox flags. However, since the provisional frame is inivisible
|
| + // to the rest of the page, the initial document is also invisible and
|
| + // unscriptable. Once the provisional frame gets properly attached and is
|
| + // observable, it will have the real FrameOwner, and any subsequent real
|
| + // documents will correctly inherit sandbox flags from the owner.
|
| + web_frame->InitializeCoreFrame(*old_frame->GetPage(),
|
| + DummyFrameOwner::Create(),
|
| + old_frame->Tree().GetName());
|
| +
|
| + LocalFrame* new_frame = web_frame->GetFrame();
|
| + new_frame->SetOwner(old_frame->Owner());
|
| + if (new_frame->Owner() && new_frame->Owner()->IsRemote()) {
|
| + ToRemoteFrameOwner(new_frame->Owner())
|
| ->SetSandboxFlags(static_cast<SandboxFlags>(flags));
|
| -
|
| - // We must call init() after m_frame is assigned because it is referenced
|
| - // during init(). Note that this may dispatch JS events; the frame may be
|
| - // detached after init() returns.
|
| - frame->Init();
|
| + }
|
| return web_frame;
|
| }
|
|
|
| @@ -1642,27 +1639,22 @@ void WebLocalFrameImpl::InitializeCoreFrame(Page& page,
|
| const AtomicString& name) {
|
| SetCoreFrame(LocalFrame::Create(local_frame_client_impl_.Get(), page, owner,
|
| interface_provider_, interface_registry_));
|
| - GetFrame()->Tree().SetName(name);
|
| - // We must call init() after m_frame is assigned because it is referenced
|
| - // during init(). Note that this may dispatch JS events; the frame may be
|
| - // detached after init() returns.
|
| - GetFrame()->Init();
|
| - if (GetFrame()) {
|
| - if (GetFrame()
|
| - ->Loader()
|
| - .StateMachine()
|
| - ->IsDisplayingInitialEmptyDocument() &&
|
| - !Parent() && !Opener() &&
|
| - GetFrame()->GetSettings()->GetShouldReuseGlobalForUnownedMainFrame()) {
|
| - GetFrame()->GetDocument()->GetSecurityOrigin()->GrantUniversalAccess();
|
| - }
|
| + frame_->Tree().SetName(name);
|
| + // We must call init() after frame_ is assigned because it is referenced
|
| + // during init().
|
| + frame_->Init();
|
| + CHECK(frame_);
|
| + CHECK(frame_->Loader().StateMachine()->IsDisplayingInitialEmptyDocument());
|
| + if (!Parent() && !Opener() &&
|
| + frame_->GetSettings()->GetShouldReuseGlobalForUnownedMainFrame()) {
|
| + frame_->GetDocument()->GetSecurityOrigin()->GrantUniversalAccess();
|
| + }
|
|
|
| - if (!owner) {
|
| - // This trace event is needed to detect the main frame of the
|
| - // renderer in telemetry metrics. See crbug.com/692112#c11.
|
| - TRACE_EVENT_INSTANT1("loading", "markAsMainFrame",
|
| - TRACE_EVENT_SCOPE_THREAD, "frame", GetFrame());
|
| - }
|
| + if (!owner) {
|
| + // This trace event is needed to detect the main frame of the
|
| + // renderer in telemetry metrics. See crbug.com/692112#c11.
|
| + TRACE_EVENT_INSTANT1("loading", "markAsMainFrame", TRACE_EVENT_SCOPE_THREAD,
|
| + "frame", frame_);
|
| }
|
| }
|
|
|
| @@ -1698,10 +1690,7 @@ LocalFrame* WebLocalFrameImpl::CreateChildFrame(
|
|
|
| webframe_child->InitializeCoreFrame(*GetFrame()->GetPage(), owner_element,
|
| name);
|
| - // Initializing the core frame may cause the new child to be detached, since
|
| - // it may dispatch a load event in the parent.
|
| - if (!webframe_child->Parent())
|
| - return nullptr;
|
| + DCHECK(webframe_child->Parent());
|
|
|
| FrameLoadRequest new_request = request;
|
| FrameLoadType child_load_type = kFrameLoadTypeStandard;
|
|
|