Skip to content

Commit 0ea0956

Browse files
committed
add 'new-win-policy' event
Fix nwjs#1375 nwjs#1290
1 parent 600505d commit 0ea0956

4 files changed

Lines changed: 80 additions & 1 deletion

File tree

src/api/dispatcher.cc

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,63 @@ void Dispatcher::documentCallback(const char* ev, WebKit::WebFrame* frame) {
172172
frame->mainWorldScriptContext()->GetIsolate());
173173
}
174174
args->Set(0, element);
175-
v8::Handle<v8::Value> argv[] = {val, v8::String::New(ev), args };
175+
v8::Handle<v8::Value> argv[] = {val, v8_str(ev), args };
176176

177177
node::MakeCallback(objects_registry, "handleEvent", 3, argv);
178178
}
179179

180+
void Dispatcher::willHandleNavigationPolicy(
181+
content::RenderView* rv,
182+
WebKit::WebFrame* frame,
183+
const WebKit::WebURLRequest& request,
184+
WebKit::WebNavigationPolicy* policy) {
185+
186+
WebKit::WebView* web_view = rv->GetWebView();
187+
188+
if (!web_view)
189+
return;
190+
191+
v8::Context::Scope cscope (web_view->mainFrame()->mainWorldScriptContext());
192+
193+
v8::Handle<v8::Value> id_val = nwapi::Dispatcher::GetWindowId(web_view->mainFrame());
194+
if (id_val->IsNull() || id_val->IsUndefined())
195+
return;
196+
197+
v8::Handle<v8::Object> objects_registry = nwapi::Dispatcher::GetObjectRegistry();
198+
if (objects_registry->IsUndefined())
199+
return;
200+
201+
v8::Local<v8::Array> args = v8::Array::New();
202+
v8::Handle<v8::Value> element = v8::Null();
203+
v8::Handle<v8::Object> policy_obj = v8::Object::New();
204+
205+
WebCore::Frame* core_frame = WebKit::toWebFrameImpl(frame)->frame();
206+
if (core_frame->ownerElement()) {
207+
element = WebCore::toV8((WebCore::HTMLElement*)core_frame->ownerElement(),
208+
frame->mainWorldScriptContext()->Global(),
209+
frame->mainWorldScriptContext()->GetIsolate());
210+
}
211+
args->Set(0, element);
212+
args->Set(1, v8_str(request.url().string().utf8().c_str()));
213+
args->Set(2, policy_obj);
214+
215+
v8::Handle<v8::Value> argv[] = {id_val, v8_str("new-win-policy"), args };
216+
217+
node::MakeCallback(objects_registry, "handleEvent", 3, argv);
218+
v8::Local<v8::Value> val = policy_obj->Get(v8_str("val"));
219+
if (!val->IsString())
220+
return;
221+
v8::String::Utf8Value policy_str(val);
222+
if (!strcmp(*policy_str, "ignore"))
223+
*policy = WebKit::WebNavigationPolicyIgnore;
224+
else if (!strcmp(*policy_str, "download"))
225+
*policy = WebKit::WebNavigationPolicyDownload;
226+
else if (!strcmp(*policy_str, "current"))
227+
*policy = WebKit::WebNavigationPolicyCurrentTab;
228+
else if (!strcmp(*policy_str, "new-window"))
229+
*policy = WebKit::WebNavigationPolicyNewWindow;
230+
else if (!strcmp(*policy_str, "new-popup"))
231+
*policy = WebKit::WebNavigationPolicyNewPopup;
232+
}
233+
180234
} // namespace nwapi

src/api/dispatcher.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,20 @@
2323

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

2829
namespace base {
2930
class ListValue;
3031
}
3132

33+
namespace content {
34+
class RenderView;
35+
}
36+
3237
namespace WebKit {
3338
class WebFrame;
39+
class WebURLRequest;
3440
}
3541

3642
namespace nwapi {
@@ -42,6 +48,11 @@ class Dispatcher : public content::RenderViewObserver {
4248

4349
static v8::Handle<v8::Object> GetObjectRegistry();
4450
static v8::Handle<v8::Value> GetWindowId(WebKit::WebFrame* frame);
51+
static void willHandleNavigationPolicy(
52+
content::RenderView* rv,
53+
WebKit::WebFrame* frame,
54+
const WebKit::WebURLRequest& request,
55+
WebKit::WebNavigationPolicy* policy);
4556

4657
private:
4758
// RenderViewObserver implementation.

src/renderer/shell_content_renderer_client.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,4 +414,13 @@ void ShellContentRendererClient::UninstallNodeSymbols(
414414
}
415415
}
416416

417+
void ShellContentRendererClient::willHandleNavigationPolicy(
418+
RenderView* rv,
419+
WebKit::WebFrame* frame,
420+
const WebKit::WebURLRequest& request,
421+
WebKit::WebNavigationPolicy* policy) {
422+
423+
nwapi::Dispatcher::willHandleNavigationPolicy(rv, frame, request, policy);
424+
}
425+
417426
} // namespace content

src/renderer/shell_content_renderer_client.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ class ShellContentRendererClient : public ContentRendererClient {
5151
virtual bool WillSetSecurityToken(WebKit::WebFrame* frame,
5252
v8::Handle<v8::Context>) OVERRIDE;
5353

54+
virtual void willHandleNavigationPolicy(RenderView* rv,
55+
WebKit::WebFrame* frame,
56+
const WebKit::WebURLRequest& request,
57+
WebKit::WebNavigationPolicy* policy) OVERRIDE;
58+
5459
private:
5560
scoped_ptr<ShellRenderProcessObserver> shell_observer_;
5661
scoped_ptr<nwapi::WindowBindings> window_bindings_;

0 commit comments

Comments
 (0)