10529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 50529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/renderer/render_view_observer_natives.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_view.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/renderer/render_view_observer.h" 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "extensions/common/extension_api.h" 10a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "extensions/renderer/script_context.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebFrame.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace extensions { 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace { 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Deletes itself when done. 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass LoadWatcher : public content::RenderViewObserver { 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 21a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch LoadWatcher(ScriptContext* context, 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::RenderView* view, 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch v8::Handle<v8::Function> cb) 24a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : content::RenderViewObserver(view), context_(context), callback_(cb) {} 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void DidCreateDocumentElement(blink::WebLocalFrame* frame) OVERRIDE { 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CallbackAndDie(true); 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual void DidFailProvisionalLoad(blink::WebLocalFrame* frame, 310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const blink::WebURLError& error) 320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch OVERRIDE { 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CallbackAndDie(false); 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void CallbackAndDie(bool succeeded) { 38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v8::Isolate* isolate = context_->isolate(); 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) v8::HandleScope handle_scope(isolate); 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v8::Handle<v8::Value> args[] = {v8::Boolean::New(isolate, succeeded)}; 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) context_->CallFunction(callback_.NewHandle(isolate), 1, args); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delete this; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ScriptContext* context_; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ScopedPersistent<v8::Function> callback_; 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(LoadWatcher); 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 510529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochRenderViewObserverNatives::RenderViewObserverNatives(ScriptContext* context) 520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch : ObjectBackedNativeHandler(context) { 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch RouteFunction("OnDocumentElementCreated", 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Bind(&RenderViewObserverNatives::OnDocumentElementCreated, 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Unretained(this))); 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid RenderViewObserverNatives::OnDocumentElementCreated( 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const v8::FunctionCallbackInfo<v8::Value>& args) { 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(args.Length() == 2); 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(args[0]->IsInt32()); 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CHECK(args[1]->IsFunction()); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int view_id = args[0]->Int32Value(); 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch content::RenderView* view = content::RenderView::FromRoutingID(view_id); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!view) { 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LOG(WARNING) << "No render view found to register LoadWatcher."; 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch new LoadWatcher(context(), view, args[1].As<v8::Function>()); 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch args.GetReturnValue().Set(true); 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace extensions 78