Skip to content

Commit 9b37f26

Browse files
committed
support 'document-end' callback
1 parent f27c73c commit 9b37f26

File tree

2 files changed

+61
-7
lines changed

2 files changed

+61
-7
lines changed

src/api/dispatcher.cc

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@
3232
#include "third_party/WebKit/public/web/WebView.h"
3333
#include "v8/include/v8.h"
3434

35+
#undef LOG
36+
#undef ASSERT
37+
#include "third_party/WebKit/Source/config.h"
38+
#include "third_party/WebKit/Source/core/frame/Frame.h"
39+
#include "third_party/WebKit/Source/web/WebFrameImpl.h"
40+
#include "V8HTMLElement.h"
41+
3542
namespace nwapi {
3643

3744
Dispatcher::Dispatcher(content::RenderView* render_view)
@@ -90,26 +97,68 @@ void Dispatcher::OnEvent(int object_id,
9097
node::MakeCallback(objects_registry, "handleEvent", 3, argv);
9198
}
9299

100+
v8::Handle<v8::Object> Dispatcher::GetObjectRegistry() {
101+
v8::Handle<v8::Value> registry =
102+
node::g_context->Global()->Get(v8::String::New("__nwObjectsRegistry"));
103+
// if (registry->IsNull() || registry->IsUndefined())
104+
// return v8::Undefined();
105+
return registry->ToObject();
106+
}
107+
108+
v8::Handle<v8::Value> Dispatcher::GetWindowId(WebKit::WebFrame* frame) {
109+
v8::Handle<v8::Value> v8win = frame->mainWorldScriptContext()->Global();
110+
v8::Handle<v8::Value> val = v8win->ToObject()->Get(v8::String::New("__nwWindowId"));
111+
112+
return val;
113+
}
114+
93115
void Dispatcher::ZoomLevelChanged() {
94116
WebKit::WebView* web_view = render_view()->GetWebView();
95117
float zoom_level = web_view->zoomLevel();
96-
v8::Handle<v8::Value> v8win = web_view->mainFrame()->
97-
mainWorldScriptContext()->Global();
98-
v8::Handle<v8::Value> val = v8win->ToObject()->Get(v8::String::New("__nwWindowId"));
118+
119+
v8::Handle<v8::Value> val = GetWindowId(web_view->mainFrame());
99120

100121
if (val->IsNull() || val->IsUndefined())
101122
return;
102123

103-
v8::Handle<v8::Value> registry =
104-
node::g_context->Global()->Get(v8::String::New("__nwObjectsRegistry"));
105-
if (registry->IsNull() || registry->IsUndefined())
124+
v8::Handle<v8::Object> objects_registry = GetObjectRegistry();
125+
if (objects_registry->IsUndefined())
106126
return;
107-
v8::Handle<v8::Object> objects_registry = registry->ToObject();
108127

109128
v8::Local<v8::Array> args = v8::Array::New();
110129
args->Set(0, v8::Number::New(zoom_level));
111130
v8::Handle<v8::Value> argv[] = {val, v8::String::New("zoom"), args };
112131

113132
node::MakeCallback(objects_registry, "handleEvent", 3, argv);
114133
}
134+
135+
void Dispatcher::DidFinishDocumentLoad(WebKit::WebFrame* frame) {
136+
WebKit::WebView* web_view = render_view()->GetWebView();
137+
138+
if (!web_view)
139+
return;
140+
v8::Context::Scope cscope (web_view->mainFrame()->mainWorldScriptContext());
141+
142+
v8::Handle<v8::Value> val = GetWindowId(web_view->mainFrame());
143+
if (val->IsNull() || val->IsUndefined())
144+
return;
145+
146+
v8::Handle<v8::Object> objects_registry = GetObjectRegistry();
147+
if (objects_registry->IsUndefined())
148+
return;
149+
150+
v8::Local<v8::Array> args = v8::Array::New();
151+
v8::Handle<v8::Value> element = v8::Null();
152+
WebCore::Frame* core_frame = WebKit::toWebFrameImpl(frame)->frame();
153+
if (core_frame->ownerElement()) {
154+
element = WebCore::toV8((WebCore::HTMLElement*)core_frame->ownerElement(),
155+
frame->mainWorldScriptContext()->Global(),
156+
frame->mainWorldScriptContext()->GetIsolate());
157+
}
158+
args->Set(0, element);
159+
v8::Handle<v8::Value> argv[] = {val, v8::String::New("document-end"), args };
160+
161+
node::MakeCallback(objects_registry, "handleEvent", 3, argv);
162+
}
163+
115164
} // namespace nwapi

src/api/dispatcher.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
#include "base/basictypes.h"
2525
#include "content/public/renderer/render_view_observer.h"
26+
#include <v8.h>
2627

2728
namespace base {
2829
class ListValue;
@@ -39,11 +40,15 @@ class Dispatcher : public content::RenderViewObserver {
3940
explicit Dispatcher(content::RenderView* render_view);
4041
virtual ~Dispatcher();
4142

43+
static v8::Handle<v8::Object> GetObjectRegistry();
44+
static v8::Handle<v8::Value> GetWindowId(WebKit::WebFrame* frame);
45+
4246
private:
4347
// RenderViewObserver implementation.
4448
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
4549
virtual void DraggableRegionsChanged(WebKit::WebFrame* frame) OVERRIDE;
4650
virtual void ZoomLevelChanged() OVERRIDE;
51+
virtual void DidFinishDocumentLoad(WebKit::WebFrame* frame) OVERRIDE;
4752

4853
void OnEvent(int object_id,
4954
std::string event,

0 commit comments

Comments
 (0)