fix: use OOPIF for webview tag (#13869)
* fix: use OOIF for webview tag * fix: do not call GetNativeView for webview * fix: OOIPF webview's WebContents is managed by embedder frame * fix: guest view can not be focused * fix: clear zoom controller when guest is destroyed * fix: implement the webview resize event The webview is no longer a browser plugin with the resize event, use ResizeObserver instead. * test: disable failed tests due to OOPIF webview * fix: embedder can be destroyed earlier than guest This happens when embedder is manually destroyed. * fix: don't double attach * fix: recreate iframe when webview is reattached * fix: resize event may happen very early * test: some tests are working after OOPIF webview * chore: remove unused browser plugin webview code * fix: get embedder via closure When the "destroyed" event is emitted, the entry in guestInstances would be cleared. * chore: rename browserPluginNode to internalElement * test: make the visibilityState test more robust * chore: guestinstance can not work with OOPIF webview * fix: element could be detached before got response from browser
This commit is contained in:
parent
48407c5b93
commit
dd5b8769be
28 changed files with 268 additions and 1008 deletions
|
@ -13,6 +13,7 @@
|
|||
#include "atom/renderer/api/atom_api_spell_check_client.h"
|
||||
#include "base/memory/memory_pressure_listener.h"
|
||||
#include "content/public/renderer/render_frame.h"
|
||||
#include "content/public/renderer/render_frame_observer.h"
|
||||
#include "content/public/renderer/render_frame_visitor.h"
|
||||
#include "content/public/renderer/render_view.h"
|
||||
#include "native_mate/dictionary.h"
|
||||
|
@ -62,6 +63,29 @@ namespace api {
|
|||
|
||||
namespace {
|
||||
|
||||
content::RenderFrame* GetRenderFrame(v8::Local<v8::Value> value) {
|
||||
v8::Local<v8::Context> context =
|
||||
v8::Local<v8::Object>::Cast(value)->CreationContext();
|
||||
if (context.IsEmpty())
|
||||
return nullptr;
|
||||
blink::WebLocalFrame* frame = blink::WebLocalFrame::FrameForContext(context);
|
||||
if (!frame)
|
||||
return nullptr;
|
||||
return content::RenderFrame::FromWebFrame(frame);
|
||||
}
|
||||
|
||||
class RenderFrameStatus : public content::RenderFrameObserver {
|
||||
public:
|
||||
explicit RenderFrameStatus(content::RenderFrame* render_frame)
|
||||
: content::RenderFrameObserver(render_frame) {}
|
||||
~RenderFrameStatus() final {}
|
||||
|
||||
bool is_ok() { return render_frame() != nullptr; }
|
||||
|
||||
// RenderFrameObserver implementation.
|
||||
void OnDestruct() final {}
|
||||
};
|
||||
|
||||
class ScriptExecutionCallback : public blink::WebScriptExecutionCallback {
|
||||
public:
|
||||
using CompletionCallback =
|
||||
|
@ -170,20 +194,23 @@ v8::Local<v8::Value> WebFrame::RegisterEmbedderCustomElement(
|
|||
blink::WebString::FromUTF16(name), options);
|
||||
}
|
||||
|
||||
void WebFrame::RegisterElementResizeCallback(
|
||||
int element_instance_id,
|
||||
const GuestViewContainer::ResizeCallback& callback) {
|
||||
auto* guest_view_container = GuestViewContainer::FromID(element_instance_id);
|
||||
if (guest_view_container)
|
||||
guest_view_container->RegisterElementResizeCallback(callback);
|
||||
}
|
||||
int WebFrame::GetWebFrameId(v8::Local<v8::Value> content_window) {
|
||||
// Get the WebLocalFrame before (possibly) executing any user-space JS while
|
||||
// getting the |params|. We track the status of the RenderFrame via an
|
||||
// observer in case it is deleted during user code execution.
|
||||
content::RenderFrame* render_frame = GetRenderFrame(content_window);
|
||||
RenderFrameStatus render_frame_status(render_frame);
|
||||
|
||||
void WebFrame::AttachGuest(int id) {
|
||||
content::RenderFrame::FromWebFrame(web_frame_)->AttachGuest(id);
|
||||
}
|
||||
if (!render_frame_status.is_ok())
|
||||
return -1;
|
||||
|
||||
void WebFrame::DetachGuest(int id) {
|
||||
content::RenderFrame::FromWebFrame(web_frame_)->DetachGuest(id);
|
||||
blink::WebLocalFrame* frame = render_frame->GetWebFrame();
|
||||
// Parent must exist.
|
||||
blink::WebFrame* parent_frame = frame->Parent();
|
||||
DCHECK(parent_frame);
|
||||
DCHECK(parent_frame->IsWebLocalFrame());
|
||||
|
||||
return render_frame->GetRoutingID();
|
||||
}
|
||||
|
||||
void WebFrame::SetSpellCheckProvider(mate::Arguments* args,
|
||||
|
@ -464,10 +491,7 @@ void WebFrame::BuildPrototype(v8::Isolate* isolate,
|
|||
&WebFrame::SetLayoutZoomLevelLimits)
|
||||
.SetMethod("registerEmbedderCustomElement",
|
||||
&WebFrame::RegisterEmbedderCustomElement)
|
||||
.SetMethod("registerElementResizeCallback",
|
||||
&WebFrame::RegisterElementResizeCallback)
|
||||
.SetMethod("attachGuest", &WebFrame::AttachGuest)
|
||||
.SetMethod("detachGuest", &WebFrame::DetachGuest)
|
||||
.SetMethod("getWebFrameId", &WebFrame::GetWebFrameId)
|
||||
.SetMethod("setSpellCheckProvider", &WebFrame::SetSpellCheckProvider)
|
||||
.SetMethod("registerURLSchemeAsBypassingCSP",
|
||||
&WebFrame::RegisterURLSchemeAsBypassingCSP)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue