| 
									
										
										
										
											2019-10-18 09:31:29 +09:00
										 |  |  | // Copyright 2019 The Chromium Authors. All rights reserved.
 | 
					
						
							|  |  |  | // Use of this source code is governed by a BSD-style license that can be
 | 
					
						
							|  |  |  | // found in the LICENSE.chromium file.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef SHELL_COMMON_GIN_HELPER_ARGUMENTS_H_
 | 
					
						
							|  |  |  | #define SHELL_COMMON_GIN_HELPER_ARGUMENTS_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 16:05:40 +09:00
										 |  |  | #include "gin/arguments.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-18 09:31:29 +09:00
										 |  |  | namespace gin_helper { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Provides additional APIs to the gin::Arguments class.
 | 
					
						
							|  |  |  | class Arguments : public gin::Arguments { | 
					
						
							|  |  |  |  public: | 
					
						
							|  |  |  |   // Get the next argument, if conversion to T fails then state is unchanged.
 | 
					
						
							|  |  |  |   //
 | 
					
						
							|  |  |  |   // This is difference from gin::Arguments::GetNext which always advances the
 | 
					
						
							|  |  |  |   // |next_| counter no matter whether the conversion succeeds.
 | 
					
						
							|  |  |  |   template <typename T> | 
					
						
							|  |  |  |   bool GetNext(T* out) { | 
					
						
							|  |  |  |     v8::Local<v8::Value> val = PeekNext(); | 
					
						
							|  |  |  |     if (val.IsEmpty()) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     if (!gin::ConvertFromV8(isolate(), val, out)) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     Skip(); | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-21 16:05:40 +09:00
										 |  |  |   // Gin always returns true when converting V8 value to boolean, we do not want
 | 
					
						
							|  |  |  |   // this behavior when parsing parameters.
 | 
					
						
							|  |  |  |   bool GetNext(bool* out) { | 
					
						
							|  |  |  |     v8::Local<v8::Value> val = PeekNext(); | 
					
						
							|  |  |  |     if (val.IsEmpty() || !val->IsBoolean()) | 
					
						
							|  |  |  |       return false; | 
					
						
							|  |  |  |     *out = val->BooleanValue(isolate()); | 
					
						
							|  |  |  |     Skip(); | 
					
						
							|  |  |  |     return true; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Throw error with custom error message.
 | 
					
						
							|  |  |  |   void ThrowError() const; | 
					
						
							|  |  |  |   void ThrowError(base::StringPiece message) const; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-18 09:31:29 +09:00
										 |  |  |  private: | 
					
						
							|  |  |  |   // MUST NOT ADD ANY DATA MEMBER.
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // namespace gin_helper
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif  // SHELL_COMMON_GIN_HELPER_ARGUMENTS_H_
 |